Compare commits

..

25 Commits

Author SHA1 Message Date
Evgeny Poberezkin 23ca3dd665 5.0.0-beta.2 2023-04-19 11:59:39 +01:00
Evgeny Poberezkin 2caff25fa2 android: revert to using gallery for images and videos (#2209)
* core: revert to using gallery for images and videos

* remove comment
2023-04-19 11:07:14 +01:00
Evgeny Poberezkin 37f835be8c mobile: remove XFTP toggle (#2208)
* mobile: remove XFTP toggle

* ios: remove unused string

* android: remove unused strings
2023-04-19 09:41:01 +01:00
Evgeny Poberezkin a6c1f2f776 5.0.0-beta.1: Android 115, iOS 142 2023-04-19 00:47:34 +01:00
Stanislav Dmitrenko acf0dfc38c android: alerts + dropdown menus (#2199)
* android: alerts + dropdown menus

* colors

* align

* paddings

* colors

* complete alerts

---------

Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com>
2023-04-19 00:17:28 +01:00
Evgeny Poberezkin 67f13831ce mobile: translations (#2207)
* Translated using Weblate (German)

Currently translated at 97.8% (1101 of 1125 strings)

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

* Translated using Weblate (Russian)

Currently translated at 100.0% (1125 of 1125 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 97.6% (1018 of 1043 strings)

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

* Translated using Weblate (Russian)

Currently translated at 100.0% (1043 of 1043 strings)

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

* Translated using Weblate (French)

Currently translated at 99.2% (1035 of 1043 strings)

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

* Translated using Weblate (Italian)

Currently translated at 99.2% (1035 of 1043 strings)

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

* Translated using Weblate (Chinese (Simplified))

Currently translated at 97.6% (1018 of 1043 strings)

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

* Translated using Weblate (Spanish)

Currently translated at 97.6% (1018 of 1043 strings)

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1125 of 1125 strings)

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1043 of 1043 strings)

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1043 of 1043 strings)

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

* Translated using Weblate (Czech)

Currently translated at 97.6% (1018 of 1043 strings)

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

* Translated using Weblate (Polish)

Currently translated at 100.0% (1125 of 1125 strings)

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

* Translated using Weblate (Polish)

Currently translated at 100.0% (1043 of 1043 strings)

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

* Translated using Weblate (Polish)

Currently translated at 100.0% (1043 of 1043 strings)

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

* ios: import/export localizations

---------

Co-authored-by: mlanp <github@lang.xyz>
Co-authored-by: John m <jvanmanen@gmail.com>
Co-authored-by: B.O.S.S <BxOxSxS@protonmail.com>
2023-04-18 21:30:18 +01:00
Evgeny Poberezkin d50e65af20 core: 5.0.0.1 2023-04-18 21:04:34 +01:00
Evgeny Poberezkin b8d74b74a6 website: translations (#2206)
* Translated using Weblate (Arabic)

Currently translated at 100.0% (211 of 211 strings)

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

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 3.3% (7 of 211 strings)

Translation: SimpleX Chat/SimpleX Chat website
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/pt_BR/
2023-04-18 18:52:48 +01:00
Evgeny Poberezkin 802a28d759 mobile: translations (#2204)
* Translated using Weblate (Italian)

Currently translated at 100.0% (1092 of 1092 strings)

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

* Translated using Weblate (Spanish)

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

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1092 of 1092 strings)

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1014 of 1014 strings)

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

* Translated using Weblate (Polish)

Currently translated at 100.0% (1092 of 1092 strings)

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

* Translated using Weblate (Czech)

Currently translated at 99.8% (1089 of 1091 strings)

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

* Translated using Weblate (Polish)

Currently translated at 100.0% (1091 of 1091 strings)

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

* Translated using Weblate (Polish)

Currently translated at 100.0% (1013 of 1013 strings)

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

* Translated using Weblate (German)

Currently translated at 95.6% (1044 of 1091 strings)

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

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (1091 of 1091 strings)

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

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (1013 of 1013 strings)

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

* Translated using Weblate (Spanish)

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

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1091 of 1091 strings)

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1013 of 1013 strings)

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

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (1091 of 1091 strings)

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

* Translated using Weblate (Korean)

Currently translated at 78.5% (857 of 1091 strings)

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

* Translated using Weblate (Spanish)

Currently translated at 98.8% (1090 of 1103 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% (1013 of 1013 strings)

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

* Translated using Weblate (German)

Currently translated at 98.0% (1082 of 1103 strings)

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

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (1103 of 1103 strings)

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

* Translated using Weblate (Spanish)

Currently translated at 98.8% (1090 of 1103 strings)

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

* Translated using Weblate (Polish)

Currently translated at 100.0% (1103 of 1103 strings)

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

* Translated using Weblate (German)

Currently translated at 100.0% (1101 of 1101 strings)

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

* Translated using Weblate (German)

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

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

* Translated using Weblate (Spanish)

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

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

* Translated using Weblate (Czech)

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

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

* Translated using Weblate (Hindi)

Currently translated at 16.2% (179 of 1101 strings)

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1101 of 1101 strings)

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

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (1102 of 1102 strings)

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1102 of 1102 strings)

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

* Translated using Weblate (Hindi)

Currently translated at 16.3% (180 of 1102 strings)

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1119 of 1119 strings)

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

* Translated using Weblate (French)

Currently translated at 99.6% (1115 of 1119 strings)

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

* Translated using Weblate (French)

Currently translated at 100.0% (1013 of 1013 strings)

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

* Translated using Weblate (Italian)

Currently translated at 100.0% (1119 of 1119 strings)

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

* Translated using Weblate (Polish)

Currently translated at 99.2% (1111 of 1119 strings)

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

* Translated using Weblate (French)

Currently translated at 100.0% (1119 of 1119 strings)

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

* Translated using Weblate (Polish)

Currently translated at 100.0% (1119 of 1119 strings)

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

* ios: import localizations

* ios: re-export localizations

---------

Co-authored-by: random r <epsilin@yopmail.com>
Co-authored-by: No name <CertainBot@users.noreply.hosted.weblate.org>
Co-authored-by: John m <jvanmanen@gmail.com>
Co-authored-by: B.O.S.S <BxOxSxS@protonmail.com>
Co-authored-by: zenobit <zen@osowoso.xyz>
Co-authored-by: sith-on-mars <groguko36@pm.me>
Co-authored-by: mf <work.j6nnu@slmail.me>
Co-authored-by: 5olivetree <5olivetree+github.com@mailbox.org>
Co-authored-by: mlanp <github@lang.xyz>
Co-authored-by: Ram <airavatam@tutanota.com>
Co-authored-by: Ophiushi <41908476+ishi-sama@users.noreply.github.com>
2023-04-18 18:41:49 +01:00
Evgeny Poberezkin c85d43b349 ios: export localizations 2023-04-18 16:59:51 +01:00
spaced4ndy 64ad491197 mobile: what's new in 5.0 (#2200)
* mobile: what's new in 5.0

* update texts

* update

---------

Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com>
2023-04-18 16:54:56 +01:00
spaced4ndy ddd8e719ef core, ios: don't send/receive XFTP files in NSE (#2202) 2023-04-18 19:43:16 +04:00
spaced4ndy e51f7a51cc core: prohibit SMP file handshake for XFTP files on sender side, except for images and voice messages (#2201) 2023-04-18 18:51:14 +04:00
Stanislav Dmitrenko e66f5d488b android: more enhancements to layouts (#2196)
* android: more enhancements to layouts

* changes

* unused code

* unused code
2023-04-18 11:11:00 +01:00
spaced4ndy b386cc83a7 core, mobile: enable xftp by default (#2198) 2023-04-18 13:49:09 +04:00
spaced4ndy 09481e09b6 core, mobile: file error statuses, cancel sent file (#2193) 2023-04-18 12:48:36 +04:00
Evgeny Poberezkin 6913bf1a46 mobile: Calls chat preference (#2195)
* ios: add calls to chat preferences

* android: types and strings for Calls preference

* android: UI for Calls preference
2023-04-18 09:29:49 +01:00
Stanislav Dmitrenko e6c87ff00b android: profiles UI (#2194)
* android: profiles UI

* reverted color change

* changes

* update color, padding

* colors changes and error check

* focused field color

* refactor

* focus

* layout

* profile editor

* centered layout

* bottom paddings

---------

Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com>
2023-04-17 22:10:42 +01:00
Evgeny Poberezkin 5f41cf3c52 core: change default for Disappearing Messages to "allow", mobile: support disabling without prohibiting (#2192)
* core: change default for Disappearing Messages to "allow", mobile: support disabling without prohibiting

* fix tests

* disable tests back in CI

* fixed tests 2

* remove enable

Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>

---------

Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>
2023-04-17 18:13:10 +01:00
spaced4ndy 9edbe2e589 core: fix sending file to empty group (#2191) 2023-04-17 15:33:15 +04:00
Evgeny Poberezkin b6876712f0 core: chat preference for audio/video calls (#2188)
* core: chat preference for audio/video calls

* correction

Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>

* clean up

---------

Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>
2023-04-17 10:18:04 +01:00
Evgeny Poberezkin 5b4c183466 core: do not create decryption error chat items for earlier messages (#2189)
* core: do not create decryption error chat items for earlier messages

* do not report earlier error, mobile items, fix tests
2023-04-16 18:30:25 +01:00
Evgeny Poberezkin 393238f47c android: change UInt type 2023-04-16 15:56:12 +01:00
Evgeny Poberezkin aea526f69d core: add chat items to indicate decryption failures due to ratchets being out of sync (#2175)
* core: add chat items to indicate decryption failures due to ratchets being out of sync

* show ratchet errors in chat items, show all integrity errors

* show decryption errors, tests

* ios: chat items, remove item for duplicate messages

* android: decryption errors chat items

* eol
2023-04-16 11:35:45 +01:00
Evgeny Poberezkin 13cf1cc004 ios: mute groups instantly when notifications are disabled (#2187) 2023-04-14 22:54:05 +01:00
126 changed files with 5775 additions and 1969 deletions
+2 -2
View File
@@ -11,8 +11,8 @@ android {
applicationId "chat.simplex.app"
minSdk 26
targetSdk 32
versionCode 114
versionName "5.0-beta.0"
versionCode 116
versionName "5.0-beta.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
@@ -729,6 +729,7 @@ data class Contact(
ChatFeature.TimedMessages -> mergedPreferences.timedMessages.enabled.forUser
ChatFeature.FullDelete -> mergedPreferences.fullDelete.enabled.forUser
ChatFeature.Voice -> mergedPreferences.voice.enabled.forUser
ChatFeature.Calls -> mergedPreferences.calls.enabled.forUser
}
override val timedMessagesTTL: Int? get() = with(mergedPreferences.timedMessages) { if (enabled.forUser) userPreference.pref.ttl else null }
override val displayName get() = localAlias.ifEmpty { profile.displayName }
@@ -747,12 +748,14 @@ data class Contact(
ChatFeature.TimedMessages -> mergedPreferences.timedMessages.contactPreference.allow != FeatureAllowed.NO
ChatFeature.FullDelete -> mergedPreferences.fullDelete.contactPreference.allow != FeatureAllowed.NO
ChatFeature.Voice -> mergedPreferences.voice.contactPreference.allow != FeatureAllowed.NO
ChatFeature.Calls -> mergedPreferences.calls.contactPreference.allow != FeatureAllowed.NO
}
fun userAllowsFeature(feature: ChatFeature): Boolean = when (feature) {
ChatFeature.TimedMessages -> mergedPreferences.timedMessages.userPreference.pref.allow != FeatureAllowed.NO
ChatFeature.FullDelete -> mergedPreferences.fullDelete.userPreference.pref.allow != FeatureAllowed.NO
ChatFeature.Voice -> mergedPreferences.voice.userPreference.pref.allow != FeatureAllowed.NO
ChatFeature.Calls -> mergedPreferences.calls.userPreference.pref.allow != FeatureAllowed.NO
}
companion object {
@@ -882,6 +885,7 @@ data class GroupInfo (
ChatFeature.TimedMessages -> fullGroupPreferences.timedMessages.on
ChatFeature.FullDelete -> fullGroupPreferences.fullDelete.on
ChatFeature.Voice -> fullGroupPreferences.voice.on
ChatFeature.Calls -> false
}
override val timedMessagesTTL: Int? get() = with(fullGroupPreferences.timedMessages) { if (on) ttl else null }
override val displayName get() = groupProfile.displayName
@@ -1308,6 +1312,7 @@ data class ChatItem (
is CIContent.SndCall -> showNtfDir
is CIContent.RcvCall -> false // notification is shown on CallInvitation instead
is CIContent.RcvIntegrityError -> showNtfDir
is CIContent.RcvDecryptionError -> showNtfDir
is CIContent.RcvGroupInvitation -> showNtfDir
is CIContent.SndGroupInvitation -> showNtfDir
is CIContent.RcvGroupEventContent -> when (content.rcvGroupEvent) {
@@ -1465,10 +1470,10 @@ data class ChatItem (
file = null
)
fun invalidJSON(json: String): ChatItem =
fun invalidJSON(chatDir: CIDirection?, meta: CIMeta?, json: String): ChatItem =
ChatItem(
chatDir = CIDirection.DirectSnd(),
meta = CIMeta.invalidJSON(),
chatDir = chatDir ?: CIDirection.DirectSnd(),
meta = meta ?: CIMeta.invalidJSON(),
content = CIContent.InvalidJSON(json),
quotedItem = null,
file = null
@@ -1611,6 +1616,7 @@ sealed class CIContent: ItemContent {
@Serializable @SerialName("sndCall") class SndCall(val status: CICallStatus, val duration: Int): CIContent() { override val msgContent: MsgContent? get() = null }
@Serializable @SerialName("rcvCall") class RcvCall(val status: CICallStatus, val duration: Int): CIContent() { override val msgContent: MsgContent? get() = null }
@Serializable @SerialName("rcvIntegrityError") class RcvIntegrityError(val msgError: MsgErrorType): CIContent() { override val msgContent: MsgContent? get() = null }
@Serializable @SerialName("rcvDecryptionError") class RcvDecryptionError(val msgDecryptError: MsgDecryptError, val msgCount: UInt): CIContent() { override val msgContent: MsgContent? get() = null }
@Serializable @SerialName("rcvGroupInvitation") class RcvGroupInvitation(val groupInvitation: CIGroupInvitation, val memberRole: GroupMemberRole): CIContent() { override val msgContent: MsgContent? get() = null }
@Serializable @SerialName("sndGroupInvitation") class SndGroupInvitation(val groupInvitation: CIGroupInvitation, val memberRole: GroupMemberRole): CIContent() { override val msgContent: MsgContent? get() = null }
@Serializable @SerialName("rcvGroupEvent") class RcvGroupEventContent(val rcvGroupEvent: RcvGroupEvent): CIContent() { override val msgContent: MsgContent? get() = null }
@@ -1637,6 +1643,7 @@ sealed class CIContent: ItemContent {
is SndCall -> status.text(duration)
is RcvCall -> status.text(duration)
is RcvIntegrityError -> msgError.text
is RcvDecryptionError -> msgDecryptError.text
is RcvGroupInvitation -> groupInvitation.text
is SndGroupInvitation -> groupInvitation.text
is RcvGroupEventContent -> rcvGroupEvent.text
@@ -1675,6 +1682,17 @@ sealed class CIContent: ItemContent {
}
}
@Serializable
enum class MsgDecryptError {
@SerialName("ratchetHeader") RatchetHeader,
@SerialName("tooManySkipped") TooManySkipped;
val text: String get() = when (this) {
RatchetHeader -> generalGetString(R.string.decryption_error)
TooManySkipped -> generalGetString(R.string.decryption_error)
}
}
@Serializable
class CIQuote (
val chatDir: CIDirection? = null,
@@ -1720,23 +1738,32 @@ class CIFile(
is CIFileStatus.SndTransfer -> true
is CIFileStatus.SndComplete -> true
is CIFileStatus.SndCancelled -> true
is CIFileStatus.SndError -> true
is CIFileStatus.RcvInvitation -> false
is CIFileStatus.RcvAccepted -> false
is CIFileStatus.RcvTransfer -> false
is CIFileStatus.RcvCancelled -> false
is CIFileStatus.RcvComplete -> true
is CIFileStatus.RcvError -> false
}
val cancellable: Boolean = when (fileStatus) {
is CIFileStatus.SndStored -> fileProtocol != FileProtocol.XFTP // TODO true - enable when XFTP send supports cancel
is CIFileStatus.SndTransfer -> fileProtocol != FileProtocol.XFTP // TODO true
is CIFileStatus.SndComplete -> false
is CIFileStatus.SndCancelled -> false
is CIFileStatus.RcvInvitation -> false
is CIFileStatus.RcvAccepted -> true
is CIFileStatus.RcvTransfer -> true
is CIFileStatus.RcvCancelled -> false
is CIFileStatus.RcvComplete -> false
val cancelAction: CancelAction? = when (fileStatus) {
is CIFileStatus.SndStored -> sndCancelAction
is CIFileStatus.SndTransfer -> sndCancelAction
is CIFileStatus.SndComplete ->
if (fileProtocol == FileProtocol.XFTP) {
revokeCancelAction
} else {
null
}
is CIFileStatus.SndCancelled -> null
is CIFileStatus.SndError -> null
is CIFileStatus.RcvInvitation -> null
is CIFileStatus.RcvAccepted -> rcvCancelAction
is CIFileStatus.RcvTransfer -> rcvCancelAction
is CIFileStatus.RcvCancelled -> null
is CIFileStatus.RcvComplete -> null
is CIFileStatus.RcvError -> null
}
companion object {
@@ -1751,6 +1778,44 @@ class CIFile(
}
}
@Serializable
class CancelAction(
val uiActionId: Int,
val alert: AlertInfo
)
@Serializable
class AlertInfo(
val titleId: Int,
val messageId: Int,
val confirmId: Int
)
private val sndCancelAction: CancelAction = CancelAction(
uiActionId = R.string.stop_file__action,
alert = AlertInfo(
titleId = R.string.stop_snd_file__title,
messageId = R.string.stop_snd_file__message,
confirmId = R.string.stop_file__confirm
)
)
private val revokeCancelAction: CancelAction = CancelAction(
uiActionId = R.string.revoke_file__action,
alert = AlertInfo(
titleId = R.string.revoke_file__title,
messageId = R.string.revoke_file__message,
confirmId = R.string.revoke_file__confirm
)
)
private val rcvCancelAction: CancelAction = CancelAction(
uiActionId = R.string.stop_file__action,
alert = AlertInfo(
titleId = R.string.stop_rcv_file__title,
messageId = R.string.stop_rcv_file__message,
confirmId = R.string.stop_file__confirm
)
)
@Serializable
enum class FileProtocol {
@SerialName("smp") SMP,
@@ -1763,11 +1828,13 @@ sealed class CIFileStatus {
@Serializable @SerialName("sndTransfer") class SndTransfer(val sndProgress: Long, val sndTotal: Long): CIFileStatus()
@Serializable @SerialName("sndComplete") object SndComplete: CIFileStatus()
@Serializable @SerialName("sndCancelled") object SndCancelled: CIFileStatus()
@Serializable @SerialName("sndError") object SndError: CIFileStatus()
@Serializable @SerialName("rcvInvitation") object RcvInvitation: CIFileStatus()
@Serializable @SerialName("rcvAccepted") object RcvAccepted: CIFileStatus()
@Serializable @SerialName("rcvTransfer") class RcvTransfer(val rcvProgress: Long, val rcvTotal: Long): CIFileStatus()
@Serializable @SerialName("rcvComplete") object RcvComplete: CIFileStatus()
@Serializable @SerialName("rcvCancelled") object RcvCancelled: CIFileStatus()
@Serializable @SerialName("rcvError") object RcvError: CIFileStatus()
}
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@@ -153,8 +153,6 @@ class AppPreferences(val context: Context) {
val whatsNewVersion = mkStrPreference(SHARED_PREFS_WHATS_NEW_VERSION, null)
val xftpSendEnabled = mkBoolPreference(SHARED_PREFS_XFTP_SEND_ENABLED, false)
private fun mkIntPreference(prefName: String, default: Int) =
SharedPreference(
get = fun() = sharedPreferences.getInt(prefName, default),
@@ -264,7 +262,6 @@ class AppPreferences(val context: Context) {
private const val SHARED_PREFS_CURRENT_THEME = "CurrentTheme"
private const val SHARED_PREFS_PRIMARY_COLOR = "PrimaryColor"
private const val SHARED_PREFS_WHATS_NEW_VERSION = "WhatsNewVersion"
private const val SHARED_PREFS_XFTP_SEND_ENABLED = "XFTPSendEnabled"
}
}
@@ -1442,6 +1439,10 @@ open class ChatController(var ctrl: ChatCtrl?, val ntfManager: NtfManager, val a
}
is CR.RcvFileProgressXFTP ->
chatItemSimpleUpdate(r.user, r.chatItem)
is CR.RcvFileError -> {
chatItemSimpleUpdate(r.user, r.chatItem)
cleanupFile(r.chatItem)
}
is CR.SndFileStart ->
chatItemSimpleUpdate(r.user, r.chatItem)
is CR.SndFileComplete -> {
@@ -1458,6 +1459,10 @@ open class ChatController(var ctrl: ChatCtrl?, val ntfManager: NtfManager, val a
chatItemSimpleUpdate(r.user, r.chatItem)
cleanupFile(r.chatItem)
}
is CR.SndFileError -> {
chatItemSimpleUpdate(r.user, r.chatItem)
cleanupFile(r.chatItem)
}
is CR.CallInvitation -> {
chatModel.callManager.reportNewIncomingCall(r.callInvitation)
}
@@ -1736,9 +1741,8 @@ open class ChatController(var ctrl: ChatCtrl?, val ntfManager: NtfManager, val a
}
}
fun getXFTPCfg(): XFTPFileConfig? {
val prefXFTPSendEnabled = appPrefs.xftpSendEnabled.get()
return if (prefXFTPSendEnabled) XFTPFileConfig(minFileSize = 0) else null
fun getXFTPCfg(): XFTPFileConfig {
return XFTPFileConfig(minFileSize = 0)
}
fun getNetCfg(): NetCfg {
@@ -1911,7 +1915,7 @@ sealed class CC {
is ApiMuteUser -> "/_mute user $userId"
is ApiUnmuteUser -> "/_unmute user $userId"
is ApiDeleteUser -> "/_delete user $userId del_smp=${onOff(delSMPQueues)}${maybePwd(viewPwd)}"
is StartChat -> "/_start subscribe=on expire=${onOff(expire)}"
is StartChat -> "/_start subscribe=on expire=${onOff(expire)} xftp=on"
is ApiStopChat -> "/_stop"
is SetTempFolder -> "/_temp_folder $tempFolder"
is SetFilesFolder -> "/_files_folder $filesFolder"
@@ -2410,14 +2414,16 @@ data class FullChatPreferences(
val timedMessages: TimedMessagesPreference,
val fullDelete: SimpleChatPreference,
val voice: SimpleChatPreference,
val calls: SimpleChatPreference,
) {
fun toPreferences(): ChatPreferences = ChatPreferences(timedMessages = timedMessages, fullDelete = fullDelete, voice = voice)
fun toPreferences(): ChatPreferences = ChatPreferences(timedMessages = timedMessages, fullDelete = fullDelete, voice = voice, calls = calls)
companion object {
val sampleData = FullChatPreferences(
timedMessages = TimedMessagesPreference(allow = FeatureAllowed.NO),
fullDelete = SimpleChatPreference(allow = FeatureAllowed.NO),
voice = SimpleChatPreference(allow = FeatureAllowed.YES)
voice = SimpleChatPreference(allow = FeatureAllowed.YES),
calls = SimpleChatPreference(allow = FeatureAllowed.YES),
)
}
}
@@ -2427,19 +2433,22 @@ data class ChatPreferences(
val timedMessages: TimedMessagesPreference?,
val fullDelete: SimpleChatPreference?,
val voice: SimpleChatPreference?,
val calls: SimpleChatPreference?,
) {
fun setAllowed(feature: ChatFeature, allowed: FeatureAllowed = FeatureAllowed.YES, param: Int? = null): ChatPreferences =
when (feature) {
ChatFeature.TimedMessages -> this.copy(timedMessages = TimedMessagesPreference(allow = allowed, ttl = param ?: this.timedMessages?.ttl))
ChatFeature.FullDelete -> this.copy(fullDelete = SimpleChatPreference(allow = allowed))
ChatFeature.Voice -> this.copy(voice = SimpleChatPreference(allow = allowed))
ChatFeature.Calls -> this.copy(calls = SimpleChatPreference(allow = allowed))
}
companion object {
val sampleData = ChatPreferences(
timedMessages = TimedMessagesPreference(allow = FeatureAllowed.NO),
fullDelete = SimpleChatPreference(allow = FeatureAllowed.NO),
voice = SimpleChatPreference(allow = FeatureAllowed.YES)
voice = SimpleChatPreference(allow = FeatureAllowed.YES),
calls = SimpleChatPreference(allow = FeatureAllowed.YES),
)
}
}
@@ -2460,7 +2469,7 @@ data class TimedMessagesPreference(
): ChatPreference {
companion object {
val ttlValues: List<Int?>
get() = listOf(30, 300, 3600, 8 * 3600, 86400, 7 * 86400, 30 * 86400)
get() = listOf(30, 300, 3600, 8 * 3600, 86400, 7 * 86400, 30 * 86400, null)
fun ttlText(ttl: Int?): String {
ttl ?: return generalGetString(R.string.feature_off)
@@ -2511,11 +2520,13 @@ data class ContactUserPreferences(
val timedMessages: ContactUserPreferenceTimed,
val fullDelete: ContactUserPreference,
val voice: ContactUserPreference,
val calls: ContactUserPreference,
) {
fun toPreferences(): ChatPreferences = ChatPreferences(
timedMessages = timedMessages.userPreference.pref,
fullDelete = fullDelete.userPreference.pref,
voice = voice.userPreference.pref
voice = voice.userPreference.pref,
calls = calls.userPreference.pref
)
companion object {
@@ -2534,7 +2545,12 @@ data class ContactUserPreferences(
enabled = FeatureEnabled(forUser = true, forContact = true),
userPreference = ContactUserPref.User(preference = SimpleChatPreference(allow = FeatureAllowed.YES)),
contactPreference = SimpleChatPreference(allow = FeatureAllowed.YES)
)
),
calls = ContactUserPreference(
enabled = FeatureEnabled(forUser = true, forContact = true),
userPreference = ContactUserPref.User(preference = SimpleChatPreference(allow = FeatureAllowed.YES)),
contactPreference = SimpleChatPreference(allow = FeatureAllowed.YES)
),
)
}
}
@@ -2593,12 +2609,6 @@ sealed class ContactUserPref {
@Serializable @SerialName("user") data class User(val preference: SimpleChatPreference): ContactUserPref() {
override val pref get() = preference
}
val contactOverride: SimpleChatPreference?
get() = when(this) {
is Contact -> pref
is User -> null
}
}
@Serializable
@@ -2613,12 +2623,6 @@ sealed class ContactUserPrefTimed {
@Serializable @SerialName("user") data class User(val preference: TimedMessagesPreference): ContactUserPrefTimed() {
override val pref get() = preference
}
val contactOverride: TimedMessagesPreference?
get() = when(this) {
is Contact -> pref
is User -> null
}
}
interface Feature {
@@ -2632,7 +2636,8 @@ interface Feature {
enum class ChatFeature: Feature {
@SerialName("timedMessages") TimedMessages,
@SerialName("fullDelete") FullDelete,
@SerialName("voice") Voice;
@SerialName("voice") Voice,
@SerialName("calls") Calls;
val asymmetric: Boolean get() = when (this) {
TimedMessages -> false
@@ -2649,6 +2654,7 @@ enum class ChatFeature: Feature {
TimedMessages -> generalGetString(R.string.timed_messages)
FullDelete -> generalGetString(R.string.full_deletion)
Voice -> generalGetString(R.string.voice_messages)
Calls -> generalGetString(R.string.audio_video_calls)
}
val icon: ImageVector
@@ -2656,6 +2662,7 @@ enum class ChatFeature: Feature {
TimedMessages -> Icons.Outlined.Timer
FullDelete -> Icons.Outlined.DeleteForever
Voice -> Icons.Outlined.KeyboardVoice
Calls -> Icons.Outlined.Phone
}
override val iconFilled: ImageVector
@@ -2663,6 +2670,7 @@ enum class ChatFeature: Feature {
TimedMessages -> Icons.Filled.Timer
FullDelete -> Icons.Filled.DeleteForever
Voice -> Icons.Filled.KeyboardVoice
Calls -> Icons.Filled.Phone
}
fun allowDescription(allowed: FeatureAllowed): String =
@@ -2682,6 +2690,11 @@ enum class ChatFeature: Feature {
FeatureAllowed.YES -> generalGetString(R.string.allow_voice_messages_only_if)
FeatureAllowed.NO -> generalGetString(R.string.prohibit_sending_voice_messages)
}
Calls -> when (allowed) {
FeatureAllowed.ALWAYS -> generalGetString(R.string.allow_your_contacts_to_call)
FeatureAllowed.YES -> generalGetString(R.string.allow_calls_only_if)
FeatureAllowed.NO -> generalGetString(R.string.prohibit_calls)
}
}
fun enabledDescription(enabled: FeatureEnabled): String =
@@ -2704,7 +2717,13 @@ enum class ChatFeature: Feature {
enabled.forContact -> generalGetString(R.string.only_your_contact_can_send_voice)
else -> generalGetString(R.string.voice_prohibited_in_this_chat)
}
}
Calls -> when {
enabled.forUser && enabled.forContact -> generalGetString(R.string.both_you_and_your_contact_can_make_calls)
enabled.forUser -> generalGetString(R.string.only_you_can_make_calls)
enabled.forContact -> generalGetString(R.string.only_your_contact_can_make_calls)
else -> generalGetString(R.string.calls_prohibited_with_this_contact)
}
}
}
@Serializable
@@ -2817,26 +2836,29 @@ data class ContactFeaturesAllowed(
val timedMessagesAllowed: Boolean,
val timedMessagesTTL: Int?,
val fullDelete: ContactFeatureAllowed,
val voice: ContactFeatureAllowed
val voice: ContactFeatureAllowed,
val calls: ContactFeatureAllowed,
) {
companion object {
val sampleData = ContactFeaturesAllowed(
timedMessagesAllowed = false,
timedMessagesTTL = null,
fullDelete = ContactFeatureAllowed.UserDefault(FeatureAllowed.NO),
voice = ContactFeatureAllowed.UserDefault(FeatureAllowed.YES)
voice = ContactFeatureAllowed.UserDefault(FeatureAllowed.YES),
calls = ContactFeatureAllowed.UserDefault(FeatureAllowed.YES),
)
}
}
fun contactUserPrefsToFeaturesAllowed(contactUserPreferences: ContactUserPreferences): ContactFeaturesAllowed {
val pref = contactUserPreferences.timedMessages.userPreference
val allow = pref.contactOverride?.allow
val allow = pref.pref.allow
return ContactFeaturesAllowed(
timedMessagesAllowed = allow == FeatureAllowed.YES || allow == FeatureAllowed.ALWAYS,
timedMessagesTTL = pref.pref.ttl,
fullDelete = contactUserPrefToFeatureAllowed(contactUserPreferences.fullDelete),
voice = contactUserPrefToFeatureAllowed(contactUserPreferences.voice)
voice = contactUserPrefToFeatureAllowed(contactUserPreferences.voice),
calls = contactUserPrefToFeatureAllowed(contactUserPreferences.calls),
)
}
@@ -2854,7 +2876,8 @@ fun contactFeaturesAllowedToPrefs(contactFeaturesAllowed: ContactFeaturesAllowed
ChatPreferences(
timedMessages = TimedMessagesPreference(if (contactFeaturesAllowed.timedMessagesAllowed) FeatureAllowed.YES else FeatureAllowed.NO, contactFeaturesAllowed.timedMessagesTTL),
fullDelete = contactFeatureAllowedToPref(contactFeaturesAllowed.fullDelete),
voice = contactFeatureAllowedToPref(contactFeaturesAllowed.voice)
voice = contactFeatureAllowedToPref(contactFeaturesAllowed.voice),
calls = contactFeatureAllowedToPref(contactFeaturesAllowed.calls),
)
fun contactFeatureAllowedToPref(contactFeatureAllowed: ContactFeatureAllowed): SimpleChatPreference? =
@@ -3011,9 +3034,15 @@ private fun parseChatData(chat: JsonElement): Chat {
?: ChatInfo.InvalidJSON(json.encodeToString(chat.jsonObject["chatInfo"]))
val chatStats = decodeObject(Chat.ChatStats.serializer(), chat.jsonObject["chatStats"])!!
val chatItems: List<ChatItem> = chat.jsonObject["chatItems"]!!.jsonArray.map {
decodeObject(ChatItem.serializer(), it) ?: ChatItem.invalidJSON(json.encodeToString(it))
decodeObject(ChatItem.serializer(), it) ?: parseChatItem(it)
}
return Chat(chatInfo, chatItems, chatStats)
return Chat(chatInfo, chatItems, chatStats)
}
private fun parseChatItem(j: JsonElement): ChatItem {
val chatDir: CIDirection? = decodeObject(CIDirection.serializer(), j.jsonObject["chatDir"])
val meta: CIMeta? = decodeObject(CIMeta.serializer(), j.jsonObject["meta"])
return ChatItem.invalidJSON(chatDir, meta, json.encodeToString(j))
}
private fun <T> decodeObject(deserializer: DeserializationStrategy<T>, obj: JsonElement?): T? =
@@ -3107,6 +3136,7 @@ sealed class CR {
@Serializable @SerialName("rcvFileCancelled") class RcvFileCancelled(val user: User, val chatItem: AChatItem, val rcvFileTransfer: RcvFileTransfer): CR()
@Serializable @SerialName("rcvFileSndCancelled") class RcvFileSndCancelled(val user: User, val chatItem: AChatItem, val rcvFileTransfer: RcvFileTransfer): CR()
@Serializable @SerialName("rcvFileProgressXFTP") class RcvFileProgressXFTP(val user: User, val chatItem: AChatItem, val receivedSize: Long, val totalSize: Long): CR()
@Serializable @SerialName("rcvFileError") class RcvFileError(val user: User, val chatItem: AChatItem): CR()
// sending file events
@Serializable @SerialName("sndFileStart") class SndFileStart(val user: User, val chatItem: AChatItem, val sndFileTransfer: SndFileTransfer): CR()
@Serializable @SerialName("sndFileComplete") class SndFileComplete(val user: User, val chatItem: AChatItem, val sndFileTransfer: SndFileTransfer): CR()
@@ -3114,6 +3144,8 @@ sealed class CR {
@Serializable @SerialName("sndFileRcvCancelled") class SndFileRcvCancelled(val user: User, val chatItem: AChatItem, val sndFileTransfer: SndFileTransfer): CR()
@Serializable @SerialName("sndFileProgressXFTP") class SndFileProgressXFTP(val user: User, val chatItem: AChatItem, val fileTransferMeta: FileTransferMeta, val sentSize: Long, val totalSize: Long): CR()
@Serializable @SerialName("sndFileCompleteXFTP") class SndFileCompleteXFTP(val user: User, val chatItem: AChatItem, val fileTransferMeta: FileTransferMeta): CR()
@Serializable @SerialName("sndFileError") class SndFileError(val user: User, val chatItem: AChatItem): CR()
// call events
@Serializable @SerialName("callInvitation") class CallInvitation(val callInvitation: RcvCallInvitation): CR()
@Serializable @SerialName("callOffer") class CallOffer(val user: User, val contact: Contact, val callType: CallType, val offer: WebRTCSession, val sharedKey: String? = null, val askConfirmation: Boolean): CR()
@Serializable @SerialName("callAnswer") class CallAnswer(val user: User, val contact: Contact, val answer: WebRTCSession): CR()
@@ -3213,12 +3245,14 @@ sealed class CR {
is RcvFileCancelled -> "rcvFileCancelled"
is RcvFileSndCancelled -> "rcvFileSndCancelled"
is RcvFileProgressXFTP -> "rcvFileProgressXFTP"
is RcvFileError -> "rcvFileError"
is SndFileCancelled -> "sndFileCancelled"
is SndFileComplete -> "sndFileComplete"
is SndFileRcvCancelled -> "sndFileRcvCancelled"
is SndFileStart -> "sndFileStart"
is SndFileProgressXFTP -> "sndFileProgressXFTP"
is SndFileCompleteXFTP -> "sndFileCompleteXFTP"
is SndFileError -> "sndFileError"
is CallInvitation -> "callInvitation"
is CallOffer -> "callOffer"
is CallAnswer -> "callAnswer"
@@ -3320,12 +3354,14 @@ sealed class CR {
is RcvFileCancelled -> withUser(user, json.encodeToString(chatItem))
is RcvFileSndCancelled -> withUser(user, json.encodeToString(chatItem))
is RcvFileProgressXFTP -> withUser(user, "chatItem: ${json.encodeToString(chatItem)}\nreceivedSize: $receivedSize\ntotalSize: $totalSize")
is RcvFileError -> withUser(user, json.encodeToString(chatItem))
is SndFileCancelled -> json.encodeToString(chatItem)
is SndFileComplete -> withUser(user, json.encodeToString(chatItem))
is SndFileRcvCancelled -> withUser(user, json.encodeToString(chatItem))
is SndFileStart -> withUser(user, json.encodeToString(chatItem))
is SndFileProgressXFTP -> withUser(user, "chatItem: ${json.encodeToString(chatItem)}\nsentSize: $sentSize\ntotalSize: $totalSize")
is SndFileCompleteXFTP -> withUser(user, json.encodeToString(chatItem))
is SndFileError -> withUser(user, json.encodeToString(chatItem))
is CallInvitation -> "contact: ${callInvitation.contact.id}\ncallType: $callInvitation.callType\nsharedKey: ${callInvitation.sharedKey ?: ""}"
is CallOffer -> withUser(user, "contact: ${contact.id}\ncallType: $callType\nsharedKey: ${sharedKey ?: ""}\naskConfirmation: $askConfirmation\noffer: ${json.encodeToString(offer)}")
is CallAnswer -> withUser(user, "contact: ${contact.id}\nanswer: ${json.encodeToString(answer)}")
@@ -27,3 +27,4 @@ val WarningOrange = Color(255, 127, 0, 255)
val WarningYellow = Color(255, 192, 0, 255)
val FileLight = Color(183, 190, 199, 255)
val FileDark = Color(101, 101, 106, 255)
val MenuTextColorDark = Color.White.copy(alpha = 0.8f)
@@ -18,6 +18,7 @@ val DEFAULT_PADDING = 16.dp
val DEFAULT_SPACE_AFTER_ICON = 4.dp
val DEFAULT_PADDING_HALF = DEFAULT_PADDING / 2
val DEFAULT_BOTTOM_PADDING = 48.dp
val DEFAULT_BOTTOM_BUTTON_PADDING = 20.dp
val DarkColorPalette = darkColors(
primary = SimplexBlue, // If this value changes also need to update #0088ff in string resource files
@@ -27,7 +28,7 @@ val DarkColorPalette = darkColors(
// surface = Color.Black,
// background = Color(0xFF121212),
// surface = Color(0xFF121212),
// error = Color(0xFFCF6679),
error = Color.Red,
onBackground = Color(0xFFFFFBFA),
onSurface = Color(0xFFFFFBFA),
// onError: Color = Color.Black,
@@ -36,6 +37,7 @@ val LightColorPalette = lightColors(
primary = SimplexBlue, // If this value changes also need to update #0088ff in string resource files
primaryVariant = SimplexGreen,
secondary = LightGray,
error = Color.Red,
// background = Color.White,
// surface = Color.White
// onPrimary = Color.White,
@@ -3,22 +3,23 @@ package chat.simplex.app.views
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.*
import androidx.compose.material.MaterialTheme.colors
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.ArrowBackIosNew
import androidx.compose.material.icons.outlined.ArrowForwardIos
import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.focus.*
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.KeyboardCapitalization
import androidx.compose.ui.text.style.*
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import chat.simplex.app.*
@@ -26,61 +27,73 @@ import chat.simplex.app.R
import chat.simplex.app.model.ChatModel
import chat.simplex.app.model.Profile
import chat.simplex.app.ui.theme.*
import chat.simplex.app.views.helpers.AppBarTitle
import chat.simplex.app.views.helpers.withApi
import chat.simplex.app.views.helpers.*
import chat.simplex.app.views.onboarding.OnboardingStage
import chat.simplex.app.views.onboarding.ReadableText
import com.google.accompanist.insets.navigationBarsWithImePadding
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.launch
fun isValidDisplayName(name: String) : Boolean {
return (name.firstOrNull { it.isWhitespace() }) == null
return (name.firstOrNull { it.isWhitespace() }) == null && !name.startsWith("@") && !name.startsWith("#")
}
@Composable
fun CreateProfilePanel(chatModel: ChatModel, close: () -> Unit) {
val displayName = remember { mutableStateOf("") }
val fullName = remember { mutableStateOf("") }
val displayName = rememberSaveable { mutableStateOf("") }
val fullName = rememberSaveable { mutableStateOf("") }
val focusRequester = remember { FocusRequester() }
Surface(Modifier.background(MaterialTheme.colors.onBackground)) {
Column(
modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())
) {
AppBarTitle(stringResource(R.string.create_profile), false)
ReadableText(R.string.your_profile_is_stored_on_your_device)
ReadableText(R.string.profile_is_only_shared_with_your_contacts)
Spacer(Modifier.height(10.dp))
Text(
stringResource(R.string.display_name),
style = MaterialTheme.typography.h6,
modifier = Modifier.padding(bottom = 3.dp)
)
ProfileNameField(displayName, focusRequester)
val errorText = if (!isValidDisplayName(displayName.value)) stringResource(R.string.display_name_cannot_contain_whitespace) else ""
Text(
errorText,
fontSize = 15.sp,
color = MaterialTheme.colors.error
)
Spacer(Modifier.height(3.dp))
Text(
stringResource(R.string.full_name_optional__prompt),
style = MaterialTheme.typography.h6,
modifier = Modifier.padding(bottom = 5.dp)
)
ProfileNameField(fullName)
/*CloseSheetBar(close = {
if (chatModel.users.isEmpty()) {
chatModel.onboardingStage.value = OnboardingStage.Step1_SimpleXInfo
} else {
close()
}
})*/
Column(Modifier.padding(horizontal = DEFAULT_PADDING * 1f)) {
AppBarTitleCentered(stringResource(R.string.create_profile))
ReadableText(R.string.your_profile_is_stored_on_your_device, TextAlign.Center, padding = PaddingValues())
ReadableText(R.string.profile_is_only_shared_with_your_contacts, TextAlign.Center)
Spacer(Modifier.height(DEFAULT_PADDING * 1.5f))
Row(Modifier.padding(bottom = DEFAULT_PADDING_HALF).fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
Text(
stringResource(R.string.display_name),
fontSize = 16.sp
)
if (!isValidDisplayName(displayName.value)) {
Text(
stringResource(R.string.no_spaces),
fontSize = 16.sp,
color = Color.Red
)
}
}
ProfileNameField(displayName, "", ::isValidDisplayName, focusRequester)
Spacer(Modifier.height(DEFAULT_PADDING))
Text(
stringResource(R.string.full_name_optional__prompt),
fontSize = 16.sp,
modifier = Modifier.padding(bottom = DEFAULT_PADDING_HALF)
)
ProfileNameField(fullName, "", ::isValidDisplayName)
}
Spacer(Modifier.fillMaxHeight().weight(1f))
Row {
if (chatModel.users.isEmpty()) {
SimpleButton(
SimpleButtonDecorated(
text = stringResource(R.string.about_simplex),
icon = Icons.Outlined.ArrowBackIosNew
icon = Icons.Outlined.ArrowBackIosNew,
textDecoration = TextDecoration.None,
fontWeight = FontWeight.Bold
) { chatModel.onboardingStage.value = OnboardingStage.Step1_SimpleXInfo }
}
Spacer(Modifier.fillMaxWidth().weight(1f))
val enabled = displayName.value.isNotEmpty() && isValidDisplayName(displayName.value)
val createModifier: Modifier
val createColor: Color
@@ -93,7 +106,7 @@ fun CreateProfilePanel(chatModel: ChatModel, close: () -> Unit) {
}
Surface(shape = RoundedCornerShape(20.dp)) {
Row(verticalAlignment = Alignment.CenterVertically, modifier = createModifier) {
Text(stringResource(R.string.create_profile_button), style = MaterialTheme.typography.caption, color = createColor)
Text(stringResource(R.string.create_profile_button), style = MaterialTheme.typography.caption, color = createColor, fontWeight = FontWeight.Medium)
Icon(Icons.Outlined.ArrowForwardIos, stringResource(R.string.create_profile_button), tint = createColor)
}
}
@@ -128,24 +141,54 @@ fun createProfile(chatModel: ChatModel, displayName: String, fullName: String, c
}
@Composable
fun ProfileNameField(name: MutableState<String>, focusRequester: FocusRequester? = null) {
fun ProfileNameField(name: MutableState<String>, placeholder: String = "", isValid: (String) -> Boolean = { true }, focusRequester: FocusRequester? = null) {
var valid by rememberSaveable { mutableStateOf(true) }
var focused by rememberSaveable { mutableStateOf(false) }
val strokeColor by remember {
derivedStateOf {
if (valid) {
if (focused) {
HighOrLowlight.copy(alpha = 0.6f)
} else {
HighOrLowlight.copy(alpha = 0.3f)
}
} else Color.Red
}
}
val modifier = Modifier
.fillMaxWidth()
.background(MaterialTheme.colors.secondary)
.height(40.dp)
.clip(RoundedCornerShape(5.dp))
.padding(8.dp)
.height(55.dp)
.border(border = BorderStroke(1.dp, strokeColor), shape = RoundedCornerShape(50))
.padding(horizontal = 8.dp)
.navigationBarsWithImePadding()
BasicTextField(
.onFocusChanged { focused = it.isFocused }
TextField(
value = name.value,
onValueChange = { name.value = it },
modifier = if (focusRequester == null) modifier else modifier.focusRequester(focusRequester),
textStyle = MaterialTheme.typography.body1.copy(color = MaterialTheme.colors.onBackground),
textStyle = TextStyle(fontSize = 18.sp, color = colors.onBackground),
keyboardOptions = KeyboardOptions(
capitalization = KeyboardCapitalization.None,
autoCorrect = false
),
singleLine = true,
cursorBrush = SolidColor(HighOrLowlight)
)
isError = !valid,
placeholder = { Text(placeholder, fontSize = 18.sp, color = HighOrLowlight.copy(alpha = 0.3f)) },
shape = RoundedCornerShape(50),
colors = TextFieldDefaults.textFieldColors(
backgroundColor = Color.Unspecified,
textColor = MaterialTheme.colors.onBackground,
focusedIndicatorColor = Color.Unspecified,
unfocusedIndicatorColor = Color.Unspecified,
cursorColor = HighOrLowlight,
errorIndicatorColor = Color.Unspecified
)
)
LaunchedEffect(Unit) {
snapshotFlow { name.value }
.distinctUntilChanged()
.collect {
valid = isValid(it)
}
}
}
@@ -12,6 +12,7 @@ import android.view.WindowManager
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
@@ -25,6 +26,7 @@ import androidx.compose.ui.draw.scale
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
@@ -36,7 +38,6 @@ import chat.simplex.app.model.*
import chat.simplex.app.model.NtfManager.Companion.OpenChatAction
import chat.simplex.app.ui.theme.*
import chat.simplex.app.views.helpers.ProfileImage
import chat.simplex.app.views.onboarding.SimpleXLogo
import kotlinx.datetime.Clock
class IncomingCallActivity: ComponentActivity() {
@@ -186,6 +187,17 @@ fun IncomingCallLockScreenAlertLayout(
}
}
@Composable
private fun SimpleXLogo() {
Image(
painter = painterResource(if (isInDarkTheme()) R.drawable.logo_light else R.drawable.logo),
contentDescription = stringResource(R.string.image_descr_simplex_logo),
modifier = Modifier
.padding(vertical = DEFAULT_PADDING)
.fillMaxWidth(0.80f)
)
}
@Composable
private fun LockScreenCallButton(text: String, icon: ImageVector, color: Color, action: () -> Unit) {
Surface(
@@ -378,7 +378,7 @@ fun ChatInfoToolbar(
onSearchValueChanged: (String) -> Unit,
) {
val scope = rememberCoroutineScope()
var showMenu by rememberSaveable { mutableStateOf(false) }
val showMenu = rememberSaveable { mutableStateOf(false) }
var showSearch by rememberSaveable { mutableStateOf(false) }
val onBackClicked = {
if (!showSearch) {
@@ -393,15 +393,15 @@ fun ChatInfoToolbar(
val menuItems = arrayListOf<@Composable () -> Unit>()
menuItems.add {
ItemAction(stringResource(android.R.string.search_go).capitalize(Locale.current), Icons.Outlined.Search, onClick = {
showMenu = false
showMenu.value = false
showSearch = true
})
}
if (chat.chatInfo is ChatInfo.Direct) {
if (chat.chatInfo is ChatInfo.Direct && chat.chatInfo.contact.allowsFeature(ChatFeature.Calls)) {
barButtons.add {
IconButton({
showMenu = false
showMenu.value = false
startCall(CallMediaType.Audio)
}) {
Icon(Icons.Outlined.Phone, stringResource(R.string.icon_descr_more_button), tint = MaterialTheme.colors.primary)
@@ -409,14 +409,14 @@ fun ChatInfoToolbar(
}
menuItems.add {
ItemAction(stringResource(R.string.icon_descr_video_call).capitalize(Locale.current), Icons.Outlined.Videocam, onClick = {
showMenu = false
showMenu.value = false
startCall(CallMediaType.Video)
})
}
} else if (chat.chatInfo is ChatInfo.Group && chat.chatInfo.groupInfo.canAddMembers && !chat.chatInfo.incognito) {
barButtons.add {
IconButton({
showMenu = false
showMenu.value = false
addMembers(chat.chatInfo.groupInfo)
}) {
Icon(Icons.Outlined.PersonAdd, stringResource(R.string.icon_descr_add_members), tint = MaterialTheme.colors.primary)
@@ -429,7 +429,7 @@ fun ChatInfoToolbar(
if (ntfsEnabled.value) stringResource(R.string.mute_chat) else stringResource(R.string.unmute_chat),
if (ntfsEnabled.value) Icons.Outlined.NotificationsOff else Icons.Outlined.Notifications,
onClick = {
showMenu = false
showMenu.value = false
// Just to make a delay before changing state of ntfsEnabled, otherwise it will redraw menu item with new value before closing the menu
scope.launch {
delay(200)
@@ -440,7 +440,7 @@ fun ChatInfoToolbar(
}
barButtons.add {
IconButton({ showMenu = true }) {
IconButton({ showMenu.value = true }) {
Icon(Icons.Default.MoreVert, stringResource(R.string.icon_descr_more_button), tint = MaterialTheme.colors.primary)
}
}
@@ -457,11 +457,7 @@ fun ChatInfoToolbar(
Divider(Modifier.padding(top = AppBarHeight))
Box(Modifier.fillMaxWidth().wrapContentSize(Alignment.TopEnd).offset(y = AppBarHeight)) {
DropdownMenu(
expanded = showMenu,
onDismissRequest = { showMenu = false },
Modifier.widthIn(min = 220.dp)
) {
DefaultDropdownMenu(showMenu) {
menuItems.forEach { it() }
}
}
@@ -788,36 +784,27 @@ fun BoxWithConstraintsScope.FloatingButtons(
}
val showButtonWithCounter = topUnreadCount > 0
val height = with(LocalDensity.current) { maxHeight.toPx() }
var showDropDown by remember { mutableStateOf(false) }
val showDropDown = remember { mutableStateOf(false) }
TopEndFloatingButton(
Modifier.padding(end = 16.dp, top = 24.dp).align(Alignment.TopEnd),
topUnreadCount,
showButtonWithCounter,
onClick = { scope.launch { listState.animateScrollBy(height) } },
onLongClick = { showDropDown = true }
onLongClick = { showDropDown.value = true }
)
DropdownMenu(
expanded = showDropDown,
onDismissRequest = { showDropDown = false },
Modifier.width(220.dp),
offset = DpOffset(maxWidth - 16.dp, 24.dp + fabSize)
) {
DropdownMenuItem(
DefaultDropdownMenu(showDropDown, offset = DpOffset(maxWidth - 16.dp, 24.dp + fabSize)) {
ItemAction(
generalGetString(R.string.mark_read),
Icons.Outlined.Check,
onClick = {
markRead(
CC.ItemRange(minUnreadItemId, chatItems[chatItems.size - listState.layoutInfo.visibleItemsInfo.lastIndex - 1].id - 1),
bottomUnreadCount
)
showDropDown = false
}
) {
Text(
generalGetString(R.string.mark_read),
maxLines = 1,
)
}
showDropDown.value = false
})
}
}
@@ -14,6 +14,7 @@ import android.os.Build
import android.provider.MediaStore
import android.webkit.MimeTypeMap
import android.widget.Toast
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContract
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CircleShape
@@ -179,8 +180,7 @@ fun ComposeView(
val pendingLinkUrl = rememberSaveable { mutableStateOf<String?>(null) }
val cancelledLinks = rememberSaveable { mutableSetOf<String>() }
val useLinkPreviews = chatModel.controller.appPrefs.privacyLinkPreviews.get()
val xftpSendEnabled = chatModel.controller.appPrefs.xftpSendEnabled.get()
val maxFileSize = getMaxFileSize(fileProtocol = if (xftpSendEnabled) FileProtocol.XFTP else FileProtocol.SMP)
val maxFileSize = getMaxFileSize(FileProtocol.XFTP)
val smallFont = MaterialTheme.typography.body1.copy(color = MaterialTheme.colors.onBackground)
val textStyle = remember { mutableStateOf(smallFont) }
val cameraLauncher = rememberCameraLauncher { uri: Uri? ->
@@ -261,13 +261,17 @@ fun ComposeView(
}
}
}
val mediaLauncherWithFiles = rememberGetMultipleContentsLauncher { processPickedMedia(it, null) }
val galleryImageLauncher = rememberLauncherForActivityResult(contract = PickMultipleImagesFromGallery()) { processPickedMedia(it, null) }
val galleryImageLauncherFallback = rememberGetMultipleContentsLauncher { processPickedMedia(it, null) }
val galleryVideoLauncher = rememberLauncherForActivityResult(contract = PickMultipleVideosFromGallery()) { processPickedMedia(it, null) }
val galleryVideoLauncherFallback = rememberGetMultipleContentsLauncher { processPickedMedia(it, null) }
val filesLauncher = rememberGetContentLauncher { processPickedFile(it, null) }
val recState: MutableState<RecordingState> = remember { mutableStateOf(RecordingState.NotStarted) }
LaunchedEffect(attachmentOption.value) {
when (attachmentOption.value) {
AttachmentOption.TakePhoto -> {
AttachmentOption.CameraPhoto -> {
when (PackageManager.PERMISSION_GRANTED) {
ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) -> {
cameraLauncher.launchWithFallback()
@@ -278,11 +282,23 @@ fun ComposeView(
}
attachmentOption.value = null
}
AttachmentOption.PickMedia -> {
mediaLauncherWithFiles.launch(if (xftpSendEnabled) "image/*;video/*" else "image/*")
AttachmentOption.GalleryImage -> {
try {
galleryImageLauncher.launch(0)
} catch (e: ActivityNotFoundException) {
galleryImageLauncherFallback.launch("image/*")
}
attachmentOption.value = null
}
AttachmentOption.PickFile -> {
AttachmentOption.GalleryVideo -> {
try {
galleryVideoLauncher.launch(0)
} catch (e: ActivityNotFoundException) {
galleryVideoLauncherFallback.launch("video/*")
}
attachmentOption.value = null
}
AttachmentOption.File -> {
filesLauncher.launch("*/*")
attachmentOption.value = null
}
@@ -88,7 +88,7 @@ private fun ContactPreferencesLayout(
AppBarTitle(stringResource(R.string.contact_preferences))
val timedMessages: MutableState<Boolean> = remember(featuresAllowed) { mutableStateOf(featuresAllowed.timedMessagesAllowed) }
val onTTLUpdated = { ttl: Int? ->
applyPrefs(featuresAllowed.copy(timedMessagesTTL = ttl ?: 86400))
applyPrefs(featuresAllowed.copy(timedMessagesTTL = ttl))
}
TimedMessagesFeatureSection(featuresAllowed, contact.mergedPreferences.timedMessages, timedMessages, onTTLUpdated) { allowed, ttl ->
applyPrefs(featuresAllowed.copy(timedMessagesAllowed = allowed, timedMessagesTTL = ttl ?: currentFeaturesAllowed.timedMessagesTTL))
@@ -104,6 +104,11 @@ private fun ContactPreferencesLayout(
applyPrefs(featuresAllowed.copy(voice = it))
}
SectionSpacer()
val allowCalls: MutableState<ContactFeatureAllowed> = remember(featuresAllowed) { mutableStateOf(featuresAllowed.calls) }
FeatureSection(ChatFeature.Calls, user.fullPreferences.calls.allow, contact.mergedPreferences.calls, allowCalls) {
applyPrefs(featuresAllowed.copy(calls = it))
}
SectionSpacer()
ResetSaveButtons(
reset = reset,
save = savePrefs,
@@ -138,6 +143,7 @@ private fun FeatureSection(
ContactFeatureAllowed.values(userDefault).map { it to it.text },
allowFeature,
icon = null,
enabled = remember { mutableStateOf(feature != ChatFeature.Calls) },
onSelected = onSelected
)
}
@@ -147,7 +153,7 @@ private fun FeatureSection(
pref.contactPreference.allow.text
)
}
SectionTextFooter(feature.enabledDescription(enabled))
SectionTextFooter(feature.enabledDescription(enabled) + (if (feature == ChatFeature.Calls) generalGetString(R.string.available_in_v51) else ""))
}
@Composable
@@ -155,20 +155,18 @@ fun SendMsgView(
cs.contextItem is ComposeContextItem.NoContextItem &&
sendLiveMessage != null && updateLiveMessage != null
) {
var showDropdown by rememberSaveable { mutableStateOf(false) }
SendMsgButton(icon, sendButtonSize, sendButtonAlpha, !disabled, sendMessage) { showDropdown = true }
val showDropdown = rememberSaveable { mutableStateOf(false) }
SendMsgButton(icon, sendButtonSize, sendButtonAlpha, !disabled, sendMessage) { showDropdown.value = true }
DropdownMenu(
expanded = showDropdown,
onDismissRequest = { showDropdown = false },
Modifier.width(220.dp),
DefaultDropdownMenu(
showDropdown,
) {
ItemAction(
generalGetString(R.string.send_live_message),
Icons.Filled.Bolt,
onClick = {
startLiveMessage(scope, sendLiveMessage, updateLiveMessage, sendButtonSize, sendButtonAlpha, composeState, liveMessageAlertShown)
showDropdown = false
showDropdown.value = false
}
)
}
@@ -28,6 +28,7 @@ import chat.simplex.app.model.*
import chat.simplex.app.ui.theme.*
import chat.simplex.app.views.chat.ChatInfoToolbarTitle
import chat.simplex.app.views.helpers.*
import chat.simplex.app.views.newchat.InfoAboutIncognito
import chat.simplex.app.views.usersettings.SettingsActionItem
@Composable
@@ -37,6 +38,7 @@ fun AddGroupMembersView(groupInfo: GroupInfo, creatingGroup: Boolean = false, ch
var allowModifyMembers by remember { mutableStateOf(true) }
BackHandler(onBack = close)
AddGroupMembersLayout(
chatModel.incognito.value,
groupInfo = groupInfo,
creatingGroup = creatingGroup,
contactsToAdd = getContactsToAdd(chatModel),
@@ -85,6 +87,7 @@ fun getContactsToAdd(chatModel: ChatModel): List<Contact> {
@Composable
fun AddGroupMembersLayout(
chatModelIncognito: Boolean,
groupInfo: GroupInfo,
creatingGroup: Boolean,
contactsToAdd: List<Contact>,
@@ -105,6 +108,14 @@ fun AddGroupMembersLayout(
horizontalAlignment = Alignment.Start,
) {
AppBarTitle(stringResource(R.string.button_add_members))
InfoAboutIncognito(
chatModelIncognito,
false,
generalGetString(R.string.group_unsupported_incognito_main_profile_sent),
generalGetString(R.string.group_main_profile_sent),
true
)
Spacer(Modifier.size(DEFAULT_PADDING))
Row(
Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.Center
@@ -318,6 +329,7 @@ fun showProhibitedToInviteIncognitoAlertDialog() {
fun PreviewAddGroupMembersLayout() {
SimpleXTheme {
AddGroupMembersLayout(
chatModelIncognito = false,
groupInfo = GroupInfo.sampleData,
creatingGroup = false,
contactsToAdd = listOf(Contact.sampleData, Contact.sampleData, Contact.sampleData),
@@ -1,7 +1,6 @@
package chat.simplex.app.views.chat.group
import android.content.res.Configuration
import android.graphics.Bitmap
import android.net.Uri
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
@@ -14,6 +13,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@@ -23,6 +23,7 @@ import chat.simplex.app.ui.theme.*
import chat.simplex.app.views.ProfileNameField
import chat.simplex.app.views.helpers.*
import chat.simplex.app.views.isValidDisplayName
import chat.simplex.app.views.onboarding.ReadableText
import chat.simplex.app.views.usersettings.*
import com.google.accompanist.insets.ProvideWindowInsets
import com.google.accompanist.insets.navigationBarsWithImePadding
@@ -53,14 +54,32 @@ fun GroupProfileLayout(
saveProfile: (GroupProfile) -> Unit,
) {
val bottomSheetModalState = rememberModalBottomSheetState(initialValue = ModalBottomSheetValue.Hidden)
val displayName = remember { mutableStateOf(groupProfile.displayName) }
val fullName = remember { mutableStateOf(groupProfile.fullName) }
val displayName = rememberSaveable { mutableStateOf(groupProfile.displayName) }
val fullName = rememberSaveable { mutableStateOf(groupProfile.fullName) }
val chosenImage = rememberSaveable { mutableStateOf<Uri?>(null) }
val profileImage = rememberSaveable { mutableStateOf(groupProfile.image) }
val scope = rememberCoroutineScope()
val scrollState = rememberScrollState()
val focusRequester = remember { FocusRequester() }
val dataUnchanged =
displayName.value == groupProfile.displayName &&
fullName.value == groupProfile.fullName &&
chosenImage.value == null
val closeWithAlert = {
if (dataUnchanged || !(displayName.value.isNotEmpty() && isValidDisplayName(displayName.value))) {
close()
} else {
showUnsavedChangesAlert({
saveProfile(
groupProfile.copy(
displayName = displayName.value,
fullName = fullName.value,
image = profileImage.value
)
)
}, close)
}
}
ProvideWindowInsets(windowInsetsAnimationsEnabled = true) {
ModalBottomSheetLayout(
scrimColor = Color.Black.copy(alpha = 0.12F),
@@ -76,23 +95,16 @@ fun GroupProfileLayout(
sheetState = bottomSheetModalState,
sheetShape = RoundedCornerShape(topStart = 18.dp, topEnd = 18.dp)
) {
ModalView(close = close) {
ModalView(close = closeWithAlert) {
Column(
Modifier
.verticalScroll(scrollState)
.padding(horizontal = DEFAULT_PADDING),
horizontalAlignment = Alignment.Start
) {
Text(
stringResource(R.string.group_profile_is_stored_on_members_devices),
Modifier.padding(bottom = 24.dp),
color = MaterialTheme.colors.onBackground,
lineHeight = 22.sp
)
Column(
Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.Start
Modifier.fillMaxWidth()
.padding(horizontal = DEFAULT_PADDING)
) {
ReadableText(R.string.group_profile_is_stored_on_members_devices, TextAlign.Center)
Box(
Modifier
.fillMaxWidth()
@@ -101,7 +113,7 @@ fun GroupProfileLayout(
) {
Box(contentAlignment = Alignment.TopEnd) {
Box(contentAlignment = Alignment.Center) {
ProfileImage(192.dp, profileImage.value)
ProfileImage(108.dp, profileImage.value, color = HighOrLowlight.copy(alpha = 0.1f))
EditImageButton { scope.launch { bottomSheetModalState.show() } }
}
if (profileImage.value != null) {
@@ -109,51 +121,54 @@ fun GroupProfileLayout(
}
}
}
Text(
stringResource(R.string.group_display_name_field),
Modifier.padding(bottom = 3.dp)
)
ProfileNameField(displayName, focusRequester)
val errorText = if (!isValidDisplayName(displayName.value)) stringResource(R.string.display_name_cannot_contain_whitespace) else ""
Text(
errorText,
fontSize = 15.sp,
color = MaterialTheme.colors.error
)
Spacer(Modifier.height(3.dp))
Text(
stringResource(R.string.group_full_name_field),
Modifier.padding(bottom = 5.dp)
)
ProfileNameField(fullName)
Spacer(Modifier.height(16.dp))
Row {
TextButton(stringResource(R.string.cancel_verb)) {
close.invoke()
}
Spacer(Modifier.padding(horizontal = 8.dp))
val enabled = displayName.value.isNotEmpty() && isValidDisplayName(displayName.value)
if (enabled) {
Row(Modifier.padding(bottom = DEFAULT_PADDING_HALF).fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
Text(
stringResource(R.string.group_display_name_field),
fontSize = 16.sp
)
if (!isValidDisplayName(displayName.value)) {
Spacer(Modifier.size(DEFAULT_PADDING_HALF))
Text(
stringResource(R.string.save_group_profile),
modifier = Modifier.clickable {
saveProfile(groupProfile.copy(
displayName = displayName.value,
fullName = fullName.value,
image = profileImage.value
))
},
color = MaterialTheme.colors.primary
)
} else {
Text(
stringResource(R.string.save_group_profile),
color = HighOrLowlight
stringResource(R.string.no_spaces),
fontSize = 16.sp,
color = Color.Red
)
}
}
ProfileNameField(displayName, "", ::isValidDisplayName, focusRequester)
Spacer(Modifier.height(DEFAULT_PADDING))
Text(
stringResource(R.string.group_full_name_field),
fontSize = 16.sp,
modifier = Modifier.padding(bottom = DEFAULT_PADDING_HALF)
)
ProfileNameField(fullName)
Spacer(Modifier.height(DEFAULT_PADDING))
val enabled = !dataUnchanged && displayName.value.isNotEmpty() && isValidDisplayName(displayName.value)
if (enabled) {
Text(
stringResource(R.string.save_group_profile),
modifier = Modifier.clickable {
saveProfile(
groupProfile.copy(
displayName = displayName.value,
fullName = fullName.value,
image = profileImage.value
)
)
},
color = MaterialTheme.colors.primary
)
} else {
Text(
stringResource(R.string.save_group_profile),
color = HighOrLowlight
)
}
}
Spacer(Modifier.height(DEFAULT_BOTTOM_BUTTON_PADDING))
LaunchedEffect(Unit) {
delay(300)
focusRequester.requestFocus()
@@ -164,6 +179,16 @@ fun GroupProfileLayout(
}
}
private fun showUnsavedChangesAlert(save: () -> Unit, revert: () -> Unit) {
AlertManager.shared.showAlertDialogStacked(
title = generalGetString(R.string.save_preferences_question),
confirmText = generalGetString(R.string.save_and_notify_group_members),
dismissText = generalGetString(R.string.exit_without_saving),
onConfirm = save,
onDismiss = revert,
)
}
@Preview(showBackground = true)
@Preview(
uiMode = Configuration.UI_MODE_NIGHT_YES,
@@ -156,6 +156,7 @@ fun CIFileView(
}
is CIFileStatus.SndComplete -> fileIcon(innerIcon = Icons.Filled.Check)
is CIFileStatus.SndCancelled -> fileIcon(innerIcon = Icons.Outlined.Close)
is CIFileStatus.SndError -> fileIcon(innerIcon = Icons.Outlined.Close)
is CIFileStatus.RcvInvitation ->
if (fileSizeValid())
fileIcon(innerIcon = Icons.Outlined.ArrowDownward, color = MaterialTheme.colors.primary)
@@ -170,6 +171,7 @@ fun CIFileView(
}
is CIFileStatus.RcvComplete -> fileIcon()
is CIFileStatus.RcvCancelled -> fileIcon(innerIcon = Icons.Outlined.Close)
is CIFileStatus.RcvError -> fileIcon(innerIcon = Icons.Outlined.Close)
}
} else {
fileIcon()
@@ -82,10 +82,12 @@ fun CIImageView(
is CIFileStatus.SndTransfer -> progressIndicator()
is CIFileStatus.SndComplete -> fileIcon(Icons.Filled.Check, R.string.icon_descr_image_snd_complete)
is CIFileStatus.SndCancelled -> fileIcon(Icons.Outlined.Close, R.string.icon_descr_file)
is CIFileStatus.SndError -> fileIcon(Icons.Outlined.Close, R.string.icon_descr_file)
is CIFileStatus.RcvInvitation -> fileIcon(Icons.Outlined.ArrowDownward, R.string.icon_descr_asked_to_receive)
is CIFileStatus.RcvAccepted -> fileIcon(Icons.Outlined.MoreHoriz, R.string.icon_descr_waiting_for_image)
is CIFileStatus.RcvTransfer -> progressIndicator()
is CIFileStatus.RcvCancelled -> fileIcon(Icons.Outlined.Close, R.string.icon_descr_file)
is CIFileStatus.RcvError -> fileIcon(Icons.Outlined.Close, R.string.icon_descr_file)
else -> {}
}
}
@@ -0,0 +1,24 @@
package chat.simplex.app.views.chat.item
import androidx.compose.runtime.Composable
import chat.simplex.app.R
import chat.simplex.app.model.*
import chat.simplex.app.views.helpers.AlertManager
import chat.simplex.app.views.helpers.generalGetString
@Composable
fun CIRcvDecryptionError(msgDecryptError: MsgDecryptError, msgCount: UInt, ci: ChatItem, timedMessagesTTL: Int?, showMember: Boolean) {
CIMsgError(ci, timedMessagesTTL, showMember) {
AlertManager.shared.showAlertMsg(
title = generalGetString(R.string.decryption_error),
text = when (msgDecryptError) {
MsgDecryptError.RatchetHeader -> String.format(generalGetString(R.string.alert_text_decryption_error_header), msgCount.toLong()) + "\n" +
generalGetString(R.string.alert_text_fragment_encryption_out_of_sync_old_database) + "\n" +
generalGetString(R.string.alert_text_fragment_permanent_error_reconnect)
MsgDecryptError.TooManySkipped -> String.format(generalGetString(R.string.alert_text_decryption_error_too_many_skipped), msgCount.toLong()) + "\n" +
generalGetString(R.string.alert_text_fragment_encryption_out_of_sync_old_database) + "\n" +
generalGetString(R.string.alert_text_fragment_permanent_error_reconnect)
}
)
}
}
@@ -300,6 +300,7 @@ private fun loadingIndicator(file: CIFile?) {
}
is CIFileStatus.SndComplete -> fileIcon(Icons.Filled.Check, R.string.icon_descr_video_snd_complete)
is CIFileStatus.SndCancelled -> fileIcon(Icons.Outlined.Close, R.string.icon_descr_file)
is CIFileStatus.SndError -> fileIcon(Icons.Outlined.Close, R.string.icon_descr_file)
is CIFileStatus.RcvInvitation -> fileIcon(Icons.Outlined.ArrowDownward, R.string.icon_descr_video_asked_to_receive)
is CIFileStatus.RcvAccepted -> fileIcon(Icons.Outlined.MoreHoriz, R.string.icon_descr_waiting_for_video)
is CIFileStatus.RcvTransfer ->
@@ -309,6 +310,7 @@ private fun loadingIndicator(file: CIFile?) {
progressIndicator()
}
is CIFileStatus.RcvCancelled -> fileIcon(Icons.Outlined.Close, R.string.icon_descr_file)
is CIFileStatus.RcvError -> fileIcon(Icons.Outlined.Close, R.string.icon_descr_file)
else -> {}
}
}
@@ -22,8 +22,7 @@ import androidx.compose.ui.unit.dp
import chat.simplex.app.*
import chat.simplex.app.R
import chat.simplex.app.model.*
import chat.simplex.app.ui.theme.HighOrLowlight
import chat.simplex.app.ui.theme.SimpleXTheme
import chat.simplex.app.ui.theme.*
import chat.simplex.app.views.chat.ComposeContextItem
import chat.simplex.app.views.chat.ComposeState
import chat.simplex.app.views.helpers.*
@@ -105,11 +104,7 @@ fun ChatItemView(
@Composable
fun MsgContentItemDropdownMenu() {
DropdownMenu(
expanded = showMenu.value,
onDismissRequest = { showMenu.value = false },
Modifier.width(220.dp)
) {
DefaultDropdownMenu(showMenu) {
if (cItem.meta.itemDeleted == null && !live) {
ItemAction(stringResource(R.string.reply_verb), Icons.Outlined.Reply, onClick = {
if (composeState.value.editing) {
@@ -168,8 +163,8 @@ fun ChatItemView(
}
)
}
if (cItem.meta.itemDeleted == null && cItem.file != null && cItem.file.cancellable) {
CancelFileItemAction(cItem.file.fileId, showMenu, cancelFile = cancelFile)
if (cItem.meta.itemDeleted == null && cItem.file != null && cItem.file.cancelAction != null) {
CancelFileItemAction(cItem.file.fileId, showMenu, cancelFile = cancelFile, cancelAction = cItem.file.cancelAction)
}
if (!(live && cItem.meta.isLive)) {
DeleteItemAction(cItem, showMenu, questionText = deleteMessageQuestionText(), deleteMessage)
@@ -183,11 +178,7 @@ fun ChatItemView(
@Composable
fun MarkedDeletedItemDropdownMenu() {
DropdownMenu(
expanded = showMenu.value,
onDismissRequest = { showMenu.value = false },
Modifier.width(220.dp)
) {
DefaultDropdownMenu(showMenu) {
if (!cItem.isDeletedContent) {
ItemAction(
stringResource(R.string.reveal_verb),
@@ -227,11 +218,7 @@ fun ChatItemView(
@Composable fun DeletedItem() {
DeletedItemView(cItem, cInfo.timedMessagesTTL, showMember = showMember)
DropdownMenu(
expanded = showMenu.value,
onDismissRequest = { showMenu.value = false },
Modifier.width(220.dp)
) {
DefaultDropdownMenu(showMenu) {
DeleteItemAction(cItem, showMenu, questionText = deleteMessageQuestionText(), deleteMessage)
}
}
@@ -247,7 +234,8 @@ fun ChatItemView(
is CIContent.RcvDeleted -> DeletedItem()
is CIContent.SndCall -> CallItem(c.status, c.duration)
is CIContent.RcvCall -> CallItem(c.status, c.duration)
is CIContent.RcvIntegrityError -> IntegrityErrorItemView(cItem, cInfo.timedMessagesTTL, showMember = showMember)
is CIContent.RcvIntegrityError -> IntegrityErrorItemView(c.msgError, cItem, cInfo.timedMessagesTTL, showMember = showMember)
is CIContent.RcvDecryptionError -> CIRcvDecryptionError(c.msgDecryptError, c.msgCount, cItem, cInfo.timedMessagesTTL, showMember = showMember)
is CIContent.RcvGroupInvitation -> CIGroupInvitationView(cItem, c.groupInvitation, c.memberRole, joinGroup = joinGroup, chatIncognito = cInfo.incognito)
is CIContent.SndGroupInvitation -> CIGroupInvitationView(cItem, c.groupInvitation, c.memberRole, joinGroup = joinGroup, chatIncognito = cInfo.incognito)
is CIContent.RcvGroupEventContent -> CIEventView(cItem)
@@ -277,14 +265,15 @@ fun ChatItemView(
fun CancelFileItemAction(
fileId: Long,
showMenu: MutableState<Boolean>,
cancelFile: (Long) -> Unit
cancelFile: (Long) -> Unit,
cancelAction: CancelAction
) {
ItemAction(
stringResource(R.string.cancel_verb),
stringResource(cancelAction.uiActionId),
Icons.Outlined.Close,
onClick = {
showMenu.value = false
cancelFileAlertDialog(fileId, cancelFile = cancelFile)
cancelFileAlertDialog(fileId, cancelFile = cancelFile, cancelAction = cancelAction)
},
color = Color.Red
)
@@ -327,27 +316,30 @@ fun ModerateItemAction(
}
@Composable
fun ItemAction(text: String, icon: ImageVector, onClick: () -> Unit, color: Color = MaterialTheme.colors.onBackground) {
DropdownMenuItem(onClick) {
Row {
fun ItemAction(text: String, icon: ImageVector, onClick: () -> Unit, color: Color = Color.Unspecified) {
val finalColor = if (color == Color.Unspecified) {
if (isInDarkTheme()) MenuTextColorDark else Color.Black
} else color
DropdownMenuItem(onClick, contentPadding = PaddingValues(horizontal = DEFAULT_PADDING * 1.5f)) {
Row(verticalAlignment = Alignment.CenterVertically) {
Text(
text,
modifier = Modifier
.fillMaxWidth()
.weight(1F)
.padding(end = 15.dp),
color = color
color = finalColor
)
Icon(icon, text, tint = color)
Icon(icon, text, tint = finalColor)
}
}
}
fun cancelFileAlertDialog(fileId: Long, cancelFile: (Long) -> Unit) {
fun cancelFileAlertDialog(fileId: Long, cancelFile: (Long) -> Unit, cancelAction: CancelAction) {
AlertManager.shared.showAlertDialog(
title = generalGetString(R.string.cancel_file__question),
text = generalGetString(R.string.file_transfer_will_be_cancelled_warning),
confirmText = generalGetString(R.string.confirm_verb),
title = generalGetString(cancelAction.alert.titleId),
text = generalGetString(cancelAction.alert.messageId),
confirmText = generalGetString(cancelAction.alert.confirmId),
destructive = true,
onConfirm = {
cancelFile(fileId)
@@ -364,7 +356,7 @@ fun deleteMessageAlertDialog(chatItem: ChatItem, questionText: String, deleteMes
Modifier
.fillMaxWidth()
.padding(horizontal = 8.dp, vertical = 2.dp),
horizontalArrangement = Arrangement.End,
horizontalArrangement = Arrangement.Center,
) {
TextButton(onClick = {
deleteMessage(chatItem.id, CIDeleteMode.cidmInternal)
@@ -17,19 +17,41 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import chat.simplex.app.R
import chat.simplex.app.model.ChatItem
import chat.simplex.app.model.MsgErrorType
import chat.simplex.app.ui.theme.SimpleXTheme
import chat.simplex.app.views.helpers.AlertManager
import chat.simplex.app.views.helpers.generalGetString
@Composable
fun IntegrityErrorItemView(ci: ChatItem, timedMessagesTTL: Int?, showMember: Boolean = false) {
fun IntegrityErrorItemView(msgError: MsgErrorType, ci: ChatItem, timedMessagesTTL: Int?, showMember: Boolean = false) {
CIMsgError(ci, timedMessagesTTL, showMember) {
when (msgError) {
is MsgErrorType.MsgSkipped ->
AlertManager.shared.showAlertMsg(
title = generalGetString(R.string.alert_title_skipped_messages),
text = generalGetString(R.string.alert_text_skipped_messages_it_can_happen_when)
)
is MsgErrorType.MsgBadHash ->
AlertManager.shared.showAlertMsg(
title = generalGetString(R.string.alert_title_msg_bad_hash),
text = generalGetString(R.string.alert_text_msg_bad_hash) + "\n" +
generalGetString(R.string.alert_text_fragment_encryption_out_of_sync_old_database) + "\n" +
generalGetString(R.string.alert_text_fragment_please_report_to_developers)
)
is MsgErrorType.MsgBadId, is MsgErrorType.MsgDuplicate ->
AlertManager.shared.showAlertMsg(
title = generalGetString(R.string.alert_title_msg_bad_id),
text = generalGetString(R.string.alert_text_msg_bad_id) + "\n" +
generalGetString(R.string.alert_text_fragment_please_report_to_developers)
)
}
}
}
@Composable
fun CIMsgError(ci: ChatItem, timedMessagesTTL: Int?, showMember: Boolean = false, onClick: () -> Unit) {
Surface(
Modifier.clickable(onClick = {
AlertManager.shared.showAlertMsg(
title = generalGetString(R.string.alert_title_skipped_messages),
text = generalGetString(R.string.alert_text_skipped_messages_it_can_happen_when)
)
}),
Modifier.clickable(onClick = onClick),
shape = RoundedCornerShape(18.dp),
color = ReceivedColorLight,
) {
@@ -59,6 +81,7 @@ fun IntegrityErrorItemView(ci: ChatItem, timedMessagesTTL: Int?, showMember: Boo
fun IntegrityErrorItemViewPreview() {
SimpleXTheme {
IntegrityErrorItemView(
MsgErrorType.MsgBadHash(),
ChatItem.getDeletedContentSampleData(),
null
)
@@ -194,26 +194,14 @@ fun MarkReadChatAction(chat: Chat, chatModel: ChatModel, showMenu: MutableState<
@Composable
fun MarkUnreadChatAction(chat: Chat, chatModel: ChatModel, showMenu: MutableState<Boolean>) {
DropdownMenuItem({
markChatUnread(chat, chatModel)
showMenu.value = false
}) {
Row {
Text(
stringResource(R.string.mark_unread),
modifier = Modifier
.fillMaxWidth()
.weight(1F)
.padding(end = 15.dp),
color = MaterialTheme.colors.onBackground
)
Icon(
Icons.Outlined.MarkChatUnread,
stringResource(R.string.mark_unread),
tint = MaterialTheme.colors.onBackground
)
ItemAction(
stringResource(R.string.mark_unread),
Icons.Outlined.MarkChatUnread,
onClick = {
markChatUnread(chat, chatModel)
showMenu.value = false
}
}
)
}
@Composable
@@ -447,7 +435,7 @@ fun contactConnectionAlertDialog(connection: PendingContactConnection, chatModel
Modifier
.fillMaxWidth()
.padding(horizontal = 8.dp, vertical = 2.dp),
horizontalArrangement = Arrangement.End,
horizontalArrangement = Arrangement.Center,
) {
TextButton(onClick = {
AlertManager.shared.hideAlert()
@@ -589,15 +577,7 @@ fun ChatListNavLinkLayout(
chatLinkPreview()
}
if (dropdownMenuItems != null) {
Box(Modifier.padding(horizontal = 16.dp)) {
DropdownMenu(
expanded = showMenu.value,
onDismissRequest = { showMenu.value = false },
Modifier.width(220.dp)
) {
dropdownMenuItems()
}
}
DefaultDropdownMenu(showMenu, dropdownMenuItems = dropdownMenuItems)
}
}
Divider(Modifier.padding(horizontal = 8.dp))
@@ -1,19 +1,20 @@
package chat.simplex.app.views.chatlist
import SectionItemView
import SectionItemViewSpaceBetween
import android.util.Log
import androidx.compose.animation.core.*
import androidx.compose.foundation.*
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.*
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.*
import androidx.compose.material.icons.outlined.*
import androidx.compose.runtime.*
import androidx.compose.ui.*
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.draw.*
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.platform.LocalConfiguration
@@ -105,15 +106,16 @@ fun UserPicker(
) {
Column(
Modifier
.widthIn(min = 220.dp)
.widthIn(min = 260.dp)
.width(IntrinsicSize.Min)
.height(IntrinsicSize.Min)
.shadow(8.dp, MaterialTheme.shapes.medium, clip = false)
.background(if (isInDarkTheme()) MaterialTheme.colors.background.darker(-0.7f) else MaterialTheme.colors.background, MaterialTheme.shapes.medium)
.shadow(8.dp, RoundedCornerShape(corner = CornerSize(25.dp)), clip = true)
.background(if (isInDarkTheme()) Color(0xff222222) else MaterialTheme.colors.background, RoundedCornerShape(corner = CornerSize(25.dp)))
.clip(RoundedCornerShape(corner = CornerSize(25.dp)))
) {
Column(Modifier.weight(1f).verticalScroll(rememberScrollState())) {
users.forEach { u ->
UserProfilePickerItem(u.user, u.unreadCount, openSettings = {
UserProfilePickerItem(u.user, u.unreadCount, PaddingValues(start = DEFAULT_PADDING, end = DEFAULT_PADDING * 2), openSettings = {
settingsClicked()
userPickerState.value = AnimatedViewState.GONE
}) {
@@ -151,7 +153,7 @@ fun UserPicker(
}
@Composable
fun UserProfilePickerItem(u: User, unreadCount: Int = 0, onLongClick: () -> Unit = {}, openSettings: () -> Unit = {}, onClick: () -> Unit) {
fun UserProfilePickerItem(u: User, unreadCount: Int = 0, padding: PaddingValues = PaddingValues(start = 8.dp, end = DEFAULT_PADDING), onLongClick: () -> Unit = {}, openSettings: () -> Unit = {}, onClick: () -> Unit) {
Row(
Modifier
.fillMaxWidth()
@@ -162,7 +164,7 @@ fun UserProfilePickerItem(u: User, unreadCount: Int = 0, onLongClick: () -> Unit
interactionSource = remember { MutableInteractionSource() },
indication = if (!u.activeUser) LocalIndication.current else null
)
.padding(PaddingValues(start = 8.dp, end = DEFAULT_PADDING)),
.padding(padding),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
@@ -211,6 +213,7 @@ fun UserProfileRow(u: User) {
u.displayName,
modifier = Modifier
.padding(start = 8.dp, end = 8.dp),
color = if (isInDarkTheme()) MenuTextColorDark else Color.Black,
fontWeight = if (u.activeUser) FontWeight.Medium else FontWeight.Normal
)
}
@@ -218,24 +221,26 @@ fun UserProfileRow(u: User) {
@Composable
private fun SettingsPickerItem(onClick: () -> Unit) {
SectionItemViewSpaceBetween(onClick, minHeight = 68.dp) {
SectionItemView(onClick, padding = PaddingValues(start = DEFAULT_PADDING * 2.2f, end = DEFAULT_PADDING * 2), minHeight = 68.dp) {
val text = generalGetString(R.string.settings_section_title_settings).lowercase().capitalize(Locale.current)
Icon(Icons.Outlined.Settings, text, Modifier.size(20.dp), tint = MaterialTheme.colors.onBackground)
Spacer(Modifier.width(DEFAULT_PADDING * 1.5f))
Text(
text,
color = MaterialTheme.colors.onBackground,
color = if (isInDarkTheme()) MenuTextColorDark else Color.Black,
)
Icon(Icons.Outlined.Settings, text, Modifier.size(20.dp), tint = MaterialTheme.colors.onBackground)
}
}
@Composable
private fun CancelPickerItem(onClick: () -> Unit) {
SectionItemViewSpaceBetween(onClick, minHeight = 68.dp) {
SectionItemViewSpaceBetween(onClick, padding = PaddingValues(start = DEFAULT_PADDING * 2.2f, end = DEFAULT_PADDING * 2), minHeight = 68.dp) {
val text = generalGetString(R.string.cancel_verb)
Icon(Icons.Outlined.Close, text, Modifier.size(20.dp), tint = MaterialTheme.colors.onBackground)
Spacer(Modifier.width(DEFAULT_PADDING * 1.5f))
Text(
text,
color = MaterialTheme.colors.onBackground,
color = if (isInDarkTheme()) MenuTextColorDark else Color.Black,
)
Icon(Icons.Outlined.Close, text, Modifier.size(20.dp), tint = MaterialTheme.colors.onBackground)
}
}
@@ -3,13 +3,15 @@ package chat.simplex.app.views.helpers
import android.util.Log
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CornerSize
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.*
import androidx.compose.ui.window.Dialog
import chat.simplex.app.R
@@ -33,13 +35,14 @@ class AlertManager {
text: String? = null,
buttons: @Composable () -> Unit,
) {
val alertText: (@Composable () -> Unit)? = if (text == null) null else { -> Text(text) }
showAlert {
AlertDialog(
backgroundColor = if (isInDarkTheme()) Color(0xff222222) else MaterialTheme.colors.background,
onDismissRequest = this::hideAlert,
title = { Text(title) },
text = alertText,
buttons = buttons
title = alertTitle(title),
text = alertText(text),
buttons = buttons,
shape = RoundedCornerShape(corner = CornerSize(25.dp))
)
}
}
@@ -51,22 +54,21 @@ class AlertManager {
) {
showAlert {
Dialog(onDismissRequest = this::hideAlert) {
Column(Modifier.background(MaterialTheme.colors.background, MaterialTheme.shapes.medium)) {
Text(title,
Modifier.padding(start = DEFAULT_PADDING, end = DEFAULT_PADDING, top = DEFAULT_PADDING, bottom = if (text == null) DEFAULT_PADDING else DEFAULT_PADDING_HALF),
fontSize = 15.sp,
fontWeight = FontWeight.SemiBold
Column(
Modifier
.background(if (isInDarkTheme()) Color(0xff222222) else MaterialTheme.colors.background, RoundedCornerShape(corner = CornerSize(25.dp)))
.padding(bottom = DEFAULT_PADDING)
) {
Text(
title,
Modifier.fillMaxWidth().padding(vertical = DEFAULT_PADDING),
textAlign = TextAlign.Center,
fontSize = 20.sp
)
if (text != null) {
CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.high) {
Text(
text,
Modifier.padding(start = DEFAULT_PADDING, end = DEFAULT_PADDING, bottom = DEFAULT_PADDING),
fontSize = 14.sp,
)
}
}
CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.high) {
if (text != null) {
Text(text, Modifier.fillMaxWidth().padding(start = DEFAULT_PADDING, end = DEFAULT_PADDING, bottom = DEFAULT_PADDING * 1.5f), fontSize = 16.sp, textAlign = TextAlign.Center, color = HighOrLowlight)
}
buttons()
}
}
@@ -84,24 +86,28 @@ class AlertManager {
onDismissRequest: (() -> Unit)? = null,
destructive: Boolean = false
) {
val alertText: (@Composable () -> Unit)? = if (text == null) null else { -> Text(text) }
showAlert {
AlertDialog(
onDismissRequest = { onDismissRequest?.invoke(); hideAlert() },
title = { Text(title) },
text = alertText,
confirmButton = {
TextButton(onClick = {
onConfirm?.invoke()
hideAlert()
}) { Text(confirmText, color = if (destructive) MaterialTheme.colors.error else Color.Unspecified) }
title = alertTitle(title),
text = alertText(text),
buttons = {
Row (
Modifier.fillMaxWidth().padding(horizontal = DEFAULT_PADDING).padding(bottom = DEFAULT_PADDING_HALF),
horizontalArrangement = Arrangement.SpaceBetween
) {
TextButton(onClick = {
onDismiss?.invoke()
hideAlert()
}) { Text(dismissText) }
TextButton(onClick = {
onConfirm?.invoke()
hideAlert()
}) { Text(confirmText, color = if (destructive) MaterialTheme.colors.error else Color.Unspecified) }
}
},
dismissButton = {
TextButton(onClick = {
onDismiss?.invoke()
hideAlert()
}) { Text(dismissText) }
}
backgroundColor = if (isInDarkTheme()) Color(0xff222222) else MaterialTheme.colors.background,
shape = RoundedCornerShape(corner = CornerSize(25.dp))
)
}
}
@@ -116,16 +122,15 @@ class AlertManager {
onDismissRequest: (() -> Unit)? = null,
destructive: Boolean = false
) {
val alertText: (@Composable () -> Unit)? = if (text == null) null else { -> Text(text) }
showAlert {
AlertDialog(
onDismissRequest = { onDismissRequest?.invoke(); hideAlert() },
title = { Text(title) },
text = alertText,
title = alertTitle(title),
text = alertText(text),
buttons = {
Column(
Modifier.fillMaxWidth().padding(horizontal = 8.dp).padding(top = 16.dp, bottom = 2.dp),
horizontalAlignment = Alignment.End
horizontalAlignment = Alignment.CenterHorizontally
) {
TextButton(onClick = {
onDismiss?.invoke()
@@ -134,9 +139,11 @@ class AlertManager {
TextButton(onClick = {
onConfirm?.invoke()
hideAlert()
}) { Text(confirmText, color = if (destructive) MaterialTheme.colors.error else Color.Unspecified) }
}) { Text(confirmText, color = if (destructive) Color.Red else Color.Unspecified, textAlign = TextAlign.End) }
}
},
backgroundColor = if (isInDarkTheme()) Color(0xff222222) else MaterialTheme.colors.background,
shape = RoundedCornerShape(corner = CornerSize(25.dp))
)
}
}
@@ -145,18 +152,24 @@ class AlertManager {
title: String, text: String? = null,
confirmText: String = generalGetString(R.string.ok), onConfirm: (() -> Unit)? = null
) {
val alertText: (@Composable () -> Unit)? = if (text == null) null else { -> Text(text) }
showAlert {
AlertDialog(
onDismissRequest = this::hideAlert,
title = { Text(title) },
text = alertText,
confirmButton = {
TextButton(onClick = {
onConfirm?.invoke()
hideAlert()
}) { Text(confirmText) }
}
title = alertTitle(title),
text = alertText(text),
buttons = {
Row(
Modifier.fillMaxWidth().padding(horizontal = DEFAULT_PADDING).padding(bottom = DEFAULT_PADDING_HALF),
horizontalArrangement = Arrangement.Center
) {
TextButton(onClick = {
onConfirm?.invoke()
hideAlert()
}) { Text(confirmText, color = Color.Unspecified) }
}
},
backgroundColor = if (isInDarkTheme()) Color(0xff222222) else MaterialTheme.colors.background,
shape = RoundedCornerShape(corner = CornerSize(25.dp))
)
}
}
@@ -177,3 +190,30 @@ class AlertManager {
val shared = AlertManager()
}
}
private fun alertTitle(title: String): (@Composable () -> Unit)? {
return {
Text(
title,
Modifier.fillMaxWidth(),
textAlign = TextAlign.Center,
fontSize = 20.sp
)
}
}
private fun alertText(text: String?): (@Composable () -> Unit)? {
return if (text == null) {
null
} else {
({
Text(
text,
Modifier.fillMaxWidth(),
textAlign = TextAlign.Center,
fontSize = 16.sp,
color = HighOrLowlight
)
})
}
}
@@ -13,9 +13,10 @@ import chat.simplex.app.R
import chat.simplex.app.views.newchat.ActionButton
sealed class AttachmentOption {
object TakePhoto: AttachmentOption()
object PickMedia: AttachmentOption()
object PickFile: AttachmentOption()
object CameraPhoto: AttachmentOption()
object GalleryImage: AttachmentOption()
object GalleryVideo: AttachmentOption()
object File: AttachmentOption()
}
@Composable
@@ -38,15 +39,19 @@ fun ChooseAttachmentView(
horizontalArrangement = Arrangement.SpaceEvenly
) {
ActionButton(null, stringResource(R.string.use_camera_button), icon = Icons.Outlined.PhotoCamera) {
attachmentOption.value = AttachmentOption.TakePhoto
attachmentOption.value = AttachmentOption.CameraPhoto
hide()
}
ActionButton(null, stringResource(R.string.from_gallery_button), icon = Icons.Outlined.Collections) {
attachmentOption.value = AttachmentOption.PickMedia
ActionButton(null, stringResource(R.string.gallery_image_button), icon = Icons.Outlined.Image) {
attachmentOption.value = AttachmentOption.GalleryImage
hide()
}
ActionButton(null, stringResource(R.string.gallery_video_button), icon = Icons.Outlined.SmartDisplay) {
attachmentOption.value = AttachmentOption.GalleryVideo
hide()
}
ActionButton(null, stringResource(R.string.choose_file), icon = Icons.Outlined.InsertDriveFile) {
attachmentOption.value = AttachmentOption.PickFile
attachmentOption.value = AttachmentOption.File
hide()
}
}
@@ -6,13 +6,15 @@ import androidx.compose.material.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import chat.simplex.app.R
import chat.simplex.app.ui.theme.*
@Composable
fun CloseSheetBar(close: () -> Unit, endButtons: @Composable RowScope.() -> Unit = {}) {
fun CloseSheetBar(close: (() -> Unit)?, endButtons: @Composable RowScope.() -> Unit = {}) {
Column(
Modifier
.fillMaxWidth()
@@ -28,7 +30,7 @@ fun CloseSheetBar(close: () -> Unit, endButtons: @Composable RowScope.() -> Unit
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
NavigationButtonBack(close)
NavigationButtonBack(onButtonClicked = close)
Row {
endButtons()
}
@@ -54,6 +56,19 @@ fun AppBarTitle(title: String, withPadding: Boolean = true) {
)
}
@Composable
fun ColumnScope.AppBarTitleCentered(title: String, withPadding: Boolean = true) {
Text(
title,
Modifier
.padding(bottom = if (withPadding) DEFAULT_PADDING * 1.5f else 0.dp)
.align(Alignment.CenterHorizontally),
overflow = TextOverflow.Ellipsis,
style = MaterialTheme.typography.h1,
color = MaterialTheme.colors.primary
)
}
@Preview(showBackground = true)
@Preview(
uiMode = Configuration.UI_MODE_NIGHT_YES,
@@ -0,0 +1,58 @@
package chat.simplex.app.views.helpers
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CornerSize
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.DpOffset
import androidx.compose.ui.unit.dp
import chat.simplex.app.ui.theme.*
@Composable
fun DefaultDropdownMenu(
showMenu: MutableState<Boolean>,
offset: DpOffset = DpOffset(0.dp, 0.dp),
dropdownMenuItems: (@Composable () -> Unit)?
) {
MaterialTheme(
colors = MaterialTheme.colors.copy(surface = if (isInDarkTheme()) Color(0xFF080808) else MaterialTheme.colors.background),
shapes = MaterialTheme.shapes.copy(medium = RoundedCornerShape(corner = CornerSize(25.dp)))
) {
DropdownMenu(
expanded = showMenu.value,
onDismissRequest = { showMenu.value = false },
Modifier
.widthIn(min = 250.dp)
.padding(vertical = 4.dp),
offset = offset,
) {
dropdownMenuItems?.invoke()
}
}
}
@Composable
fun ExposedDropdownMenuBoxScope.DefaultExposedDropdownMenu(
expanded: MutableState<Boolean>,
modifier: Modifier = Modifier,
dropdownMenuItems: (@Composable () -> Unit)?
) {
MaterialTheme(
colors = MaterialTheme.colors.copy(surface = if (isInDarkTheme()) Color(0xFF080808) else MaterialTheme.colors.background),
shapes = MaterialTheme.shapes.copy(medium = RoundedCornerShape(corner = CornerSize(25.dp)))
) {
ExposedDropdownMenu(
modifier = Modifier.widthIn(min = 200.dp).then(modifier),
expanded = expanded.value,
onDismissRequest = {
expanded.value = false
}
) {
dropdownMenuItems?.invoke()
}
}
}
@@ -45,10 +45,10 @@ fun DefaultTopAppBar(
}
@Composable
fun NavigationButtonBack(onButtonClicked: () -> Unit) {
IconButton(onButtonClicked) {
fun NavigationButtonBack(onButtonClicked: (() -> Unit)?) {
IconButton(onButtonClicked ?: {}, enabled = onButtonClicked != null) {
Icon(
Icons.Outlined.ArrowBackIos, stringResource(R.string.back), tint = MaterialTheme.colors.primary
Icons.Outlined.ArrowBackIos, stringResource(R.string.back), tint = if (onButtonClicked != null) MaterialTheme.colors.primary else HighOrLowlight
)
}
}
@@ -15,8 +15,7 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import chat.simplex.app.R
import chat.simplex.app.ui.theme.DEFAULT_PADDING
import chat.simplex.app.ui.theme.HighOrLowlight
import chat.simplex.app.ui.theme.*
@Composable
fun <T> ExposedDropDownSettingRow(
@@ -33,7 +32,7 @@ fun <T> ExposedDropDownSettingRow(
Modifier.fillMaxWidth().padding(vertical = 10.dp),
verticalAlignment = Alignment.CenterVertically,
) {
var expanded by remember { mutableStateOf(false) }
val expanded = remember { mutableStateOf(false) }
if (icon != null) {
Icon(
@@ -46,9 +45,9 @@ fun <T> ExposedDropDownSettingRow(
Text(title, Modifier.weight(1f), color = if (enabled.value) Color.Unspecified else HighOrLowlight)
ExposedDropdownMenuBox(
expanded = expanded,
expanded = expanded.value,
onExpandedChange = {
expanded = !expanded && enabled.value
expanded.value = !expanded.value && enabled.value
}
) {
Row(
@@ -66,29 +65,28 @@ fun <T> ExposedDropDownSettingRow(
)
Spacer(Modifier.size(12.dp))
Icon(
if (!expanded) Icons.Outlined.ExpandMore else Icons.Outlined.ExpandLess,
if (!expanded.value) Icons.Outlined.ExpandMore else Icons.Outlined.ExpandLess,
generalGetString(R.string.icon_descr_more_button),
tint = HighOrLowlight
)
}
ExposedDropdownMenu(
DefaultExposedDropdownMenu(
modifier = Modifier.widthIn(min = 200.dp),
expanded = expanded,
onDismissRequest = {
expanded = false
}
) {
values.forEach { selectionOption ->
DropdownMenuItem(
onClick = {
onSelected(selectionOption.first)
expanded = false
}
expanded.value = false
},
contentPadding = PaddingValues(horizontal = DEFAULT_PADDING * 1.5f)
) {
Text(
selectionOption.second + (if (label != null) " $label" else ""),
maxLines = 1,
overflow = TextOverflow.Ellipsis,
color = if (isInDarkTheme()) MenuTextColorDark else Color.Black,
)
}
}
@@ -18,8 +18,7 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.CallSuper
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Collections
import androidx.compose.material.icons.outlined.PhotoCamera
import androidx.compose.material.icons.outlined.*
import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.Saver
import androidx.compose.runtime.saveable.rememberSaveable
@@ -259,7 +258,7 @@ fun GetImageBottomSheet(
}
}
}
ActionButton(null, stringResource(R.string.from_gallery_button), icon = Icons.Outlined.Collections) {
ActionButton(null, stringResource(R.string.from_gallery_button), icon = Icons.Outlined.Image) {
try {
galleryLauncher.launch(0)
} catch (e: ActivityNotFoundException) {
@@ -12,6 +12,8 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
@@ -28,6 +30,21 @@ fun SimpleButton(text: String, icon: ImageVector,
}
}
@Composable
fun SimpleButtonDecorated(text: String, icon: ImageVector,
color: Color = MaterialTheme.colors.primary,
textDecoration: TextDecoration = TextDecoration.Underline,
fontWeight: FontWeight = FontWeight.Normal,
click: () -> Unit) {
SimpleButtonFrame(click) {
Icon(
icon, text, tint = color,
modifier = Modifier.padding(end = 8.dp)
)
Text(text, style = MaterialTheme.typography.caption, fontWeight = fontWeight, color = color, textDecoration = textDecoration)
}
}
@Composable
fun SimpleButton(
text: String, icon: ImageVector,
@@ -61,9 +78,9 @@ fun SimpleButtonIconEnded(
}
@Composable
fun SimpleButtonFrame(click: () -> Unit, disabled: Boolean = false, content: @Composable () -> Unit) {
fun SimpleButtonFrame(click: () -> Unit, modifier: Modifier = Modifier, disabled: Boolean = false, content: @Composable () -> Unit) {
Surface(shape = RoundedCornerShape(20.dp)) {
val modifier = if (disabled) Modifier else Modifier.clickable { click() }
val modifier = if (disabled) modifier else modifier.clickable { click() }
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = modifier.padding(8.dp)
@@ -88,13 +88,14 @@ fun AddContactLayout(connReq: String, connIncognito: Boolean, share: () -> Unit)
}
@Composable
fun InfoAboutIncognito(chatModelIncognito: Boolean, supportedIncognito: Boolean = true, onText: String, offText: String) {
fun InfoAboutIncognito(chatModelIncognito: Boolean, supportedIncognito: Boolean = true, onText: String, offText: String, centered: Boolean = false) {
if (chatModelIncognito) {
Row(
Modifier
.fillMaxWidth()
.padding(vertical = 4.dp),
verticalAlignment = Alignment.CenterVertically
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = if (centered) Arrangement.Center else Arrangement.Start
) {
Icon(
if (supportedIncognito) Icons.Filled.TheaterComedy else Icons.Outlined.Info,
@@ -102,14 +103,15 @@ fun InfoAboutIncognito(chatModelIncognito: Boolean, supportedIncognito: Boolean
tint = if (supportedIncognito) Indigo else WarningOrange,
modifier = Modifier.padding(end = 10.dp).size(20.dp)
)
Text(onText, textAlign = TextAlign.Left, style = MaterialTheme.typography.body2)
Text(onText, textAlign = if (centered) TextAlign.Center else TextAlign.Left, style = MaterialTheme.typography.body2)
}
} else {
Row(
Modifier
.fillMaxWidth()
.padding(vertical = 4.dp),
verticalAlignment = Alignment.CenterVertically
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = if (centered) Arrangement.Center else Arrangement.Start
) {
Icon(
Icons.Outlined.Info,
@@ -117,7 +119,7 @@ fun InfoAboutIncognito(chatModelIncognito: Boolean, supportedIncognito: Boolean
tint = HighOrLowlight,
modifier = Modifier.padding(end = 10.dp).size(20.dp)
)
Text(offText, textAlign = TextAlign.Left, style = MaterialTheme.typography.body2)
Text(offText, textAlign = if (centered) TextAlign.Center else TextAlign.Left, style = MaterialTheme.typography.body2)
}
}
}
@@ -1,6 +1,5 @@
package chat.simplex.app.views.newchat
import android.graphics.Bitmap
import android.net.Uri
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
@@ -15,6 +14,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@@ -26,6 +27,7 @@ import chat.simplex.app.views.chat.group.AddGroupMembersView
import chat.simplex.app.views.chatlist.setGroupMembers
import chat.simplex.app.views.helpers.*
import chat.simplex.app.views.isValidDisplayName
import chat.simplex.app.views.onboarding.ReadableText
import chat.simplex.app.views.usersettings.DeleteImageButton
import chat.simplex.app.views.usersettings.EditImageButton
import com.google.accompanist.insets.ProvideWindowInsets
@@ -36,7 +38,6 @@ import kotlinx.coroutines.launch
@Composable
fun AddGroupView(chatModel: ChatModel, close: () -> Unit) {
AddGroupLayout(
chatModel.incognito.value,
createGroup = { groupProfile ->
withApi {
val groupInfo = chatModel.controller.apiNewGroup(groupProfile)
@@ -57,11 +58,11 @@ fun AddGroupView(chatModel: ChatModel, close: () -> Unit) {
}
@Composable
fun AddGroupLayout(chatModelIncognito: Boolean, createGroup: (GroupProfile) -> Unit, close: () -> Unit) {
fun AddGroupLayout(createGroup: (GroupProfile) -> Unit, close: () -> Unit) {
val bottomSheetModalState = rememberModalBottomSheetState(initialValue = ModalBottomSheetValue.Hidden)
val scope = rememberCoroutineScope()
val displayName = remember { mutableStateOf("") }
val fullName = remember { mutableStateOf("") }
val displayName = rememberSaveable { mutableStateOf("") }
val fullName = rememberSaveable { mutableStateOf("") }
val chosenImage = rememberSaveable { mutableStateOf<Uri?>(null) }
val profileImage = rememberSaveable { mutableStateOf<String?>(null) }
val focusRequester = remember { FocusRequester() }
@@ -88,14 +89,8 @@ fun AddGroupLayout(chatModelIncognito: Boolean, createGroup: (GroupProfile) -> U
.verticalScroll(rememberScrollState())
.padding(horizontal = DEFAULT_PADDING)
) {
AppBarTitle(stringResource(R.string.create_secret_group_title), false)
Text(stringResource(R.string.group_is_decentralized))
InfoAboutIncognito(
chatModelIncognito,
false,
generalGetString(R.string.group_unsupported_incognito_main_profile_sent),
generalGetString(R.string.group_main_profile_sent)
)
AppBarTitleCentered(stringResource(R.string.create_secret_group_title))
ReadableText(R.string.group_is_decentralized, TextAlign.Center)
Box(
Modifier
.fillMaxWidth()
@@ -104,7 +99,7 @@ fun AddGroupLayout(chatModelIncognito: Boolean, createGroup: (GroupProfile) -> U
) {
Box(contentAlignment = Alignment.TopEnd) {
Box(contentAlignment = Alignment.Center) {
ProfileImage(size = 192.dp, image = profileImage.value)
ProfileImage(108.dp, image = profileImage.value)
EditImageButton { scope.launch { bottomSheetModalState.show() } }
}
if (profileImage.value != null) {
@@ -112,24 +107,28 @@ fun AddGroupLayout(chatModelIncognito: Boolean, createGroup: (GroupProfile) -> U
}
}
}
Text(
stringResource(R.string.group_display_name_field),
Modifier.padding(bottom = 3.dp)
)
ProfileNameField(displayName, focusRequester)
val errorText = if (!isValidDisplayName(displayName.value)) stringResource(R.string.display_name_cannot_contain_whitespace) else ""
Text(
errorText,
fontSize = 15.sp,
color = MaterialTheme.colors.error
)
Spacer(Modifier.height(3.dp))
Row(Modifier.padding(bottom = DEFAULT_PADDING_HALF).fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
Text(
stringResource(R.string.group_display_name_field),
fontSize = 16.sp
)
if (!isValidDisplayName(displayName.value)) {
Spacer(Modifier.size(DEFAULT_PADDING_HALF))
Text(
stringResource(R.string.no_spaces),
fontSize = 16.sp,
color = Color.Red
)
}
}
ProfileNameField(displayName, "", ::isValidDisplayName, focusRequester)
Spacer(Modifier.height(DEFAULT_PADDING))
Text(
stringResource(R.string.group_full_name_field),
Modifier.padding(bottom = 5.dp)
fontSize = 16.sp,
modifier = Modifier.padding(bottom = DEFAULT_PADDING_HALF)
)
ProfileNameField(fullName)
ProfileNameField(fullName, "")
Spacer(Modifier.height(8.dp))
val enabled = displayName.value.isNotEmpty() && isValidDisplayName(displayName.value)
if (enabled) {
@@ -163,7 +162,7 @@ fun CreateGroupButton(color: Color, modifier: Modifier) {
) {
Surface(shape = RoundedCornerShape(20.dp)) {
Row(modifier, verticalAlignment = Alignment.CenterVertically) {
Text(stringResource(R.string.create_profile_button), style = MaterialTheme.typography.caption, color = color)
Text(stringResource(R.string.create_profile_button), style = MaterialTheme.typography.caption, color = color, fontWeight = FontWeight.Bold)
Icon(Icons.Outlined.ArrowForwardIos, stringResource(R.string.create_profile_button), tint = color)
}
}
@@ -175,7 +174,6 @@ fun CreateGroupButton(color: Color, modifier: Modifier) {
fun PreviewAddGroupLayout() {
SimpleXTheme {
AddGroupLayout(
chatModelIncognito = false,
createGroup = {},
close = {}
)
@@ -11,6 +11,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@@ -55,8 +56,13 @@ fun HowItWorks(user: User?, onboardingStage: MutableState<OnboardingStage?>? = n
}
@Composable
fun ReadableText(@StringRes stringResId: Int) {
Text(annotatedStringResource(stringResId), modifier = Modifier.padding(bottom = 12.dp), lineHeight = 22.sp)
fun ReadableText(@StringRes stringResId: Int, textAlign: TextAlign = TextAlign.Start, padding: PaddingValues = PaddingValues(bottom = 12.dp)) {
Text(annotatedStringResource(stringResId), modifier = Modifier.padding(padding), textAlign = textAlign, lineHeight = 22.sp)
}
@Composable
fun ReadableText(text: String, textAlign: TextAlign = TextAlign.Start, padding: PaddingValues = PaddingValues(bottom = 12.dp)) {
Text(text, modifier = Modifier.padding(padding), textAlign = textAlign, lineHeight = 22.sp)
}
@Preview(showBackground = true)
@@ -12,6 +12,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import chat.simplex.app.R
@@ -23,22 +25,22 @@ import chat.simplex.app.views.usersettings.changeNotificationsMode
@Composable
fun SetNotificationsMode(m: ChatModel) {
Column(
Modifier
.fillMaxSize()
.verticalScroll(rememberScrollState())
.padding(20.dp)
) {
AppBarTitle(stringResource(R.string.onboarding_notifications_mode_title), false)
val currentMode = rememberSaveable { mutableStateOf(NotificationsMode.default) }
Text(stringResource(R.string.onboarding_notifications_mode_subtitle))
Spacer(Modifier.padding(DEFAULT_PADDING_HALF))
Column(
modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())
) {
//CloseSheetBar(null)
AppBarTitleCentered(stringResource(R.string.onboarding_notifications_mode_title))
val currentMode = rememberSaveable { mutableStateOf(NotificationsMode.default) }
Column(Modifier.padding(horizontal = DEFAULT_PADDING * 1f)) {
Text(stringResource(R.string.onboarding_notifications_mode_subtitle), Modifier.fillMaxWidth(), textAlign = TextAlign.Center)
Spacer(Modifier.height(DEFAULT_PADDING * 2f))
NotificationButton(currentMode, NotificationsMode.OFF, R.string.onboarding_notifications_mode_off, R.string.onboarding_notifications_mode_off_desc)
NotificationButton(currentMode, NotificationsMode.PERIODIC, R.string.onboarding_notifications_mode_periodic, R.string.onboarding_notifications_mode_periodic_desc)
NotificationButton(currentMode, NotificationsMode.SERVICE, R.string.onboarding_notifications_mode_service, R.string.onboarding_notifications_mode_service_desc)
Spacer(Modifier.fillMaxHeight().weight(1f))
Box(Modifier.fillMaxWidth().padding(bottom = 16.dp), contentAlignment = Alignment.Center) {
OnboardingActionButton(R.string.use_chat, OnboardingStage.OnboardingComplete, m.onboardingStage) {
}
Spacer(Modifier.fillMaxHeight().weight(1f))
Box(Modifier.fillMaxWidth().padding(bottom = 16.dp), contentAlignment = Alignment.Center) {
OnboardingActionButton(R.string.use_chat, OnboardingStage.OnboardingComplete, m.onboardingStage, false) {
changeNotificationsMode(currentMode.value, m)
}
}
@@ -51,18 +53,24 @@ private fun NotificationButton(currentMode: MutableState<NotificationsMode>, mod
TextButton(
onClick = { currentMode.value = mode },
border = BorderStroke(1.dp, color = if (currentMode.value == mode) MaterialTheme.colors.primary else HighOrLowlight.copy(alpha = 0.5f)),
shape = RoundedCornerShape(15.dp),
shape = RoundedCornerShape(35.dp),
) {
Column(Modifier.padding(bottom = 6.dp).padding(horizontal = 8.dp)) {
Column(Modifier.padding(14.dp)) {
Text(
stringResource(title),
style = MaterialTheme.typography.h2,
fontWeight = FontWeight.Medium,
color = if (currentMode.value == mode) MaterialTheme.colors.primary else HighOrLowlight,
modifier = Modifier.padding(bottom = 4.dp)
modifier = Modifier.padding(bottom = 14.dp).align(Alignment.CenterHorizontally),
textAlign = TextAlign.Center
)
Text(annotatedStringResource(description),
Modifier.align(Alignment.CenterHorizontally),
color = MaterialTheme.colors.onBackground,
lineHeight = 24.sp,
textAlign = TextAlign.Center
)
Text(annotatedStringResource(description), color = MaterialTheme.colors.onBackground, lineHeight = 24.sp)
}
}
Spacer(Modifier.height(DEFAULT_PADDING))
Spacer(Modifier.height(14.dp))
}
@@ -4,6 +4,7 @@ import android.content.res.Configuration
import androidx.annotation.StringRes
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.ArrowForwardIos
@@ -44,13 +45,13 @@ fun SimpleXInfoLayout(
Modifier
.fillMaxSize()
.verticalScroll(rememberScrollState())
.padding(horizontal = DEFAULT_PADDING),
.padding(start = DEFAULT_PADDING * 1.5f, end = DEFAULT_PADDING * 1.5f, top = DEFAULT_PADDING * 4,/* bottom = DEFAULT_PADDING * 4*/),
) {
Box(Modifier.fillMaxWidth().padding(top = 8.dp), contentAlignment = Alignment.Center) {
Box(Modifier.fillMaxWidth().padding(top = 8.dp, bottom = 10.dp), contentAlignment = Alignment.Center) {
SimpleXLogo()
}
Text(stringResource(R.string.next_generation_of_private_messaging), style = MaterialTheme.typography.h2, modifier = Modifier.padding(bottom = 36.dp).padding(horizontal = 48.dp), textAlign = TextAlign.Center)
Text(stringResource(R.string.next_generation_of_private_messaging), style = MaterialTheme.typography.h2, modifier = Modifier.padding(bottom = 60.dp).padding(horizontal = 48.dp), textAlign = TextAlign.Center)
InfoRow(painterResource(R.drawable.privacy), R.string.privacy_redefined, R.string.first_platform_without_user_ids, width = 80.dp)
InfoRow(painterResource(R.drawable.shield), R.string.immune_to_spam_and_abuse, R.string.people_can_connect_only_via_links_you_share)
@@ -68,11 +69,12 @@ fun SimpleXInfoLayout(
Box(
Modifier
.fillMaxWidth()
.padding(bottom = 16.dp), contentAlignment = Alignment.Center
.padding(bottom = DEFAULT_PADDING, top = DEFAULT_PADDING), contentAlignment = Alignment.Center
) {
SimpleButton(text = stringResource(R.string.how_it_works), icon = Icons.Outlined.Info,
SimpleButtonDecorated(text = stringResource(R.string.how_it_works), icon = Icons.Outlined.Info,
click = showModal { HowItWorks(user, onboardingStage) })
}
Spacer(Modifier.weight(1f))
}
}
@@ -83,7 +85,7 @@ fun SimpleXLogo() {
contentDescription = stringResource(R.string.image_descr_simplex_logo),
modifier = Modifier
.padding(vertical = DEFAULT_PADDING)
.fillMaxWidth(0.80f)
.fillMaxWidth(0.60f)
)
}
@@ -103,9 +105,9 @@ private fun InfoRow(icon: Painter, @StringRes titleId: Int, @StringRes textId: I
@Composable
fun OnboardingActionButton(user: User?, onboardingStage: MutableState<OnboardingStage?>, onclick: (() -> Unit)? = null) {
if (user == null) {
OnboardingActionButton(R.string.create_your_profile, onboarding = OnboardingStage.Step2_CreateProfile, onboardingStage, onclick)
OnboardingActionButton(R.string.create_your_profile, onboarding = OnboardingStage.Step2_CreateProfile, onboardingStage, true, onclick)
} else {
OnboardingActionButton(R.string.make_private_connection, onboarding = OnboardingStage.OnboardingComplete, onboardingStage, onclick)
OnboardingActionButton(R.string.make_private_connection, onboarding = OnboardingStage.OnboardingComplete, onboardingStage, true, onclick)
}
}
@@ -114,16 +116,30 @@ fun OnboardingActionButton(
@StringRes labelId: Int,
onboarding: OnboardingStage?,
onboardingStage: MutableState<OnboardingStage?>,
border: Boolean,
onclick: (() -> Unit)?
) {
val modifier = if (border) {
Modifier
.border(border = BorderStroke(1.dp, MaterialTheme.colors.primary), shape = RoundedCornerShape(50))
.padding(
horizontal = DEFAULT_PADDING * 3,
vertical = 4.dp
)
} else {
Modifier
}
SimpleButtonFrame(click = {
onclick?.invoke()
onboardingStage.value = onboarding
}) {
Text(stringResource(labelId), style = MaterialTheme.typography.h2, color = MaterialTheme.colors.primary)
}, modifier) {
Text(stringResource(labelId), style = MaterialTheme.typography.h2, color = MaterialTheme.colors.primary, fontSize = 20.sp)
Icon(
Icons.Outlined.ArrowForwardIos, "next stage", tint = MaterialTheme.colors.primary,
modifier = Modifier.padding(end = 8.dp)
modifier = Modifier
.padding(start = 16.dp, top = 5.dp)
.size(15.dp)
)
}
}
@@ -1,7 +1,7 @@
package chat.simplex.app.views.onboarding
import android.content.res.Configuration
import androidx.compose.foundation.clickable
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.*
@@ -40,11 +40,13 @@ fun WhatsNewView(viaSettings: Boolean = false, close: () -> Unit) {
}
Column(
horizontalAlignment = Alignment.Start
horizontalAlignment = Alignment.Start,
modifier = Modifier.padding(bottom = 12.dp)
) {
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(8.dp)
horizontalArrangement = Arrangement.spacedBy(8.dp),
modifier = Modifier.padding(bottom = 4.dp)
) {
Icon(icon, stringResource(titleId), tint = HighOrLowlight)
Text(
@@ -107,8 +109,9 @@ fun WhatsNewView(viaSettings: Boolean = false, close: () -> Unit) {
ModalView(close = close) {
Column(
Modifier
.fillMaxWidth()
.padding(horizontal = DEFAULT_PADDING),
.fillMaxSize()
.padding(horizontal = DEFAULT_PADDING)
.verticalScroll(rememberScrollState()),
horizontalAlignment = Alignment.Start,
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
@@ -307,6 +310,27 @@ private val versionDescriptions: List<VersionDescription> = listOf(
)
)
),
VersionDescription(
version = "v5.0",
features = listOf(
FeatureDescription(
icon = Icons.Outlined.UploadFile,
titleId = R.string.v5_0_large_files_support,
descrId = R.string.v5_0_large_files_support_descr
),
FeatureDescription(
icon = Icons.Outlined.Lock,
titleId = R.string.v5_0_app_passcode,
descrId = R.string.v5_0_app_passcode_descr
),
FeatureDescription(
icon = Icons.Outlined.Translate,
titleId = R.string.v5_0_polish_interface,
descrId = R.string.v5_0_polish_interface_descr,
link = "https://github.com/simplex-chat/simplex-chat/tree/stable#translate-the-apps"
)
)
)
)
private val lastVersion = versionDescriptions.last().version
@@ -12,6 +12,7 @@ import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.*
import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
@@ -253,14 +254,14 @@ fun IntSettingRow(title: String, selection: MutableState<Int>, values: List<Int>
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween
) {
var expanded by remember { mutableStateOf(false) }
val expanded = rememberSaveable { mutableStateOf(false) }
Text(title)
ExposedDropdownMenuBox(
expanded = expanded,
expanded = expanded.value,
onExpandedChange = {
expanded = !expanded
expanded.value = !expanded.value
}
) {
Row(
@@ -276,24 +277,22 @@ fun IntSettingRow(title: String, selection: MutableState<Int>, values: List<Int>
)
Spacer(Modifier.size(4.dp))
Icon(
if (!expanded) Icons.Outlined.ExpandMore else Icons.Outlined.ExpandLess,
if (!expanded.value) Icons.Outlined.ExpandMore else Icons.Outlined.ExpandLess,
generalGetString(R.string.invite_to_group_button),
modifier = Modifier.padding(start = 8.dp),
tint = HighOrLowlight
)
}
ExposedDropdownMenu(
DefaultExposedDropdownMenu(
expanded = expanded,
onDismissRequest = {
expanded = false
}
) {
values.forEach { selectionOption ->
DropdownMenuItem(
onClick = {
selection.value = selectionOption
expanded = false
}
expanded.value = false
},
contentPadding = PaddingValues(horizontal = DEFAULT_PADDING * 1.5f)
) {
Text(
"$selectionOption $label",
@@ -314,14 +313,14 @@ fun TimeoutSettingRow(title: String, selection: MutableState<Long>, values: List
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween
) {
var expanded by remember { mutableStateOf(false) }
val expanded = remember { mutableStateOf(false) }
Text(title)
ExposedDropdownMenuBox(
expanded = expanded,
expanded = expanded.value,
onExpandedChange = {
expanded = !expanded
expanded.value = !expanded.value
}
) {
val df = DecimalFormat("#.#")
@@ -339,24 +338,22 @@ fun TimeoutSettingRow(title: String, selection: MutableState<Long>, values: List
)
Spacer(Modifier.size(4.dp))
Icon(
if (!expanded) Icons.Outlined.ExpandMore else Icons.Outlined.ExpandLess,
if (!expanded.value) Icons.Outlined.ExpandMore else Icons.Outlined.ExpandLess,
generalGetString(R.string.invite_to_group_button),
modifier = Modifier.padding(start = 8.dp),
tint = HighOrLowlight
)
}
ExposedDropdownMenu(
expanded = expanded,
onDismissRequest = {
expanded = false
}
DefaultExposedDropdownMenu(
expanded = expanded
) {
values.forEach { selectionOption ->
DropdownMenuItem(
onClick = {
selection.value = selectionOption
expanded = false
}
expanded.value = false
},
contentPadding = PaddingValues(horizontal = DEFAULT_PADDING * 1.5f)
) {
Text(
"${df.format(selectionOption / 1_000_000.toDouble())} $label",
@@ -43,16 +43,5 @@ fun DeveloperView(
generalGetString(R.string.developer_options)
)
SectionSpacer()
val xftpSendEnabled = m.controller.appPrefs.xftpSendEnabled
val xftpEnabled = remember { mutableStateOf(xftpSendEnabled.get()) }
SectionView(generalGetString(R.string.settings_section_title_experimenta)) {
SettingsPreferenceItem(Icons.Outlined.UploadFile, stringResource(R.string.settings_send_files_via_xftp), xftpSendEnabled, xftpEnabled) {
withApi { m.controller.apiSetXFTPConfig(m.controller.getXFTPCfg()) }
}
}
if (xftpEnabled.value) {
SectionTextFooter(generalGetString(R.string.xftp_requires_v461))
}
}
}
@@ -1,37 +0,0 @@
package chat.simplex.app.views.usersettings
import SectionView
import androidx.compose.foundation.layout.*
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.UploadFile
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import chat.simplex.app.R
import chat.simplex.app.model.ChatModel
import chat.simplex.app.views.helpers.withApi
@Composable
fun ExperimentalFeaturesView(chatModel: ChatModel) {
Column(
Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.Start
) {
Text(
stringResource(R.string.settings_experimental_features),
style = MaterialTheme.typography.h1,
modifier = Modifier.padding(start = 16.dp, bottom = 24.dp)
)
SectionView("") {
SettingsPreferenceItem(Icons.Outlined.UploadFile, stringResource(R.string.settings_send_files_via_xftp), chatModel.controller.appPrefs.xftpSendEnabled) {
withApi {
chatModel.controller.apiSetXFTPConfig(chatModel.controller.getXFTPCfg())
}
}
}
}
}
@@ -48,7 +48,6 @@ fun NetworkAndServersView(
NetworkAndServersLayout(
developerTools = developerTools,
xftpSendEnabled = remember { chatModel.controller.appPrefs.xftpSendEnabled.state },
networkUseSocksProxy = networkUseSocksProxy,
onionHosts = onionHosts,
sessionMode = sessionMode,
@@ -145,7 +144,6 @@ fun NetworkAndServersView(
@Composable fun NetworkAndServersLayout(
developerTools: Boolean,
xftpSendEnabled: State<Boolean>,
networkUseSocksProxy: MutableState<Boolean>,
onionHosts: MutableState<OnionHosts>,
sessionMode: MutableState<TransportSessionMode>,
@@ -167,10 +165,8 @@ fun NetworkAndServersView(
SettingsActionItem(Icons.Outlined.Dns, stringResource(R.string.smp_servers), showCustomModal { m, close -> ProtocolServersView(m, ServerProtocol.SMP, close) })
SectionDivider()
if (xftpSendEnabled.value) {
SettingsActionItem(Icons.Outlined.Dns, stringResource(R.string.xftp_servers), showCustomModal { m, close -> ProtocolServersView(m, ServerProtocol.XFTP, close) })
SectionDivider()
}
SettingsActionItem(Icons.Outlined.Dns, stringResource(R.string.xftp_servers), showCustomModal { m, close -> ProtocolServersView(m, ServerProtocol.XFTP, close) })
SectionDivider()
SectionItemView {
UseSocksProxySwitch(networkUseSocksProxy, proxyPort, toggleSocksProxy, showSettingsModal)
@@ -434,7 +430,6 @@ fun PreviewNetworkAndServersLayout() {
SimpleXTheme {
NetworkAndServersLayout(
developerTools = true,
xftpSendEnabled = remember { mutableStateOf(true) },
networkUseSocksProxy = remember { mutableStateOf(true) },
proxyPort = remember { mutableStateOf(9050) },
showModal = { {} },
@@ -80,6 +80,11 @@ private fun PreferencesLayout(
applyPrefs(preferences.copy(voice = SimpleChatPreference(allow = it)))
}
SectionSpacer()
val allowCalls = remember(preferences) { mutableStateOf(preferences.calls.allow) }
FeatureSection(ChatFeature.Calls, allowCalls) {
applyPrefs(preferences.copy(calls = SimpleChatPreference(allow = it)))
}
SectionSpacer()
ResetSaveButtons(
reset = reset,
save = savePrefs,
@@ -97,11 +102,12 @@ private fun FeatureSection(feature: ChatFeature, allowFeature: State<FeatureAllo
FeatureAllowed.values().map { it to it.text },
allowFeature,
icon = feature.icon,
onSelected = onSelected
enabled = remember { mutableStateOf(feature != ChatFeature.Calls) },
onSelected = onSelected,
)
}
}
SectionTextFooter(feature.allowDescription(allowFeature.value))
SectionTextFooter(feature.allowDescription(allowFeature.value) + (if (feature == ChatFeature.Calls) generalGetString(R.string.available_in_v51) else ""))
}
@Composable
@@ -18,6 +18,7 @@ import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.*
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import chat.simplex.app.R
import chat.simplex.app.model.*
@@ -112,7 +113,7 @@ fun ProtocolServersView(m: ChatModel, serverProtocol: ServerProtocol, close: ()
// No saving until something will be changed on the next screen to prevent blank servers on the list
showServer(servers.last())
}) {
Text(stringResource(R.string.smp_servers_enter_manually))
Text(stringResource(R.string.smp_servers_enter_manually), Modifier.fillMaxWidth(), textAlign = TextAlign.Center, color = MaterialTheme.colors.primary)
}
SectionItemView({
AlertManager.shared.hideAlert()
@@ -125,7 +126,7 @@ fun ProtocolServersView(m: ChatModel, serverProtocol: ServerProtocol, close: ()
}
}
) {
Text(stringResource(R.string.smp_servers_scan_qr))
Text(stringResource(R.string.smp_servers_scan_qr), Modifier.fillMaxWidth(), textAlign = TextAlign.Center, color = MaterialTheme.colors.primary)
}
val hasAllPresets = hasAllPresets(presetServers, servers, m)
if (!hasAllPresets) {
@@ -133,7 +134,7 @@ fun ProtocolServersView(m: ChatModel, serverProtocol: ServerProtocol, close: ()
AlertManager.shared.hideAlert()
servers = (servers + addAllPresets(presetServers, servers, m)).sortedByDescending { it.preset }
}) {
Text(stringResource(R.string.smp_servers_preset_add), color = MaterialTheme.colors.onBackground)
Text(stringResource(R.string.smp_servers_preset_add), Modifier.fillMaxWidth(), textAlign = TextAlign.Center, color = MaterialTheme.colors.onBackground)
}
}
}
@@ -207,8 +207,6 @@ fun SettingsLayout(
SectionView(stringResource(R.string.settings_section_title_develop)) {
SettingsActionItem(Icons.Outlined.Code, stringResource(R.string.settings_developer_tools), showSettingsModal { DeveloperView(it, showCustomModal, withAuth) })
SectionDivider()
// SettingsActionItem(Icons.Outlined.Science, stringResource(R.string.settings_experimental_features), showSettingsModal { ExperimentalFeaturesView(it) })
// SectionDivider()
AppVersionItem(showVersion)
}
}
@@ -1,14 +1,10 @@
package chat.simplex.app.views.usersettings
import android.content.res.Configuration
import android.graphics.Bitmap
import android.net.Uri
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.*
@@ -16,18 +12,20 @@ import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.KeyboardCapitalization
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import chat.simplex.app.R
import chat.simplex.app.model.*
import chat.simplex.app.ui.theme.*
import chat.simplex.app.views.ProfileNameField
import chat.simplex.app.views.helpers.*
import chat.simplex.app.views.isValidDisplayName
import chat.simplex.app.views.onboarding.ReadableText
import com.google.accompanist.insets.ProvideWindowInsets
import com.google.accompanist.insets.navigationBarsWithImePadding
import kotlinx.coroutines.launch
@@ -36,10 +34,8 @@ import kotlinx.coroutines.launch
fun UserProfileView(chatModel: ChatModel, close: () -> Unit) {
val user = chatModel.currentUser.value
if (user != null) {
val editProfile = rememberSaveable { mutableStateOf(false) }
var profile by remember { mutableStateOf(user.profile.toProfile()) }
UserProfileLayout(
editProfile = editProfile,
profile = profile,
close,
saveProfile = { displayName, fullName, image ->
@@ -49,7 +45,7 @@ fun UserProfileView(chatModel: ChatModel, close: () -> Unit) {
chatModel.updateCurrentUser(newProfile)
profile = newProfile
}
editProfile.value = false
close()
}
}
)
@@ -58,7 +54,6 @@ fun UserProfileView(chatModel: ChatModel, close: () -> Unit) {
@Composable
fun UserProfileLayout(
editProfile: MutableState<Boolean>,
profile: Profile,
close: () -> Unit,
saveProfile: (String, String, String?) -> Unit,
@@ -72,6 +67,7 @@ fun UserProfileLayout(
val scrollState = rememberScrollState()
val keyboardState by getKeyboardState()
var savedKeyboardState by remember { mutableStateOf(keyboardState) }
val focusRequester = remember { FocusRequester() }
ProvideWindowInsets(windowInsetsAnimationsEnabled = true) {
ModalBottomSheetLayout(
scrimColor = Color.Black.copy(alpha = 0.12F),
@@ -87,97 +83,95 @@ fun UserProfileLayout(
sheetState = bottomSheetModalState,
sheetShape = RoundedCornerShape(topStart = 18.dp, topEnd = 18.dp)
) {
ModalView(close = close) {
val dataUnchanged =
displayName.value == profile.displayName &&
fullName.value == profile.fullName &&
chosenImage.value == null
val closeWithAlert = {
if (dataUnchanged || !(displayName.value.isNotEmpty() && isValidDisplayName(displayName.value))) {
close()
} else {
showUnsavedChangesAlert({ saveProfile(displayName.value, fullName.value, profileImage.value) }, close)
}
}
ModalView(close = closeWithAlert) {
Column(
Modifier
.verticalScroll(scrollState)
.padding(horizontal = DEFAULT_PADDING),
horizontalAlignment = Alignment.Start
) {
AppBarTitle(stringResource(R.string.your_current_profile), false)
Text(
stringResource(R.string.your_profile_is_stored_on_device_and_shared_only_with_contacts_simplex_cannot_see_it),
Modifier.padding(bottom = 24.dp),
color = MaterialTheme.colors.onBackground,
lineHeight = 22.sp
)
if (editProfile.value) {
Column(
Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.Start
AppBarTitleCentered(stringResource(R.string.your_current_profile))
val text = remember {
var t = generalGetString(R.string.your_profile_is_stored_on_device_and_shared_only_with_contacts_simplex_cannot_see_it)
val index = t.indexOfFirst { it == '\n' }
if (index != -1) t = t.removeRange(index..index + 2)
t
}
ReadableText(text, TextAlign.Center)
Column(
Modifier
.fillMaxWidth()
) {
Box(
Modifier
.fillMaxWidth()
.padding(bottom = 24.dp),
contentAlignment = Alignment.Center
) {
Box(
Modifier
.fillMaxWidth()
.padding(bottom = 24.dp),
contentAlignment = Alignment.Center
) {
Box(contentAlignment = Alignment.TopEnd) {
Box(contentAlignment = Alignment.Center) {
ProfileImage(192.dp, profileImage.value)
EditImageButton { scope.launch { bottomSheetModalState.show() } }
}
if (profileImage.value != null) {
DeleteImageButton { profileImage.value = null }
}
Box(contentAlignment = Alignment.TopEnd) {
Box(contentAlignment = Alignment.Center) {
ProfileImage(108.dp, profileImage.value, color = HighOrLowlight.copy(alpha = 0.1f))
EditImageButton { scope.launch { bottomSheetModalState.show() } }
}
if (profileImage.value != null) {
DeleteImageButton { profileImage.value = null }
}
}
Box {
if (!isValidDisplayName(displayName.value)) {
Icon(Icons.Outlined.Info, tint = Color.Red, contentDescription = stringResource(R.string.display_name_cannot_contain_whitespace))
}
ProfileNameTextField(displayName)
}
ProfileNameTextField(fullName)
Row {
TextButton(stringResource(R.string.cancel_verb)) {
displayName.value = profile.displayName
fullName.value = profile.fullName
profileImage.value = profile.image
editProfile.value = false
}
Spacer(Modifier.padding(horizontal = 8.dp))
val enabled = displayName.value.isNotEmpty() && isValidDisplayName(displayName.value)
val saveModifier: Modifier
val saveColor: Color
if (enabled) {
saveModifier = Modifier
.clickable { saveProfile(displayName.value, fullName.value, profileImage.value) }
saveColor = MaterialTheme.colors.primary
} else {
saveModifier = Modifier
saveColor = HighOrLowlight
}
}
Row(Modifier.padding(bottom = DEFAULT_PADDING_HALF).fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
Text(
stringResource(R.string.display_name__field),
fontSize = 16.sp
)
if (!isValidDisplayName(displayName.value)) {
Spacer(Modifier.size(DEFAULT_PADDING_HALF))
Text(
stringResource(R.string.save_and_notify_contacts),
modifier = saveModifier,
color = saveColor
stringResource(R.string.no_spaces),
fontSize = 16.sp,
color = Color.Red
)
}
}
} else {
Column(
modifier = Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.Start
) {
Box(
Modifier
.fillMaxWidth()
.padding(bottom = 24.dp), contentAlignment = Alignment.Center
) {
ProfileImage(192.dp, profile.image)
if (profile.image == null) {
EditImageButton {
editProfile.value = true
scope.launch { bottomSheetModalState.show() }
}
}
}
ProfileNameRow(stringResource(R.string.display_name__field), profile.displayName)
ProfileNameRow(stringResource(R.string.full_name__field), profile.fullName)
TextButton(stringResource(R.string.edit_verb)) { editProfile.value = true }
ProfileNameField(displayName, "", ::isValidDisplayName, focusRequester)
Spacer(Modifier.height(DEFAULT_PADDING))
Text(
stringResource(R.string.full_name__field),
fontSize = 16.sp,
modifier = Modifier.padding(bottom = DEFAULT_PADDING_HALF)
)
ProfileNameField(fullName)
Spacer(Modifier.height(DEFAULT_PADDING))
val enabled = !dataUnchanged && displayName.value.isNotEmpty() && isValidDisplayName(displayName.value)
val saveModifier: Modifier
val saveColor: Color
if (enabled) {
saveModifier = Modifier
.clickable { saveProfile(displayName.value, fullName.value, profileImage.value) }
saveColor = MaterialTheme.colors.primary
} else {
saveModifier = Modifier
saveColor = HighOrLowlight
}
Text(
stringResource(R.string.save_and_notify_contacts),
modifier = saveModifier,
color = saveColor
)
}
Spacer(Modifier.height(DEFAULT_BOTTOM_BUTTON_PADDING))
if (savedKeyboardState != keyboardState) {
LaunchedEffect(keyboardState) {
scope.launch {
@@ -192,60 +186,17 @@ fun UserProfileLayout(
}
}
@Composable
fun ProfileNameTextField(name: MutableState<String>) {
BasicTextField(
value = name.value,
onValueChange = { name.value = it },
modifier = Modifier
.padding(bottom = 24.dp)
.padding(start = 28.dp)
.fillMaxWidth(),
textStyle = MaterialTheme.typography.body1.copy(color = MaterialTheme.colors.onBackground),
keyboardOptions = KeyboardOptions(
capitalization = KeyboardCapitalization.None,
autoCorrect = false
),
singleLine = true
)
}
@Composable
fun ProfileNameRow(label: String, text: String) {
Row(Modifier.padding(bottom = 24.dp)) {
Text(
label,
color = MaterialTheme.colors.onBackground
)
Spacer(Modifier.padding(horizontal = 4.dp))
Text(
text,
fontWeight = FontWeight.Bold,
color = MaterialTheme.colors.onBackground
)
}
}
@Composable
fun TextButton(text: String, click: () -> Unit) {
Text(
text,
color = MaterialTheme.colors.primary,
modifier = Modifier.clickable(onClick = click),
)
}
@Composable
fun EditImageButton(click: () -> Unit) {
IconButton(
onClick = click,
modifier = Modifier.background(Color(1f, 1f, 1f, 0.2f), shape = CircleShape)
modifier = Modifier.size(30.dp)
) {
Icon(
Icons.Outlined.PhotoCamera,
contentDescription = stringResource(R.string.edit_image),
tint = MaterialTheme.colors.primary,
modifier = Modifier.size(36.dp)
modifier = Modifier.size(30.dp)
)
}
}
@@ -261,6 +212,16 @@ fun DeleteImageButton(click: () -> Unit) {
}
}
private fun showUnsavedChangesAlert(save: () -> Unit, revert: () -> Unit) {
AlertManager.shared.showAlertDialogStacked(
title = generalGetString(R.string.save_preferences_question),
confirmText = generalGetString(R.string.save_and_notify_contacts),
dismissText = generalGetString(R.string.exit_without_saving),
onConfirm = save,
onDismiss = revert,
)
}
@Preview(showBackground = true)
@Preview(
uiMode = Configuration.UI_MODE_NIGHT_YES,
@@ -273,7 +234,6 @@ fun PreviewUserProfileLayoutEditOff() {
UserProfileLayout(
profile = Profile.sampleData,
close = {},
editProfile = remember { mutableStateOf(false) },
saveProfile = { _, _, _ -> }
)
}
@@ -291,7 +251,6 @@ fun PreviewUserProfileLayoutEditOn() {
UserProfileLayout(
profile = Profile.sampleData,
close = {},
editProfile = remember { mutableStateOf(true) },
saveProfile = { _, _, _ -> }
)
}
@@ -19,6 +19,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.*
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import chat.simplex.app.R
import chat.simplex.app.chatPasswordHash
@@ -31,7 +32,6 @@ import chat.simplex.app.views.database.PassphraseField
import chat.simplex.app.views.helpers.*
import chat.simplex.app.views.onboarding.CreateProfile
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@Composable
fun UserProfilesView(m: ChatModel, search: MutableState<String>, profileHidden: MutableState<Boolean>) {
@@ -73,14 +73,14 @@ fun UserProfilesView(m: ChatModel, search: MutableState<String>, profileHidden:
AlertManager.shared.hideAlert()
removeUser(m, user, users, true, searchTextOrPassword.value.trim())
}) {
Text(stringResource(R.string.users_delete_with_connections), color = Color.Red)
Text(stringResource(R.string.users_delete_with_connections), Modifier.fillMaxWidth(), textAlign = TextAlign.Center, color = Color.Red)
}
SectionItemView({
AlertManager.shared.hideAlert()
removeUser(m, user, users, false, searchTextOrPassword.value.trim())
}
) {
Text(stringResource(R.string.users_delete_data_only), color = Color.Red)
Text(stringResource(R.string.users_delete_data_only), Modifier.fillMaxWidth(), textAlign = TextAlign.Center, color = Color.Red)
}
}
}
@@ -210,43 +210,39 @@ private fun UserView(
unmuteUser: (User) -> Unit,
showHiddenProfile: (User) -> Unit,
) {
var showDropdownMenu by remember { mutableStateOf(false) }
UserProfilePickerItem(user, onLongClick = { if (users.size > 1) showDropdownMenu = true }) {
val showMenu = remember { mutableStateOf(false) }
UserProfilePickerItem(user, onLongClick = { if (users.size > 1) showMenu.value = true }) {
activateUser(user)
}
Box(Modifier.padding(horizontal = 16.dp)) {
DropdownMenu(
expanded = showDropdownMenu,
onDismissRequest = { showDropdownMenu = false },
Modifier.width(220.dp)
) {
DefaultDropdownMenu(showMenu) {
if (user.hidden) {
ItemAction(stringResource(R.string.user_unhide), Icons.Outlined.LockOpen, onClick = {
showDropdownMenu = false
showMenu.value = false
unhideUser(user)
})
} else {
if (visibleUsersCount > 1) {
ItemAction(stringResource(R.string.user_hide), Icons.Outlined.Lock, onClick = {
showDropdownMenu = false
showMenu.value = false
showHiddenProfile(user)
})
}
if (user.showNtfs) {
ItemAction(stringResource(R.string.user_mute), Icons.Outlined.NotificationsOff, onClick = {
showDropdownMenu = false
showMenu.value = false
muteUser(user)
})
} else {
ItemAction(stringResource(R.string.user_unmute), Icons.Outlined.Notifications, onClick = {
showDropdownMenu = false
showMenu.value = false
unmuteUser(user)
})
}
}
ItemAction(stringResource(R.string.delete_verb), Icons.Outlined.Delete, color = Color.Red, onClick = {
removeUser(user)
showDropdownMenu = false
showMenu.value = false
})
}
}
@@ -186,9 +186,11 @@
<string name="to_share_with_your_contact">(sdílet s kontaktem)</string>
<string name="only_stored_on_members_devices">(uloženo pouze členy skupiny)</string>
<string name="toast_permission_denied">Oprávnění zamítnuto!</string>
<string name="use_camera_button">Použít fotoaparát</string>
<string name="use_camera_button">Fotoaparát</string>
<string name="from_gallery_button">Z Galerie</string>
<string name="choose_file">Vybrat soubor</string>
<string name="choose_file">Soubor</string>
<string name="gallery_image_button">Obrázek</string>
<string name="gallery_video_button">Video</string>
<string name="to_start_a_new_chat_help_header">Pro zahájení nové konverzace</string>
<string name="chat_help_tap_button">Klepněte na tlačítko</string>
<string name="above_then_preposition_continuation">potom:</string>
@@ -277,7 +279,7 @@
<string name="settings_section_title_socks">SOCKS PROXY</string>
<string name="settings_section_title_icon">IKONA APLIKACE</string>
<string name="settings_section_title_themes">TÉMATA</string>
<string name="settings_section_title_messages">ZPRÁVY</string>
<string name="settings_section_title_messages">ZPRÁVY A SOUBORY</string>
<string name="settings_section_title_calls">VOLÁNÍ</string>
<string name="export_database">Export databáze</string>
<string name="import_database">Import databáze</string>
@@ -725,11 +727,9 @@
<string name="answer_call">Přijmout hovor</string>
<string name="integrity_msg_skipped"><xliff:g id="connection ID" example="1">%1$d</xliff:g> přeskočená zpráva (zprávy)</string>
<string name="alert_text_skipped_messages_it_can_happen_when">Může se to stát, když:
\n1. Zprávy na serveru vyprší, pokud nebyly přijaty po dobu 30 dnů,
\n2. Server, který používáte pro příjem zpráv od tohoto kontaktu, byl aktualizován a restartován.
\n3. Spojení je narušeno.
\nPřipojte se k vývojářům prostřednictvím Nastavení, abyste mohli dostávat aktualizace o serverech.
\nBudeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</string>
\n1. Zprávy vypršely v odesílajícím klientovi po 2 dnech nebo na serveru po 30 dnech.
\n2. Dešifrování zprávy se nezdařilo, protože vy nebo váš kontakt jste použili starou zálohu databáze.
\n3. Spojení je kompromitováno.</string>
<string name="settings_section_title_you">VY</string>
<string name="settings_section_title_support">PODPOŘIT SIMPLEX CHAT</string>
<string name="settings_section_title_develop">VÝVOJ</string>
@@ -907,7 +907,7 @@
<string name="theme">Téma</string>
<string name="chat_preferences_contact_allows">Kontakt povolil</string>
<string name="chat_preferences_on">zapnuto</string>
<string name="chat_preferences_off">vypnuto</string>
<string name="chat_preferences_off">vypnout</string>
<string name="chat_preferences">Chat předvolby</string>
<string name="contact_preferences">Předvolby kontaktu</string>
<string name="group_preferences">Předvolby skupiny</string>
@@ -1021,7 +1021,6 @@
<string name="you_will_still_receive_calls_and_ntfs">Stále budete přijímat volání a upozornění od umlčených profilů pokud budou aktivní.</string>
<string name="you_can_hide_or_mute_user_profile">Můžete skrýt nebo ztlumit uživatelský profil - Podržte pro menu.</string>
<string name="user_unhide">Odkrýt</string>
<string name="settings_send_files_via_xftp">Poslat videa a soubory přes XFTP</string>
<string name="database_upgrade">Aktualizace databáze</string>
<string name="database_downgrade_warning">Upozornění: můžete ztratit nějaká data!</string>
<string name="confirm_database_upgrades">Potvrdit aktualizaci databáze</string>
@@ -1036,7 +1035,6 @@
<string name="hide_dev_options">Skrýt:</string>
<string name="show_developer_options">Zobrazit možnosti vývojáře</string>
<string name="settings_section_title_experimenta">POKUSNÝ</string>
<string name="xftp_requires_v461">Pro příjem přes XFTP je vyžadována verze 4.6.1+.</string>
<string name="image_will_be_received_when_contact_completes_uploading">Obrázek bude přijat, až kontakt dokončí jeho nahrání.</string>
<string name="show_dev_options">Zobrazit:</string>
<string name="developer_options">ID databáze a možnost Izolace přenosu.</string>
@@ -1055,6 +1053,65 @@
<string name="icon_descr_waiting_for_video">Čekám na video</string>
<string name="icon_descr_video_snd_complete">Video odesláno</string>
<string name="video_will_be_received_when_contact_completes_uploading">Video bude přijato, až kontakt dokončí jeho nahrávání.</string>
<string name="video_will_be_received_when_contact_is_online">Video obdržíte, až bude váš kontakt online, vyčkejte prosím nebo se podívejte později!</string>
<string name="video_will_be_received_when_contact_is_online">Video obdržíte, až bude váš kontakt online, vyčkejte prosím nebo zkontrolujte později!</string>
<string name="waiting_for_video">Čekám na video</string>
<string name="error_loading_smp_servers">Chyba načítání serverů SMP</string>
<string name="error_loading_xftp_servers">Chyba načítání serverů XFTP</string>
<string name="error_saving_xftp_servers">Chyba ukládání XFTP serverů</string>
<string name="ensure_xftp_server_address_are_correct_format_and_unique">Ujistěte se, že adresy XFTP serverů jsou ve správném formátu s oddělenými řádky a nejsou duplicitní.</string>
<string name="error_xftp_test_server_auth">Server vyžaduje autorizaci pro nahrávání, zkontrolujte heslo</string>
<string name="smp_server_test_compare_file">Porovnat soubor</string>
<string name="smp_server_test_create_file">Vytvořit soubor</string>
<string name="smp_server_test_delete_file">Smazat soubor</string>
<string name="smp_server_test_download_file">Stáhnout soubor</string>
<string name="smp_server_test_upload_file">Nahrát soubor</string>
<string name="xftp_servers">XFTP servery</string>
<string name="network_socks_toggle_use_socks_proxy">Použít SOCKS proxy</string>
<string name="host_verb">Host</string>
<string name="network_proxy_port">port %d</string>
<string name="network_socks_proxy_settings">Nastavení SOCKS proxy</string>
<string name="la_lock_mode_passcode">Zadat heslo</string>
<string name="la_lock_mode">SimpleX zámek</string>
<string name="la_lock_mode_system">Ověření systému</string>
<string name="la_authenticate">Ověřit</string>
<string name="la_auth_failed">Ověření selhalo</string>
<string name="la_change_app_passcode">Změnit heslo</string>
<string name="la_current_app_passcode">Aktuální heslo</string>
<string name="la_enter_app_passcode">Zadat heslo</string>
<string name="la_no_app_password">Bez hesla aplikace</string>
<string name="la_could_not_be_verified">Nemohli jste být ověřeni; Zkuste to prosím znovu.</string>
<string name="la_minutes">%d minut</string>
<string name="la_seconds">%d vteřin</string>
<string name="la_immediately">Ihned</string>
<string name="la_please_remember_to_store_password">Zapamatujte si jej nebo bezpečně uložte - neexistuje způsob, jak obnovit ztracené heslo!</string>
<string name="lock_not_enabled">Zámek SimpleX není povolen!</string>
<string name="you_can_turn_on_lock">Zámek SimpleX můžete zapnout v Nastavení.</string>
<string name="port_verb">Port</string>
<string name="disable_onion_hosts_when_not_supported">Nastavte <i>Použít .onion hostitele</i> na Ne, pokud je SOCKS proxy nepodporuje.</string>
<string name="your_XFTP_servers">Vaše XFTP servery</string>
<string name="enable_lock">Povolit zámek</string>
<string name="lock_after">Zamknout po</string>
<string name="lock_mode">Režim zámku</string>
<string name="authentication_cancelled">Ověření zrušeno</string>
<string name="confirm_passcode">Potvrdit heslo</string>
<string name="incorrect_passcode">Nesprávné heslo</string>
<string name="new_passcode">Nové heslo</string>
<string name="submit_passcode">Odeslat</string>
<string name="la_mode_system">Systém</string>
<string name="change_lock_mode">Změnit zamykání</string>
<string name="la_mode_passcode">Heslo</string>
<string name="passcode_changed">Heslo změněno!</string>
<string name="passcode_not_changed">Heslo nezměněno!</string>
<string name="passcode_set">Heslo nastaveno!</string>
<string name="decryption_error">Chyba dešifrování</string>
<string name="alert_title_msg_bad_hash">Špatný hash zprávy</string>
<string name="alert_title_msg_bad_id">Špatné ID zprávy</string>
<string name="alert_text_msg_bad_hash">Hash předchozí zprávy se liší.</string>
<string name="alert_text_msg_bad_id">ID další zprávy je nesprávné (menší nebo rovno předchozí).
\nMůže se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitováno.</string>
<string name="alert_text_decryption_error_header"><xliff:g id="message count" example="1">%1$d</xliff:g> zprávy se nepodařilo dešifrovat.</string>
<string name="alert_text_decryption_error_too_many_skipped"><xliff:g id="message count" example="1">%1$d</xliff:g> zprývy přeskočeny.</string>
<string name="alert_text_fragment_please_report_to_developers">Nahlaste to prosím vývojářům.</string>
<string name="alert_text_fragment_permanent_error_reconnect">Tato chyba je pro toto připojení trvalá, připojte se znovu.</string>
<string name="alert_text_fragment_encryption_out_of_sync_old_database">Může se to stát, když vy nebo vaše připojení použijete starou zálohu databáze.</string>
</resources>
@@ -254,9 +254,11 @@
<string name="only_stored_on_members_devices">(Wird nur von Gruppenmitgliedern gespeichert)</string>
<!-- GetImageView -->
<string name="toast_permission_denied">Berechtigung verweigert!</string>
<string name="use_camera_button">Kamera\nverwenden</string>
<string name="use_camera_button">Kamera</string>
<string name="from_gallery_button">Aus dem\nFotoalbum</string>
<string name="choose_file">Datei\nauswählen</string>
<string name="choose_file">Datei</string>
<string name="gallery_image_button">Bild</string>
<string name="gallery_video_button">Video</string>
<!-- help - ChatHelpView.kt -->
<string name="thank_you_for_installing_simplex">Danke, dass Sie <xliff:g id="appNameFull">SimpleX Chat</xliff:g> installiert haben!</string>
<string name="you_can_connect_to_simplex_chat_founder">Sie können sich <font color="#0088ff">mit <xliff:g id="appNameFull">SimpleX Chat</xliff:g> Entwicklern verbinden, um Fragen zu stellen und Updates zu erhalten</font>.</string>
@@ -555,7 +557,10 @@
<string name="integrity_msg_bad_id">Falsche Nachrichten-ID</string>
<string name="integrity_msg_duplicate">Doppelte Nachricht</string>
<string name="alert_title_skipped_messages">Übersprungene Nachrichten</string>
<string name="alert_text_skipped_messages_it_can_happen_when">Dies kann unter folgenden Umständen passieren:\n1. Die Nachrichten verfallen auf dem Server, wenn sie 30 Tage lang nicht empfangen wurden.\n2. Der Server, den Sie zum Empfangen der Nachrichten von diesem Kontakt verwenden, wurde aktualisiert und neu gestartet.\n3. Die Verbindung ist kompromittiert.\nBitte nehmen Sie über die Einstellungen Verbindung mit den Entwicklern auf, um Updates zu den Servern zu erhalten.\nWir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu verhindern.</string>
<string name="alert_text_skipped_messages_it_can_happen_when">Dies kann unter folgenden Umständen passieren:
\n1. Die Nachrichten verfallen auf dem sendenden Client-System nach 2 Tagen oder auf dem Server nach 30 Tagen.
\n2. Die Nachrichten-Entschlüsselung ist fehlgeschlagen, da von Ihnen oder Ihrem Kontakt ein altes Datenbank-Backup genutzt wurde.
\n3. Die Verbindung wurde kompromittiert.</string>
<!-- Privacy settings -->
<string name="privacy_and_security">Datenschutz &amp; Sicherheit</string>
<string name="your_privacy">Meine Privatsphäre</string>
@@ -576,7 +581,7 @@
<string name="settings_section_title_socks">SOCKS-PROXY</string>
<string name="settings_section_title_icon">APP ICON</string>
<string name="settings_section_title_themes">DESIGN</string>
<string name="settings_section_title_messages">MESSAGES</string>
<string name="settings_section_title_messages">NACHRICHTEN und DATEIEN</string>
<string name="settings_section_title_calls">CALLS</string>
<string name="settings_section_title_incognito">Inkognito Modus</string>
<!-- DatabaseView.kt -->
@@ -1095,7 +1100,6 @@
<string name="group_welcome_title">Begrüßungsmeldung</string>
<string name="you_can_hide_or_mute_user_profile">Sie können ein Benutzerprofil verbergen oder stummschalten - für das Menü gedrückt halten.</string>
<string name="to_reveal_profile_enter_password">Geben Sie ein vollständiges Passwort in das Suchfeld auf der Seite \"Meine Chat-Profile\" ein, um Ihr verborgenes Profil zu sehen.</string>
<string name="settings_send_files_via_xftp">Videos und Dateien per XFTP versenden</string>
<string name="invalid_migration_confirmation">Migrations-Bestätigung ungültig</string>
<string name="upgrade_and_open_chat">Aktualisieren und den Chat öffnen</string>
<string name="confirm_database_upgrades">Datenbank-Aktualisierungen bestätigen</string>
@@ -1112,7 +1116,6 @@
<string name="mtr_error_no_down_migration">Die Datenbank-Version ist neuer als die App, keine Abwärts-Migration für: %s</string>
<string name="hide_dev_options">Verberge:</string>
<string name="database_migrations">Migrationen: %s</string>
<string name="xftp_requires_v461">Für den Empfang per XFTP wird v4.6.1 oder neuer benötigt.</string>
<string name="image_will_be_received_when_contact_completes_uploading">Das Bild wird empfangen, sobald das Hochladen durch ihren Kontakt abgeschlossen ist.</string>
<string name="file_will_be_received_when_contact_completes_uploading">Die Datei wird empfangen, sobald das Hochladen durch ihren Kontakt abgeschlossen ist.</string>
<string name="cancel_file__question">Dateitransfer abbrechen\?</string>
@@ -1131,4 +1134,66 @@
<string name="icon_descr_waiting_for_video">Auf das Video warten</string>
<string name="waiting_for_video">Auf das Video warten</string>
<string name="video_will_be_received_when_contact_is_online">Das Video wird empfangen, wenn Ihr Kontakt online ist. Bitte warten oder überprüfen Sie es später!</string>
<string name="your_XFTP_servers">Ihre XFTP-Server</string>
<string name="host_verb">Host</string>
<string name="error_saving_xftp_servers">Fehler beim Speichern der XFTP-Server</string>
<string name="error_loading_smp_servers">Fehler beim Laden der SMP-Server</string>
<string name="error_xftp_test_server_auth">Bitte das Passwort überprüfen - für den Upload benötigt der Server eine Berechtigung</string>
<string name="smp_server_test_download_file">Datei herunterladen</string>
<string name="smp_server_test_compare_file">Datei vergleichen</string>
<string name="smp_server_test_delete_file">Datei löschen</string>
<string name="lock_mode">Sperr-Modus</string>
<string name="authentication_cancelled">Authentifizierung abgebrochen</string>
<string name="confirm_passcode">Passwort bestätigen</string>
<string name="enable_lock">Sperre aktivieren</string>
<string name="incorrect_passcode">Passwort falsch</string>
<string name="lock_after">Sperre nach</string>
<string name="new_passcode">Neues Passwort</string>
<string name="la_mode_passcode">Passwort</string>
<string name="passcode_changed">Passwort geändert!</string>
<string name="passcode_set">Passwort wurde geändert!</string>
<string name="change_lock_mode">Sperr-Modus ändern</string>
<string name="passcode_not_changed">Passwort wurde nicht geändert!</string>
<string name="decryption_error">Entschlüsselungsfehler</string>
<string name="decryption_error_permanent">Dauerhafter Entschlüsselungsfehler</string>
<string name="error_loading_xftp_servers">Fehler beim Laden der XFTP-Server</string>
<string name="la_lock_mode_passcode">Passworteingabe</string>
<string name="la_enter_app_passcode">Passwort eingeben</string>
<string name="la_no_app_password">Kein App-Passwort</string>
<string name="la_authenticate">Authentifizieren</string>
<string name="la_minutes">%d Minuten</string>
<string name="la_seconds">%d Sekunden</string>
<string name="la_immediately">Sofort</string>
<string name="port_verb">Port</string>
<string name="network_proxy_port">Port %d</string>
<string name="smp_server_test_create_file">Datei erstellen</string>
<string name="la_current_app_passcode">Aktuelles Passwort</string>
<string name="alert_text_fragment_encryption_out_of_sync_old_database">Dies kann passieren, falls Sie oder Ihre Verbindung ein altes Datenbank-Backup genutzt haben.</string>
<string name="la_please_remember_to_store_password">Es gibt keine Möglichkeit ein vergessenes Passwort wiederherzustellen - bitte erinnern Sie sich gut daran oder speichern Sie es sicher ab!</string>
<string name="alert_text_fragment_please_report_to_developers">Bitte melden Sie es den Entwicklern.</string>
<string name="la_change_app_passcode">Passwort ändern</string>
<string name="alert_title_msg_bad_hash">Ungültiger Nachrichten-Hash</string>
<string name="la_auth_failed">Authentifizierung fehlgeschlagen</string>
<string name="alert_title_msg_bad_id">Falsche Nachrichten-ID</string>
<string name="ensure_xftp_server_address_are_correct_format_and_unique">Stellen Sie sicher, dass die XFTP-Server Adressen das richtige Format haben, zeilenweise angeordnet und nicht doppelt vorhanden sind.</string>
<string name="network_socks_toggle_use_socks_proxy">SOCKS-Proxy nutzen</string>
<string name="la_lock_mode">SimpleX Sperr-Modus</string>
<string name="lock_not_enabled">SimpleX Sperre ist nicht aktiviert!</string>
<string name="disable_onion_hosts_when_not_supported">Setzen Sie <i>Verwende .onion-Hosts</i> auf \"Nein\", wenn der SOCKS-Proxy sie nicht unterstützt.</string>
<string name="submit_passcode">Übermitteln</string>
<string name="la_mode_system">System</string>
<string name="la_could_not_be_verified">Sie können nicht überprüft werden - bitte versuchen Sie es nochmal.</string>
<string name="xftp_servers">XFTP-Server</string>
<string name="alert_text_msg_bad_id">Die ID der nächsten Nachricht ist falsch (kleiner oder gleich der Vorherigen).
\nDies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompromittiert wurde.</string>
<string name="alert_text_decryption_error_header"><xliff:g id="message count" example="1">%1$d</xliff:g> Nachrichten konnten nicht entschlüsselt werden.</string>
<string name="alert_text_msg_bad_hash">Der Hash der vorherigen Nachricht ist unterschiedlich.</string>
<string name="you_can_turn_on_lock">Sie können die SimpleX Sperre über die Einstellungen aktivieren.</string>
<string name="network_socks_proxy_settings">SOCKS-Proxy Einstellungen</string>
<string name="la_lock_mode_system">System-Authentifizierung</string>
<string name="alert_text_fragment_permanent_error_reconnect">Es handelt sich um einen permanenten Fehler für diese Verbindung - bitte verbinden Sie sich neu.</string>
<string name="smp_server_test_upload_file">Datei hochladen</string>
<string name="alert_text_decryption_error_too_many_skipped"><xliff:g id="message count" example="1">%1$d</xliff:g> Nachrichten übersprungen.</string>
<string name="allow_calls_only_if">Anrufe sind nur erlaubt, wenn Ihr Kontakt das ebenfalls erlaubt.</string>
<string name="allow_your_contacts_to_call">Erlaubt Ihren Kontakten Sie anzurufen.</string>
</resources>
@@ -10,20 +10,20 @@
<string name="chat_item_ttl_day">un dia</string>
<string name="chat_item_ttl_month">un mes</string>
<string name="chat_item_ttl_week">una semana</string>
<string name="allow_disappearing_messages_only_if">Permitir mensajes temporales sólo si tu contacto los permite.</string>
<string name="allow_disappearing_messages_only_if">Se permiten mensajes temporales sólo si tu contacto también los permite.</string>
<string name="v4_3_improved_server_configuration_desc">Añadir servidores escaneando códigos QR.</string>
<string name="smp_servers_preset_add">Añadir servidores predefinidos</string>
<string name="all_group_members_will_remain_connected">Todos los miembros del grupo permanecerán conectados.</string>
<string name="allow_irreversible_message_deletion_only_if">Permitir la eliminación irreversible de mensajes sólo si tu contacto también lo permite.</string>
<string name="allow_irreversible_message_deletion_only_if">Se permite la eliminación irreversible de mensajes sólo si tu contacto también lo permite para tí.</string>
<string name="keychain_allows_to_receive_ntfs">Android Keystore se usará para almacenar de forma segura la contraseña después de reiniciar la aplicación o cambiar la frase de contraseña - permitirá recibir notificaciones.</string>
<string name="allow_your_contacts_to_send_disappearing_messages">Permitir a tus contactos enviar mensajes temporales</string>
<string name="allow_your_contacts_to_send_voice_messages">Permitir a tus contactos enviar mensajes de voz.</string>
<string name="allow_your_contacts_to_send_disappearing_messages">Permites a tus contactos enviar mensajes temporales</string>
<string name="allow_your_contacts_to_send_voice_messages">Permites a tus contactos enviar mensajes de voz.</string>
<string name="chat_preferences_always">siempre</string>
<string name="notifications_mode_off_desc">La aplicación sólo puede recibir notificaciones cuando se está ejecutando, no se iniciará ningún servicio en segundo plano.</string>
<string name="notifications_mode_off_desc">La aplicación sólo puede recibir notificaciones cuando se está ejecutando. No se iniciará ningún servicio en segundo plano.</string>
<string name="settings_section_title_icon">ICONO DE LA APLICACIÓN</string>
<string name="incognito_random_profile_from_contact_description">Se enviará un perfil aleatorio al contacto del que recibió este enlace</string>
<string name="turning_off_service_and_periodic">La optimización de la batería está activa, desactivando el servicio en segundo plano y las solicitudes periódicas de nuevos mensajes. Puedes volver a activarlos en Configuración.</string>
<string name="notifications_mode_service_desc">El servicio en segundo plano está siempre en funcionamiento las notificaciones se muestran en cuanto los mensajes estén disponibles.</string>
<string name="notifications_mode_service_desc">El servicio está siempre en funcionamiento en segundo plano. Las notificaciones se muestran en cuanto haya mensajes nuevos.</string>
<string name="it_can_disabled_via_settings_notifications_still_shown"><b>Se puede desactivar en Configuración</b> las notificaciones se seguirán mostrando mientras la app esté en funcionamiento.</string>
<string name="notifications_mode_service">Siempre activo</string>
<string name="allow_verb">Permitir</string>
@@ -58,9 +58,9 @@
<string name="keychain_is_storing_securely">Android Keystore se utiliza para almacenar de forma segura la contraseña - permite que el servicio de notificación funcione.</string>
<string name="users_add">Añadir perfil</string>
<string name="incognito_random_profile_description">Se enviará un perfil aleatorio a tu contacto</string>
<string name="color_primary">Acento</string>
<string name="allow_your_contacts_irreversibly_delete">Permitir a tus contactos eliminar irreversiblemente los mensajes enviados.</string>
<string name="allow_voice_messages_only_if">Permitir mensajes de voz sólo si tu contacto los permite.</string>
<string name="color_primary">Color</string>
<string name="allow_your_contacts_irreversibly_delete">Permites a tus contactos eliminar irreversiblemente los mensajes enviados.</string>
<string name="allow_voice_messages_only_if">Se permiten mensajes de voz sólo si tu contacto también los permite.</string>
<string name="allow_direct_messages">Permitir el envío de mensajes directos a los miembros.</string>
<string name="allow_to_delete_messages">Permitir la eliminación irreversible de los mensajes enviados.</string>
<string name="allow_to_send_voice">Permitir enviar mensajes de voz.</string>
@@ -70,7 +70,7 @@
<string name="integrity_msg_bad_hash">hash de mensaje erróneo</string>
<string name="answer_call">Responder llamada</string>
<string name="group_member_role_admin">administrador</string>
<string name="allow_voice_messages_question">¿Permitir mensajes de voz\?</string>
<string name="allow_voice_messages_question">¿Permites los mensajes de voz\?</string>
<string name="back">Volver</string>
<string name="about_simplex_chat">Sobre <xliff:g id="appNameFull">SimpleX Chat</xliff:g></string>
<string name="smp_servers_add_to_another_device">Añadir a otro dispositivo</string>
@@ -85,7 +85,7 @@
<string name="both_you_and_your_contact_can_send_disappearing">Tanto tú como tu contacto podéis enviar mensajes temporales.</string>
<string name="scan_QR_code_to_connect_to_contact_who_shows_QR_code"><b>Escanear código QR</b>: para conectar con tu contacto que te muestre código QR.</string>
<string name="create_profile_button">Crear</string>
<string name="create_one_time_link">Crear enlace de invitación de un uso.</string>
<string name="create_one_time_link">Crear enlace de invitación de un solo uso.</string>
<string name="create_group">Crear grupo secreto</string>
<string name="database_passphrase_will_be_updated">La contraseña de cifrado de la base de datos será actualizada.</string>
<string name="info_row_database_id">ID de la base de datos</string>
@@ -98,7 +98,7 @@
<string name="rcv_group_event_group_deleted">grupo eliminado</string>
<string name="delete_group_question">¿Eliminar grupo\?</string>
<string name="delete_messages_after">Eliminar después de</string>
<string name="auth_device_authentication_is_not_enabled_you_can_turn_on_in_settings_once_enabled">Autenticación de dispositivo desactivada. Puedes habilitar SimpleX Lock en Configuración, después de activar la autenticación de dispositivo.</string>
<string name="auth_device_authentication_is_not_enabled_you_can_turn_on_in_settings_once_enabled">Autenticación de dispositivo desactivada. Puedes habilitar Bloqueo SimpleX en Configuración, después de activar la autenticación de dispositivo.</string>
<string name="no_call_on_lock_screen">Desactivar</string>
<string name="disappearing_prohibited_in_this_chat">Los mensajes temporales no están permitidos en este chat.</string>
<string name="disappearing_messages_are_prohibited">Los mensajes temporales no están permitidos en este grupo.</string>
@@ -108,8 +108,8 @@
<string name="simplex_link_mode_description">Descripción</string>
<string name="smp_server_test_connect">Conectar</string>
<string name="notification_contact_connected">Conectado</string>
<string name="auth_disable_simplex_lock">Desactivar SimpleX Lock</string>
<string name="auth_device_authentication_is_disabled_turning_off">Autenticación de dispositivo desactivada. SimpleX Lock deshabilitado.</string>
<string name="auth_disable_simplex_lock">Desactivar Bloqueo SimpleX</string>
<string name="auth_device_authentication_is_disabled_turning_off">Autenticación de dispositivo desactivada. Bloqueo SimpleX deshabilitado.</string>
<string name="maximum_supported_file_size">El tamaño máximo de archivo admitido es <xliff:g id="maxFileSize">%1$s</xliff:g></string>
<string name="clear_verification">Eliminar verificación</string>
<string name="create_profile">Crear perfil</string>
@@ -166,7 +166,7 @@
<string name="icon_descr_server_status_disconnected">Desconectado</string>
<string name="icon_descr_server_status_connected">Conectado</string>
<string name="copied">Copiado en portapapeles</string>
<string name="share_one_time_link">Crear enlace de invitación de un uso.</string>
<string name="share_one_time_link">Crear enlace de invitación de un solo uso.</string>
<string name="desktop_scan_QR_code_from_app_via_scan_QR_code">💻 PC: escanéa el código QR desde la app mediante <b>Escanéo de código QR </b></string>
<string name="delete_contact_menu_action">Eliminar</string>
<string name="delete_group_menu_action">Eliminar</string>
@@ -231,7 +231,7 @@
<string name="chat_preferences_default">predefinido (%s)</string>
<string name="full_deletion">Eliminar para todos</string>
<string name="feature_enabled">activado</string>
<string name="contacts_can_mark_messages_for_deletion">El contacto puede marcar los mensajes para eliminar; tu podrás verlos.</string>
<string name="contacts_can_mark_messages_for_deletion">El contacto solo puede marcar los mensajes para eliminar. Tu podrás verlos.</string>
<string name="ttl_w">%ds</string>
<string name="deleted_description">eliminado</string>
<string name="connect_via_contact_link">¿Conectar mediante enlace de contacto\?</string>
@@ -259,11 +259,11 @@
<string name="edit_image">Editar imagen</string>
<string name="settings_section_title_chats">CHATS</string>
<string name="change_verb">Cambiar</string>
<string name="notifications_mode_periodic_desc">Comprueba mensajes nuevos de hasta un minuto cada 10 minutos</string>
<string name="notifications_mode_periodic_desc">Se realizan comprobaciones de mensajes nuevos periódicas de hasta un minuto de duración cada 10 minutos</string>
<string name="clear_contacts_selection_button">Limpiar</string>
<string name="change_member_role_question">¿Cambiar rol de grupo\?</string>
<string name="v4_4_verify_connection_security_desc">Compara los códigos de seguridad con tus contactos</string>
<string name="choose_file">Elije archivo</string>
<string name="choose_file">Archivo</string>
<string name="clear_verb">Limpiar</string>
<string name="clear_chat_button">Limpiar chat</string>
<string name="configure_ICE_servers">Configurar servidores ICE</string>
@@ -336,7 +336,7 @@
<string name="error_setting_network_config">Error al actualizar la configuración de red</string>
<string name="error_creating_address">Error creando dirección</string>
<string name="error_deleting_user">Error eliminando perfil de usuario</string>
<string name="auth_enable_simplex_lock">Activar SimpleX Lock</string>
<string name="auth_enable_simplex_lock">Activar Bloqueo SimpleX</string>
<string name="one_time_link">Enlace de invitación de un uso</string>
<string name="smp_servers">Servidores SMP</string>
<string name="settings_experimental_features">Características experimentales</string>
@@ -359,6 +359,8 @@
<string name="error_saving_file">Error al guardar archivo</string>
<string name="icon_descr_server_status_error">Error</string>
<string name="from_gallery_button">De la Galería</string>
<string name="gallery_image_button">Imagen</string>
<string name="gallery_video_button">Vídeo</string>
<string name="if_you_received_simplex_invitation_link_you_can_open_in_browser">Si has recibido el enlace de invitación a <xliff:g id="appName">SimpleX Chat</xliff:g>, puedes abrirlo en tu navegador:</string>
<string name="if_you_choose_to_reject_the_sender_will_not_be_notified">Si eliges rechazar, el remitente NO será notificado.</string>
<string name="invalid_contact_link">¡Enlace no válido!</string>
@@ -383,8 +385,8 @@
<string name="error_deleting_group">Error al eliminar grupo</string>
<string name="error_deleting_pending_contact_connection">Error al eliminar conexión de contacto pendiente</string>
<string name="hide_notification">Ocultar</string>
<string name="notification_preview_mode_hidden">Oculto</string>
<string name="notification_display_mode_hidden_desc">Ocultar contacto y mensaje</string>
<string name="notification_preview_mode_hidden">Oculta</string>
<string name="notification_display_mode_hidden_desc">Se ocultan tanto el contacto como el mensaje</string>
<string name="hide_verb">Ocultar</string>
<string name="for_everybody">Para todos</string>
<string name="icon_descr_file">Archivo</string>
@@ -444,12 +446,12 @@
<string name="share_link">Compartir enlace</string>
<string name="how_it_works">Cómo funciona</string>
<string name="delete_message_cannot_be_undone_warning">El mensaje se eliminará. ¡No puede deshacerse!</string>
<string name="incognito_info_protects">El modo incógnito protege la identidad del perfil principal, por cada contacto nuevo se genera un perfil nuevo aleatorio.</string>
<string name="incognito_info_protects">La función del modo incógnito es proteger la identidad del perfil principal: por cada contacto nuevo se genera un perfil aleatorio.</string>
<string name="turn_off_battery_optimization">Para poder usarse <b>deshabilita la optimización de batería</b> para <xliff:g id="appName">SimpleX</xliff:g> en el siguiente cuadro de diálogo. De lo contrario las notificaciones estarán desactivadas.</string>
<string name="install_simplex_chat_for_terminal">Instalar <xliff:g id="appNameFull">SimpleX Chat</xliff:g> para terminal</string>
<string name="group_invitation_item_description">invitación al grupo <xliff:g id="group_name">%1$s</xliff:g></string>
<string name="rcv_group_event_member_added">invitado <xliff:g id="member profile" example="alice (Alice)">%1$s</xliff:g></string>
<string name="incognito_info_allows">Permite tener varias conexiones anónimas sin datos compartidos entre estas en un único perfil de chat.</string>
<string name="incognito_info_allows">Permite tener varias conexiones anónimas sin datos compartidos entre estas dentro del mismo perfil.</string>
<string name="invite_to_group_button">Invitar al grupo</string>
<string name="to_verify_compare">Para comprobar el cifrado de extremo a extremo con su contacto compare (o escanee) el código en sus dispositivos.</string>
<string name="database_is_not_encrypted">La base de datos no está cifrada. Escribe una contraseña para protegerla.</string>
@@ -469,11 +471,9 @@
<string name="message_deletion_prohibited_in_chat">La eliminación irreversible de mensajes no está permitida en este grupo.</string>
<string name="v4_3_improved_server_configuration">Configuración del servidor mejorada</string>
<string name="alert_text_skipped_messages_it_can_happen_when">Esto puede suceder cuando:
\n1. Los mensajes caducan en el servidor si no se han recibido durante 30 días.
\n2. El servidor que utiliza para recibir los mensajes de este contacto fue actualizado y reiniciado.
\n3. La conexión está comprometida.
\nPor favor, contacta con los desarrolladores a través del menú Configuración para recibir actualizaciones sobre los servidores.
\nAñadiremos redundancia de servidores para evitar la pérdida de mensajes.</string>
\n1. Los mensajes caducan en el cliente saliente tras 2 días o en el servidor tras 30 días.
\n2. El descifrado ha fallado porque tu o tu contacto estáis usando una copia de seguridad antigua de la base de datos.
\n3. La conexión ha sido comprometida.</string>
<string name="notification_preview_mode_message">Texto del mensaje</string>
<string name="member_info_section_title_member">MIEMBRO</string>
<string name="chat_item_ttl_none">nunca</string>
@@ -506,7 +506,7 @@
<string name="invalid_data">datos no válidos</string>
<string name="invalid_message_format">formato de mensaje no válido</string>
<string name="live">EN VIVO</string>
<string name="moderated_description">moderado</string>
<string name="moderated_description">eliminado por el moderador</string>
<string name="display_name_invited_to_connect">invitado a conectarse</string>
<string name="service_notifications_disabled">¡Las notificaciones instantáneas están desactivadas!</string>
<string name="notification_preview_new_message">mensaje nuevo</string>
@@ -602,8 +602,8 @@
<string name="reset_color">Restablecer colores</string>
<string name="only_you_can_send_disappearing">Sólo tú puedes enviar mensajes temporales</string>
<string name="only_your_contact_can_send_disappearing">Sólo tu contacto puede enviar mensajes temporales.</string>
<string name="prohibit_sending_voice">Prohibir el envío de mensajes de voz.</string>
<string name="notifications_mode_off">Se ejecuta cuando la aplicación está abierta</string>
<string name="prohibit_sending_voice">Prohibes el envío de mensajes de voz.</string>
<string name="notifications_mode_off">Se ejecuta sólo cuando la aplicación está abierta</string>
<string name="auth_open_chat_console">Abrir la consola de chat</string>
<string name="save_verb">Guardar</string>
<string name="restore_database_alert_confirm">Restaurar</string>
@@ -626,7 +626,7 @@
<string name="restore_database_alert_title">¿Restaurar copia de seguridad de la base de datos\?</string>
<string name="onboarding_notifications_mode_title">Notificaciones privadas</string>
<string name="image_descr_profile_image">imagen del perfil</string>
<string name="prohibit_sending_voice_messages">Prohibir el envío de mensajes de voz.</string>
<string name="prohibit_sending_voice_messages">Prohibes el envío de mensajes de voz.</string>
<string name="protect_app_screen">Proteger la pantalla de la aplicación</string>
<string name="read_more_in_github_with_link">Más información en nuestro <font color="#0088ff">repositorio GitHub</font> .</string>
<string name="icon_descr_record_voice_message">Grabar mensaje de voz</string>
@@ -651,7 +651,7 @@
<string name="network_options_revert">Revertir</string>
<string name="network_option_ping_interval">Intervalo PING</string>
<string name="network_option_ping_count">Contador PING</string>
<string name="only_your_contact_can_delete">Sólo tu contacto puede eliminar mensajes de forma irreversible (tu puedes marcar para eliminar).</string>
<string name="only_your_contact_can_delete">Sólo tu contacto puede eliminar mensajes de forma irreversible (tu puedes marcarlos para eliminar).</string>
<string name="v4_5_message_draft_descr">Conserva el último borrador del mensaje con los datos adjuntos.</string>
<string name="v4_5_private_filenames">Nombres de archivos privados</string>
<string name="v4_5_reduced_battery_usage">Reducción del uso de la batería</string>
@@ -685,16 +685,16 @@
<string name="network_option_protocol_timeout">Tiempo de espera del protocolo</string>
<string name="network_option_seconds_label">seg</string>
<string name="users_delete_with_connections">Perfil y conexiones de servidor</string>
<string name="prohibit_sending_disappearing_messages">Prohibir el envío de mensajes temporales</string>
<string name="prohibit_sending_disappearing_messages">Prohibes el envío de mensajes temporales</string>
<string name="only_you_can_send_voice">Sólo tú puedes enviar mensajes de voz.</string>
<string name="only_your_contact_can_send_voice">Sólo tu contacto puede enviar mensajes de voz.</string>
<string name="run_chat_section">EJECUTAR CHAT</string>
<string name="restart_the_app_to_use_imported_chat_database">Reinicia la aplicación para poder usar la base de datos importada.</string>
<string name="enter_correct_current_passphrase">Introduce la contraseña actual correcta.</string>
<string name="feature_received_prohibited">recepción prohibida</string>
<string name="only_you_can_delete_messages">Sólo tú puedes eliminar mensajes de forma irreversible (tu contacto puede marcar para eliminar).</string>
<string name="only_you_can_delete_messages">Sólo tú puedes eliminar mensajes de forma irreversible (tu contacto puede marcarlos para eliminar).</string>
<string name="prohibit_direct_messages">Prohibir el envío de mensajes directos a los miembros.</string>
<string name="prohibit_sending_disappearing">Prohibir el envío de mensajes temporales</string>
<string name="prohibit_sending_disappearing">Prohibes el envío de mensajes temporales</string>
<string name="v4_2_security_assessment">Evaluación de la seguridad</string>
<string name="receiving_files_not_yet_supported">la recepción de archivos aún no está disponible</string>
<string name="sending_files_not_yet_supported">el envío de archivos aún no está disponible</string>
@@ -736,7 +736,7 @@
<string name="stop_chat_confirmation">Detener</string>
<string name="delete_chat_profile_action_cannot_be_undone_warning">Esta acción no se puede deshacer. Tu perfil, contactos, mensajes y archivos se perderán irreversiblemente.</string>
<string name="skip_inviting_button">Omitir invitación a miembros</string>
<string name="settings_notification_preview_mode_title">Mostrar vista previa</string>
<string name="settings_notification_preview_mode_title">Vista previa</string>
<string name="la_notice_turn_on">Activar</string>
<string name="share_verb">Compartir</string>
<string name="icon_descr_sent_msg_status_unauthorized_send">envío no autorizado</string>
@@ -750,7 +750,7 @@
<string name="icon_descr_received_msg_status_unread">no leído</string>
<string name="text_field_set_contact_placeholder">Escribe un nombre para el contacto…</string>
<string name="switch_receiving_address_question">¿Cambiar dirección de recepción\?</string>
<string name="use_camera_button">Usar cámara</string>
<string name="use_camera_button">Cámara</string>
<string name="contact_you_shared_link_with_wont_be_able_to_connect">¡El contacto con el que has compartido este enlace NO podrá conectarse!</string>
<string name="show_QR_code">Mostrar código QR</string>
<string name="this_link_is_not_a_valid_connection_link">¡El enlace no es un enlace de conexión válido!</string>
@@ -774,7 +774,7 @@
<string name="stop_chat_to_export_import_or_delete_chat_database">Detén Chat para poder exportar, importar o eliminar la base de datos. No puedes recibir ni enviar mensajes mientras Chat esté detenido.</string>
<string name="thank_you_for_installing_simplex">Gracias por instalar <xliff:g id="appNameFull">SimpleX Chat</xliff:g>!</string>
<string name="to_protect_privacy_simplex_has_ids_for_queues">Para proteger la privacidad, en lugar de los identificadores de usuario que utilizan el resto de plataformas, <xliff:g id="appName">SimpleX</xliff:g> dispone de identificadores para las colas de mensajes, independientes para cada uno de tus contactos.</string>
<string name="la_notice_to_protect_your_information_turn_on_simplex_lock_you_will_be_prompted_to_complete_authentication_before_this_feature_is_enabled">Para proteger tu información, activa SimpleX Lock.
<string name="la_notice_to_protect_your_information_turn_on_simplex_lock_you_will_be_prompted_to_complete_authentication_before_this_feature_is_enabled">Para proteger tu información, activa Bloqueo SimpleX.
\nSe te pedirá que completes la autenticación antes de activar esta función.</string>
<string name="updating_settings_will_reconnect_client_to_all_servers">Al actualizar la configuración, el cliente se reconectará a todos los servidores.</string>
<string name="use_simplex_chat_servers__question">¿Usar servidores <xliff:g id="appNameFull">SimpleX Chat</xliff:g>\?</string>
@@ -784,9 +784,9 @@
<string name="error_smp_test_server_auth">El servidor requiere autorización para crear colas, comprueba la contraseña</string>
<string name="enter_passphrase_notification_desc">Para recibir notificaciones, introduce la contraseña de la base de datos</string>
<string name="ntf_channel_calls">Llamadas de chat SimpleX</string>
<string name="notifications_mode_periodic">Se inicia periódicamente</string>
<string name="notification_preview_mode_message_desc">Mostrar contacto y mensaje</string>
<string name="notification_preview_mode_contact_desc">Mostrar sólo contacto</string>
<string name="notifications_mode_periodic">Se ejecuta periódicamente</string>
<string name="notification_preview_mode_message_desc">Se muestran el nombre del contacto y el mensaje</string>
<string name="notification_preview_mode_contact_desc">Se muestra solo el nombre del contacto</string>
<string name="auth_simplex_lock_turned_on">Bloqueo SimpleX activado</string>
<string name="auth_stop_chat">Detener chat</string>
<string name="moderate_message_will_be_deleted_warning">El mensaje se eliminará para todos los miembros.</string>
@@ -799,7 +799,7 @@
<string name="the_messaging_and_app_platform_protecting_your_privacy_and_security">La plataforma de mensajería y aplicaciones que protege tu privacidad y seguridad.</string>
<string name="first_platform_without_user_ids">La primera plataforma sin identificadores de usuario: diseñada para la privacidad.</string>
<string name="alert_message_no_group">Este grupo ya no existe.</string>
<string name="incognito_info_find">Para encontrar el perfil usado en una conexión en modo incógnito, pulsa el nombre del contacto o del grupo en la parte superior del chat.</string>
<string name="incognito_info_find">Para conocer el perfil usado en una conexión en modo incógnito, pulsa el nombre del contacto o del grupo en la parte superior del chat.</string>
<string name="accept_feature_set_1_day">Establecer 1 día</string>
<string name="v4_4_french_interface_descr">Agradecimientos a los usuarios. ¡Contribuye a través de Weblate!</string>
<string name="v4_5_italian_interface_descr">Agradecimientos a los usuarios. ¡Contribuye a través de Weblate!</string>
@@ -858,13 +858,13 @@
<string name="description_via_one_time_link">mediante enlace de un uso</string>
<string name="your_chats">Tus chats</string>
<string name="voice_message_send_text">Mensaje de voz…</string>
<string name="your_contact_address">Tu dirección de contacto</string>
<string name="your_contact_address">Mi dirección de contacto</string>
<string name="icon_descr_video_off">Desactivar vídeo</string>
<string name="icon_descr_video_on">Activar vídeo</string>
<string name="wrong_passphrase">Contraseña de base de datos incorrecta</string>
<string name="wrong_passphrase_title">¡Contraseña incorrecta!</string>
<string name="youve_accepted_group_invitation_connecting_to_inviting_group_member">Te has unido a este grupo. Conectando con miembro del grupo invitado.</string>
<string name="alert_title_cant_invite_contacts_descr">Estás utilizando un perfil incógnito para este grupo. Para evitar compartir tu perfil principal, invitar contactos no está permitido</string>
<string name="alert_title_cant_invite_contacts_descr">Estás usando un perfil incógnito para este grupo, por tanto para evitar compartir tu perfil principal no se permite invitar contactos</string>
<string name="you_are_invited_to_group">Has sido invitado al grupo</string>
<string name="v4_3_voice_messages">Mensajes de voz</string>
<string name="v4_3_irreversible_message_deletion_desc">Tus contactos pueden permitir la eliminación completa de mensajes.</string>
@@ -900,7 +900,7 @@
<string name="you_will_be_connected_when_your_connection_request_is_accepted">Te conectarás cuando se acepte tu solicitud de conexión, por favor espere o compruébalo más tarde.</string>
<string name="you_will_be_connected_when_your_contacts_device_is_online">Te conectarás cuando el dispositivo de tu contacto esté en línea, por favor espera o compruébalo más tarde.</string>
<string name="auth_you_will_be_required_to_authenticate_when_you_start_or_resume">Se te pedirá identificarte cuándo inicies o continues usando la aplicación tras 30 segundos en segundo plano.</string>
<string name="invite_prohibited_description">Estás intentando invitar a un contacto con el que has compartido un perfil incógnito, al grupo en el que utilizas tu perfil principal</string>
<string name="invite_prohibited_description">Estás intentando invitar a un contacto con el que compartes un perfil incógnito a un grupo en el que usas tu perfil principal</string>
<string name="simplex_link_mode_browser">mediante navegador</string>
<string name="simplex_link_connection">mediante <xliff:g id="serverHost" example="smp.simplex.im">%1$s</xliff:g></string>
<string name="simplex_service_notification_title">Servicio <xliff:g id="appNameFull">SimpleX Chat</xliff:g></string>
@@ -915,7 +915,7 @@
<string name="snd_group_event_member_deleted">has eliminado <xliff:g id="member profile" example="alice (Alice)">%1$s</xliff:g></string>
<string name="group_info_member_you">Tú: <xliff:g id="group_info_you">%1$s</xliff:g></string>
<string name="you_can_share_group_link_anybody_will_be_able_to_connect">Puedes compartir un enlace o un código QR: cualquiera podrá unirse al grupo. Si lo eliminas más tarde los miembros del grupo no se perderán.</string>
<string name="incognito_info_share">Cuando compartes un perfil incógnito con alguien, este perfil se usará para los grupos a los que te inviten.</string>
<string name="incognito_info_share">Cuando compartes un perfil incógnito con alguien, este perfil también se usará para los grupos a los que te inviten.</string>
<string name="your_preferences">Tus preferencias</string>
<string name="v4_2_auto_accept_contact_requests_desc">Con mensaje de bienvenida opcional.</string>
<string name="you_are_observer">Tu rol es observador</string>
@@ -924,7 +924,7 @@
<string name="you_invited_your_contact">Has invitado a tu contacto</string>
<string name="you_will_be_connected_when_group_host_device_is_online">Te conectarás al grupo cuando el dispositivo del anfitrión esté en línea, por favor espera o compruébalo más tarde.</string>
<string name="show_QR_code_for_your_contact_to_scan_from_the_app__multiline">Tu contacto puede escanear el código QR desde la aplicación.</string>
<string name="your_settings">Tu configuración</string>
<string name="your_settings">Mi configuración</string>
<string name="your_SMP_servers">Tus servidores SMP</string>
<string name="you_control_your_chat">¡Tú controlas tu chat!</string>
<string name="your_profile_is_stored_on_your_device">Tu perfil, contactos y mensajes entregados se almacenan en tu dispositivo.</string>
@@ -934,8 +934,8 @@
<string name="icon_descr_video_call">Videollamada</string>
<string name="your_calls">Tus llamadas</string>
<string name="your_ice_servers">Tus servidores ICE</string>
<string name="your_privacy">Tu privacidad</string>
<string name="settings_section_title_you">TU</string>
<string name="your_privacy">Privacidad</string>
<string name="settings_section_title_you">MIS DATOS</string>
<string name="your_chat_database">Base de datos Chat</string>
<string name="you_can_start_chat_via_setting_or_by_restarting_the_app">Puedes iniciar el chat en Configuración / Base de datos o reiniciando la aplicación.</string>
<string name="you_sent_group_invitation">Has enviado una invitación de grupo</string>
@@ -961,15 +961,15 @@
<string name="integrity_msg_skipped"><xliff:g id="connection ID" example="1">%1$d</xliff:g> mensaje(s) omitido(s)</string>
<string name="you_will_stop_receiving_messages_from_this_group_chat_history_will_be_preserved">Dejarás de recibir mensajes de este grupo. El historial del chat se conservará.</string>
<string name="view_security_code">Ver código de seguridad</string>
<string name="you_need_to_allow_to_send_voice">Para poder enviar mensajes de voz debes permitir que tu contacto pueda enviarlos.</string>
<string name="you_need_to_allow_to_send_voice">Para poder enviar mensajes de voz antes debes permitir que tu contacto pueda enviarlos.</string>
<string name="voice_messages_prohibited">¡Mensajes de voz prohibidos!</string>
<string name="group_main_profile_sent">Tu perfil Chat será enviado a los miembros del grupo</string>
<string name="icon_descr_address">Dirección <xliff:g id="appName">SimpleX</xliff:g></string>
<string name="image_descr_simplex_logo">Logo <xliff:g id="appName">SimpleX</xliff:g></string>
<string name="icon_descr_simplex_team">Equipo <xliff:g id="appName">SimpleX</xliff:g></string>
<string name="your_profile_will_be_sent">Tu perfil Chat se enviará a tu contacto</string>
<string name="your_chat_profiles">Tus perfiles Chat</string>
<string name="your_simplex_contact_address">Tu dirección de contacto <xliff:g id="appName">SimpleX</xliff:g></string>
<string name="your_chat_profiles">Mis perfiles</string>
<string name="your_simplex_contact_address">Mi dirección de contacto <xliff:g id="appName">SimpleX</xliff:g></string>
<string name="smp_servers_your_server">Tu servidor</string>
<string name="smp_servers_your_server_address">Dirección de tu servidor</string>
<string name="section_title_welcome_message">MENSAJE DE BIENVENIDA</string>
@@ -992,7 +992,7 @@
<string name="user_hide">Ocultar</string>
<string name="user_mute">Silenciar</string>
<string name="save_and_update_group_profile">Guardar y actualizar perfil del grupo</string>
<string name="tap_to_activate_profile">Pulsa para activar el perfil.</string>
<string name="tap_to_activate_profile">Pulsa sobre un perfil para activarlo.</string>
<string name="should_be_at_least_one_visible_profile">Debe haber al menos un perfil de usuario visible.</string>
<string name="user_unhide">Mostrar</string>
<string name="button_welcome_message">Mensaje de bienvenida</string>
@@ -1003,7 +1003,7 @@
<string name="muted_when_inactive">¡Silenciado cuando está inactivo!</string>
<string name="v4_6_group_moderation">Moderación de grupos</string>
<string name="v4_6_hidden_chat_profiles">Perfiles Chat ocultos</string>
<string name="v4_6_hidden_chat_profiles_descr">¡Protege tus perfiles Chat con contraseña!</string>
<string name="v4_6_hidden_chat_profiles_descr">¡Protege tus perfiles con contraseña!</string>
<string name="v4_6_audio_video_calls_descr">Soporte bluetooth y otras mejoras.</string>
<string name="v4_6_group_welcome_message_descr">¡Establece el mensaje mostrado a los miembros nuevos!</string>
<string name="v4_6_chinese_spanish_interface">Interfaz en chino y español</string>
@@ -1022,7 +1022,6 @@
\n- borrar mensajes de los miembros.
\n- desactivar el rol a miembros (a rol \"observador\")</string>
<string name="to_reveal_profile_enter_password">Para hacer visible tu perfil oculto, introduce la contraseña completa en el campo de búsqueda de la página Tus perfiles Chat.</string>
<string name="settings_send_files_via_xftp">Enviar vídeos y archivos mediante XFTP</string>
<string name="database_upgrade">Actualización de la base de datos</string>
<string name="database_downgrade">Volviendo a versión anterior de la base de datos</string>
<string name="invalid_migration_confirmation">Confirmación de migración no válida</string>
@@ -1038,7 +1037,6 @@
<string name="developer_options">ID de base de datos y opción de aislamiento de transporte.</string>
<string name="file_will_be_received_when_contact_completes_uploading">El archivo se recibirá cuando tu contacto termine de subirlo.</string>
<string name="image_will_be_received_when_contact_completes_uploading">La imagen se recibirá cuando tu contacto termine de subirla.</string>
<string name="xftp_requires_v461">Se requiere v4.6.1+ para recibir vía XFTP.</string>
<string name="show_developer_options">Mostrar opciones de desarrollador</string>
<string name="hide_dev_options">Ocultar:</string>
<string name="show_dev_options">Mostrar:</string>
@@ -1076,4 +1074,45 @@
<string name="network_socks_toggle_use_socks_proxy">Usar proxy SOCKS</string>
<string name="host_verb">Host</string>
<string name="network_socks_proxy_settings">Configuración proxy SOCKS</string>
<string name="la_authenticate">Autenticar</string>
<string name="la_current_app_passcode">Código de acceso actual</string>
<string name="authentication_cancelled">Autenticación cancelada</string>
<string name="change_lock_mode">Cambiar el modo de bloqueo</string>
<string name="la_seconds">%d segundos</string>
<string name="la_auth_failed">Error de autenticación</string>
<string name="la_change_app_passcode">Cambiar el código de acceso</string>
<string name="passcode_not_changed">¡Código de acceso no cambiado!</string>
<string name="la_lock_mode_system">Autenticación del sistema</string>
<string name="la_no_app_password">Sin código de acceso de la aplicación</string>
<string name="la_lock_mode_passcode">Campo de código de acceso</string>
<string name="la_lock_mode">Modo Bloqueo SimpleX</string>
<string name="la_could_not_be_verified">No has podido ser verificado. Inténtelo de nuevo.</string>
<string name="la_minutes">%d minutos</string>
<string name="la_enter_app_passcode">Introducir el código de acceso</string>
<string name="la_immediately">Inmediatamente</string>
<string name="la_please_remember_to_store_password">Por favor, recuerda y guarda la contraseña en un lugar seguro. ¡No hay ninguna manera de recuperar una contraseña perdida!</string>
<string name="lock_not_enabled">¡Bloqueo SimpleX no activado!</string>
<string name="you_can_turn_on_lock">Puedes activar el Bloqueo SimpleX a través de Configuración.</string>
<string name="confirm_passcode">Confirmar el código de acceso</string>
<string name="enable_lock">Activar bloqueo</string>
<string name="lock_after">Bloquear después de</string>
<string name="lock_mode">Modo de bloqueo</string>
<string name="submit_passcode">Enviar</string>
<string name="incorrect_passcode">Código de acceso incorrecto</string>
<string name="new_passcode">Nuevo código de acceso</string>
<string name="la_mode_passcode">Código de acceso</string>
<string name="passcode_changed">¡Código de acceso cambiado!</string>
<string name="passcode_set">¡Código de acceso guardado!</string>
<string name="la_mode_system">Sistema</string>
<string name="decryption_error">Error de descifrado</string>
<string name="alert_text_msg_bad_id">El ID del siguiente mensaje es incorrecto (menor o igual que el anterior).
\nPuede ocurrir por algún bug o cuando la conexión está comprometida.</string>
<string name="alert_text_fragment_please_report_to_developers">Por favor, informa a los desarrolladores.</string>
<string name="alert_text_decryption_error_too_many_skipped"><xliff:g id="message count" example="1">%1$d</xliff:g> mensajes omitidos.</string>
<string name="alert_title_msg_bad_hash">Hash de mensaje incorrecto</string>
<string name="alert_title_msg_bad_id">ID de mensaje incorrecto</string>
<string name="alert_text_fragment_encryption_out_of_sync_old_database">Puede ocurrir cuando tu o tu contacto estáis usando una copia de seguridad antigua de la base de datos.</string>
<string name="alert_text_msg_bad_hash">El hash del mensaje anterior es diferente.</string>
<string name="alert_text_fragment_permanent_error_reconnect">El error es permanente para esta conexión, por favor vuelve a conectarte.</string>
<string name="alert_text_decryption_error_header"><xliff:g id="message count" example="1">%1$d</xliff:g> mensajes no pudieron ser descifrados.</string>
</resources>
@@ -201,7 +201,9 @@
<string name="to_share_with_your_contact">(à partager avec votre contact)</string>
<string name="create_group">Créer un groupe secret</string>
<string name="from_gallery_button">Depuis la Phototèque</string>
<string name="choose_file">Choisir le fichier</string>
<string name="choose_file">Fichier</string>
<string name="gallery_image_button">Image</string>
<string name="gallery_video_button">Vidéo</string>
<string name="to_start_a_new_chat_help_header">Pour démarrer une nouvelle discussion</string>
<string name="chat_help_tap_button">Appuyez sur le bouton</string>
<string name="scan_QR_code_to_connect_to_contact_who_shows_QR_code"><b>Scanner un code QR</b> : pour vous connecter à votre contact qui vous montre un code QR.</string>
@@ -294,7 +296,7 @@
<string name="waiting_for_file">En attente du fichier</string>
<string name="voice_message">Message vocal</string>
<string name="toast_permission_denied">Autorisation refusée !</string>
<string name="use_camera_button">Utiliser l\'Appareil photo</string>
<string name="use_camera_button">Appareil\nphoto</string>
<string name="thank_you_for_installing_simplex">Merci d\'avoir installé <xliff:g id="appNameFull">SimpleX Chat</xliff:g> !</string>
<string name="you_can_connect_to_simplex_chat_founder">Vous pouvez <font color="#0088ff">vous connecter aux développeurs de <xliff:g id="appNameFull">SimpleX Chat</xliff:g> pour leur poser des questions et recevoir des réponses :</font>.</string>
<string name="above_then_preposition_continuation">ci-dessus, puis :</string>
@@ -475,12 +477,10 @@
<string name="integrity_msg_skipped"><xliff:g id="connection ID" example="1">%1$d</xliff:g> message⸱s manqué⸱s</string>
<string name="integrity_msg_bad_id">ID de message incorrecte</string>
<string name="settings_section_title_settings">PARAMÈTRES</string>
<string name="alert_text_skipped_messages_it_can_happen_when">C\'est possible quand :
\n1. Les messages expirent du serveur (après 30 jours si ils ne sont pas reçu).
\n2. Le serveur que vous utilisez pour recevoir les messages de ce contact a été mise à jour ou redémarré.
\n3. La connection est compromise.
\nVeuillez vous connecter aux développeurs via les Paramètres pour recevoir les mises à jour concernant les serveurs.
\nNous allons ajouter une redondance des serveurs pour éviter la perte de messages.</string>
<string name="alert_text_skipped_messages_it_can_happen_when">Cela peut arriver quand :
\n1. Les messages ont expiré dans le client expéditeur après 2 jours ou sur le serveur après 30 jours.
\n2. Le déchiffrement du message a échoué, car vous ou votre contact avez utilisé une ancienne sauvegarde de base de données.
\n3. La connexion a été compromise.</string>
<string name="icon_descr_call_rejected">Appel rejeté</string>
<string name="rcv_group_event_member_deleted">a retiré <xliff:g id="member profile" example="alice (Alice)">%1$s</xliff:g></string>
<string name="snd_group_event_member_deleted">vous avez retiré <xliff:g id="member profile" example="alice (Alice)">%1$s</xliff:g></string>
@@ -854,7 +854,7 @@
<string name="group_is_decentralized">Le groupe est entièrement décentralisé il n\'est visible que par ses membres.</string>
<string name="group_members_can_send_disappearing">Les membres du groupes peuvent envoyer des messages éphémères.</string>
<string name="network_options_revert">Revenir en arrière</string>
<string name="prohibit_sending_disappearing_messages">Interdit lenvoi de messages éphémères.</string>
<string name="prohibit_sending_disappearing_messages">Interdire lenvoi de messages éphémères.</string>
<string name="incognito_info_protects">Le mode Incognito protège la confidentialité de votre profil principal — pour chaque nouveau contact un nouveau profil aléatoire est créé.</string>
<string name="updating_settings_will_reconnect_client_to_all_servers">La mise à jour des ces paramètres reconnectera le client à tous les serveurs.</string>
<string name="incognito_info_share">Lorsque vous partagez un profil incognito avec quelqu\'un, ce profil sera utilisé pour les groupes auxquels il vous invite.</string>
@@ -887,7 +887,7 @@
<string name="allow_to_send_voice">Autoriser l\'envoi de messages vocaux.</string>
<string name="prohibit_sending_voice">Interdire l\'envoi de messages vocaux.</string>
<string name="allow_to_send_disappearing">Autorise lenvoi de messages éphémères.</string>
<string name="prohibit_sending_disappearing">Interdit lenvoi de messages éphémères.</string>
<string name="prohibit_sending_disappearing">Interdire lenvoi de messages éphémères.</string>
<string name="prohibit_message_deletion">Interdire la suppression irréversible des messages.</string>
<string name="group_members_can_send_dms">Les membres du groupe peuvent envoyer des messages directs.</string>
<string name="direct_messages_are_prohibited_in_chat">Les messages directs entre membres sont interdits dans ce groupe.</string>
@@ -1021,7 +1021,6 @@
<string name="group_welcome_title">Message d\'accueil</string>
<string name="you_can_hide_or_mute_user_profile">Vous pouvez masquer ou mettre en sourdine un profil d\'utilisateur - maintenez-le enfoncé pour accéder au menu.</string>
<string name="you_will_still_receive_calls_and_ntfs">Vous continuerez à recevoir des appels et des notifications des profils mis en sourdine lorsqu\'ils sont actifs.</string>
<string name="settings_send_files_via_xftp">Envoi de vidéos et de fichiers via XFTP</string>
<string name="database_downgrade">Rétrogradation de la base de données</string>
<string name="database_upgrade">Mise à niveau de la base de données</string>
<string name="incompatible_database_version">Version de la base de données incompatible</string>
@@ -1037,7 +1036,6 @@
<string name="show_dev_options">Afficher :</string>
<string name="show_developer_options">Afficher les options pour les développeurs</string>
<string name="file_will_be_received_when_contact_completes_uploading">Le fichier sera reçu lorsque votre contact aura terminé de le mettre en ligne.</string>
<string name="xftp_requires_v461">v4.6.1+ nécessaire pour la réception via XFTP.</string>
<string name="developer_options">IDs de base de données et option d\'isolation du transport.</string>
<string name="settings_section_title_experimenta">EXPÉRIMENTALE</string>
<string name="hide_dev_options">Cacher :</string>
@@ -1075,4 +1073,66 @@
<string name="network_socks_proxy_settings">Paramètres de proxy SOCKS</string>
<string name="network_socks_toggle_use_socks_proxy">Utiliser un proxy SOCKS</string>
<string name="disable_onion_hosts_when_not_supported">Définissez <i>Utiliser les hôtes .onion</i> sur Non si le proxy SOCKS ne les prend pas en charge.</string>
<string name="la_lock_mode">Mode de SimpleX Lock</string>
<string name="lock_not_enabled">SimpleX Lock n\'est pas activé !</string>
<string name="la_lock_mode_system">Authentification du système</string>
<string name="la_authenticate">Authentification</string>
<string name="la_auth_failed">Echec de l\'authentification</string>
<string name="la_change_app_passcode">Modifier le code d\'accès</string>
<string name="la_current_app_passcode">Code d\'accès actuel</string>
<string name="la_minutes">%d minutes</string>
<string name="la_seconds">%d secondes</string>
<string name="la_enter_app_passcode">Entrer le code d\'accès</string>
<string name="la_immediately">Immédiatement</string>
<string name="la_no_app_password">Pas de code d\'accès à l\'app</string>
<string name="la_lock_mode_passcode">Saisie du code</string>
<string name="la_please_remember_to_store_password">Veuillez le mémoriser ou le conserver en toute sécurité - il n\'y a aucun moyen de récupérer un mot de passe perdu !</string>
<string name="enable_lock">Activer le verrouillage</string>
<string name="change_lock_mode">Modifier le mode de verrouillage</string>
<string name="incorrect_passcode">Code d\'accès erroné</string>
<string name="new_passcode">Nouveau code d\'accès</string>
<string name="la_mode_passcode">Code d\'accès</string>
<string name="passcode_changed">Code d\'accès modifié !</string>
<string name="passcode_not_changed">Le code d\'accès n\'a pas été modifié !</string>
<string name="passcode_set">Code d\'accès défini !</string>
<string name="la_mode_system">Système</string>
<string name="authentication_cancelled">Authentification annulée</string>
<string name="alert_title_msg_bad_id">Mauvais ID de message</string>
<string name="alert_text_msg_bad_hash">Le hash du message précédent est différent.</string>
<string name="alert_text_msg_bad_id">L\'ID du message suivant est incorrect (inférieur ou égal au précédent).
\nCela peut se produire en raison d\'un bug ou lorsque la connexion est compromise.</string>
<string name="decryption_error">Erreur de déchiffrement</string>
<string name="alert_text_fragment_encryption_out_of_sync_old_database">Cela peut se produire lorsque vous ou votre contact avez utilisé une ancienne sauvegarde de base de données.</string>
<string name="alert_title_msg_bad_hash">Mauvais hash de message</string>
<string name="no_spaces">Pas d\'espace !</string>
<string name="allow_calls_only_if">Autoriser les appels que si votre contact les autorise.</string>
<string name="allow_your_contacts_to_call">Autorise vos contacts à vous appeler.</string>
<string name="audio_video_calls">Appels audio/vidéo</string>
<string name="available_in_v51">"
\nDisponible dans la v5.1"</string>
<string name="prohibit_calls">Interdire les appels audio/vidéo.</string>
<string name="revoke_file__message">Le fichier sera supprimé des serveurs.</string>
<string name="revoke_file__confirm">Révoquer</string>
<string name="revoke_file__action">Révoquer le fichier</string>
<string name="revoke_file__title">Révoquer le fichier \?</string>
<string name="stop_snd_file__message">L\'envoi du fichier sera interrompu.</string>
<string name="alert_text_fragment_please_report_to_developers">Veuillez le signaler aux développeurs.</string>
<string name="submit_passcode">Soumettre</string>
<string name="both_you_and_your_contact_can_make_calls">Vous et votre contact pouvez tous deux passer des appels.</string>
<string name="only_you_can_make_calls">Vous seul pouvez passer des appels.</string>
<string name="calls_prohibited_with_this_contact">Interdire les appels audio/vidéo.</string>
<string name="confirm_passcode">Confirmer le code d\'accès</string>
<string name="lock_after">Verrouillage après</string>
<string name="lock_mode">Mode de verrouillage</string>
<string name="only_your_contact_can_make_calls">Seul votre contact peut passer des appels.</string>
<string name="stop_rcv_file__message">La réception du fichier sera interrompue.</string>
<string name="stop_file__confirm">Arrêter</string>
<string name="stop_snd_file__title">Arrêter l\'envoi du fichier \?</string>
<string name="stop_file__action">Arrêter le fichier</string>
<string name="stop_rcv_file__title">Arrêter de recevoir le fichier \?</string>
<string name="alert_text_fragment_permanent_error_reconnect">Cette erreur est persistante pour cette connexion, veuillez vous reconnecter.</string>
<string name="la_could_not_be_verified">Vous n\'avez pas pu être vérifié·e; veuillez réessayer.</string>
<string name="alert_text_decryption_error_header"><xliff:g id="message count" example="1">%1$d</xliff:g> messages n\'ont pas pu être déchiffrés.</string>
<string name="alert_text_decryption_error_too_many_skipped"><xliff:g id="message count" example="1">%1$d</xliff:g> messages sautés.</string>
<string name="you_can_turn_on_lock">Vous pouvez activer SimpleX Lock dans les Paramètres.</string>
</resources>
@@ -283,4 +283,17 @@
<string name="v4_6_reduced_battery_usage_descr">अधिक सुधार जल्द ही आ रहे हैं!</string>
<string name="icon_descr_video_asked_to_receive">वीडियो प्राप्त करने के लिए कहा</string>
<string name="delete_contact_all_messages_deleted_cannot_undo_warning">संपर्क और सभी संदेशों को हटा दिया जाएगा - इसे पूर्ववत नहीं किया जा सकता!</string>
<string name="ok">ठीक है</string>
<string name="save_servers_button">बचाना</string>
<string name="language_system">प्रणाली</string>
<string name="theme_system">प्रणाली</string>
<string name="network_options_save">बचाना</string>
<string name="chat_preferences_on">चालू</string>
<string name="la_lock_mode_system">प्रणाली प्रमाणीकरण</string>
<string name="la_mode_system">प्रणाली</string>
<string name="your_SMP_servers">आपका एसएमपी सर्वर</string>
<string name="messages_section_title">संदेशों</string>
<string name="member_will_be_removed_from_group_cannot_be_undone">सदस्य को समूह से निकाल दिया जाएगा - इसे पूर्ववत नहीं किया जा सकता!</string>
<string name="member_info_section_title_member">सदस्य</string>
<string name="group_member_role_member">सदस्य</string>
</resources>
@@ -298,7 +298,7 @@
<string name="display_name">Nome da mostrare</string>
<string name="add_new_contact_to_create_one_time_QR_code"><b>Aggiungi un contatto</b>: per creare il tuo codice QR una tantum per il tuo contatto.</string>
<string name="scan_QR_code_to_connect_to_contact_who_shows_QR_code"><b>Scansiona codice QR</b>: per connetterti al contatto che ti mostra il codice QR.</string>
<string name="choose_file">Scegli file</string>
<string name="choose_file">File</string>
<string name="clear_chat_button">Svuota chat</string>
<string name="clear_chat_question">Svuotare la chat\?</string>
<string name="clear_verb">Svuota</string>
@@ -308,6 +308,8 @@
<string name="create_group">Crea gruppo segreto</string>
<string name="desktop_scan_QR_code_from_app_via_scan_QR_code">💻 desktop: scansiona dall\'app il codice QR mostrato, tramite <b>Scansiona codice QR</b>.</string>
<string name="from_gallery_button">Dalla Galleria</string>
<string name="gallery_image_button">Immagine</string>
<string name="gallery_video_button">Video</string>
<string name="if_you_choose_to_reject_the_sender_will_not_be_notified">Se scegli di rifiutare, il mittente NON verrà avvisato.</string>
<string name="clear_chat_menu_action">Svuota</string>
<string name="icon_descr_close_button">Pulsante di chiusura</string>
@@ -545,7 +547,7 @@
<string name="to_connect_via_link_title">Per connettersi via link</string>
<string name="to_share_with_your_contact">(da condividere con il tuo contatto)</string>
<string name="to_start_a_new_chat_help_header">Per iniziare una nuova chat</string>
<string name="use_camera_button">Usa la fotocamera</string>
<string name="use_camera_button">Fotocamera</string>
<string name="you_can_connect_to_simplex_chat_founder">Puoi <font color="#0088ff">connetterti con gli sviluppatori di <xliff:g id="appNameFull">SimpleX Chat</xliff:g> per porre domande e ricevere aggiornamenti</font>.</string>
<string name="invalid_contact_link">Link non valido!</string>
<string name="invalid_QR_code">Codice QR non valido</string>
@@ -696,11 +698,9 @@
<string name="contact_wants_to_connect_via_call"><xliff:g id="contactName" example="Alice">%1$s</xliff:g> vuole connettersi con te via</string>
<string name="you_control_servers_to_receive_your_contacts_to_send">Puoi controllare attraverso quale/i server <b>ricevere</b> i messaggi, i tuoi contatti i server che usi per inviare loro i messaggi.</string>
<string name="alert_text_skipped_messages_it_can_happen_when">Può accadere quando:
\n1. I messaggi scadono sul server se non sono stati ricevuti per 30 giorni,
\n2. Il server usato per ricevere i messaggi da questo contatto è stato aggiornato e riavviato.
\n3. La connessione è compromessa.
\nConnettiti agli sviluppatori tramite Impostazioni per ricevere aggiornamenti riguardo i server.
\nAggiungeremo la ridondanza del server per prevenire la perdita di messaggi.</string>
\n1. I messaggi sono scaduti sul client mittente dopo 2 giorni o sul server dopo 30 giorni.
\n2. La decifrazione del messaggio è fallita, perché tu o il tuo contatto avete usato un backup del database vecchio.
\n3. La connessione è stata compromessa.</string>
<string name="icon_descr_call_rejected">Chiamata rifiutata</string>
<string name="icon_descr_call_missed">Chiamata persa</string>
<string name="status_no_e2e_encryption">nessuna crittografia e2e</string>
@@ -1021,7 +1021,6 @@
<string name="user_hide">Nascondi</string>
<string name="v4_6_group_welcome_message_descr">Imposta il messaggio mostrato ai nuovi membri!</string>
<string name="user_unmute">Riattiva audio</string>
<string name="settings_send_files_via_xftp">Invia video e file via XFTP</string>
<string name="database_downgrade">Downgrade del database</string>
<string name="database_upgrade">Aggiornamento del database</string>
<string name="incompatible_database_version">Versione del database incompatibile</string>
@@ -1030,7 +1029,6 @@
<string name="hide_dev_options">Nascondi:</string>
<string name="show_dev_options">Mostra:</string>
<string name="show_developer_options">Mostra opzioni sviluppatore</string>
<string name="xftp_requires_v461">v4.6.1+ necessaria per ricevere via XFTP.</string>
<string name="downgrade_and_open_chat">Esegui downgrade e apri chat</string>
<string name="database_migrations">Migrazioni: %s</string>
<string name="database_downgrade_warning">Attenzione: potresti perdere alcuni dati!</string>
@@ -1075,4 +1073,66 @@
<string name="smp_server_test_delete_file">Elimina file</string>
<string name="error_loading_smp_servers">Errore nel caricamento dei server SMP</string>
<string name="ensure_xftp_server_address_are_correct_format_and_unique">Assicurati che gli indirizzi del server XFTP siano nel formato corretto, uno per riga e non doppi.</string>
<string name="la_auth_failed">Autenticazione fallita</string>
<string name="la_lock_mode_passcode">Inserimento del codice di accesso</string>
<string name="la_lock_mode">Modalità di SimpleX Lock</string>
<string name="la_lock_mode_system">Autenticazione di sistema</string>
<string name="la_authenticate">Autentica</string>
<string name="la_change_app_passcode">Cambia codice di accesso</string>
<string name="la_current_app_passcode">Codice di accesso attuale</string>
<string name="la_minutes">%d minuti</string>
<string name="la_seconds">%d secondi</string>
<string name="la_enter_app_passcode">Inserisci il codice di accesso</string>
<string name="la_immediately">Immediatamente</string>
<string name="la_no_app_password">Nessun codice di accesso dell\'app</string>
<string name="la_please_remember_to_store_password">Ricordala o conservala in modo sicuro: non c\'è modo di recuperare una password persa!</string>
<string name="lock_not_enabled">SimpleX Lock non attivato!</string>
<string name="you_can_turn_on_lock">Puoi attivare SimpleX Lock tramite le impostazioni.</string>
<string name="la_could_not_be_verified">Non è stato possibile verificarti, riprova.</string>
<string name="confirm_passcode">Conferma il codice di accesso</string>
<string name="la_mode_passcode">Codice di accesso</string>
<string name="passcode_changed">Codice di accesso cambiato!</string>
<string name="passcode_not_changed">Codice di accesso non cambiato!</string>
<string name="passcode_set">Codice di accesso impostato!</string>
<string name="submit_passcode">Invia</string>
<string name="la_mode_system">Sistema</string>
<string name="change_lock_mode">Cambia modalità di blocco</string>
<string name="authentication_cancelled">Autenticazione annullata</string>
<string name="lock_after">Blocca dopo</string>
<string name="enable_lock">Attiva blocco</string>
<string name="incorrect_passcode">Codice di accesso errato</string>
<string name="new_passcode">Nuovo codice di accesso</string>
<string name="lock_mode">Modalità di blocco</string>
<string name="decryption_error">Errore di decifrazione</string>
<string name="alert_text_decryption_error_too_many_skipped"><xliff:g id="message count" example="1">%1$d</xliff:g> messaggi saltati.</string>
<string name="alert_title_msg_bad_id">ID del messaggio errato</string>
<string name="alert_text_fragment_encryption_out_of_sync_old_database">Può accadere quando tu o il tuo contatto avete usato il backup del database vecchio.</string>
<string name="alert_text_msg_bad_id">L\'ID del messaggio successivo non è corretto (inferiore o uguale al precedente).
\nPuò accadere a causa di qualche bug o quando la connessione è compromessa.</string>
<string name="alert_text_fragment_permanent_error_reconnect">L\'errore è permanente per questa connessione, riconnettiti.</string>
<string name="alert_text_decryption_error_header"><xliff:g id="message count" example="1">%1$d</xliff:g> messaggi non decifrati.</string>
<string name="alert_title_msg_bad_hash">Hash del messaggio errato</string>
<string name="alert_text_msg_bad_hash">L\'hash del messaggio precedente è diverso.</string>
<string name="alert_text_fragment_please_report_to_developers">Si prega di segnalarlo agli sviluppatori.</string>
<string name="stop_snd_file__message">L\'invio del file verrà interrotto.</string>
<string name="stop_file__action">Ferma file</string>
<string name="stop_snd_file__title">Fermare l\'invio del file\?</string>
<string name="revoke_file__message">Il file verrà eliminato dai server.</string>
<string name="stop_rcv_file__message">La ricezione del file verrà interrotta.</string>
<string name="revoke_file__confirm">Revoca</string>
<string name="revoke_file__action">Revoca file</string>
<string name="revoke_file__title">Revocare il file\?</string>
<string name="stop_file__confirm">Ferma</string>
<string name="stop_rcv_file__title">Fermare la ricezione del file\?</string>
<string name="no_spaces">Niente spazi!</string>
<string name="allow_calls_only_if">Consenti le chiamate solo se il contatto le consente.</string>
<string name="calls_prohibited_with_this_contact">Le chiamate audio/video sono vietate.</string>
<string name="both_you_and_your_contact_can_make_calls">Sia tu che il tuo contatto potete effettuare chiamate.</string>
<string name="only_you_can_make_calls">Solo tu puoi effettuare chiamate.</string>
<string name="only_your_contact_can_make_calls">Solo il tuo contatto può effettuare chiamate.</string>
<string name="prohibit_calls">Proibisci le chiamate audio/video.</string>
<string name="audio_video_calls">Chiamate audio/video</string>
<string name="available_in_v51">"
\nDisponibile nella v5.1"</string>
<string name="allow_your_contacts_to_call">Consenti ai tuoi contatti di chiamarti.</string>
</resources>
@@ -328,7 +328,7 @@
<string name="auth_enable_simplex_lock">SimpleX 잠금 활성화</string>
<string name="auth_log_in_using_credential">자격 증명으로 로그인</string>
<string name="auth_open_chat_console">채팅 콘솔 열기</string>
<string name="auth_stop_chat">채팅 중지하기</string>
<string name="auth_stop_chat">채팅 기능 중지하기</string>
<string name="auth_unlock">잠금 해제하기</string>
<string name="auth_you_will_be_required_to_authenticate_when_you_start_or_resume">앱을 사용하지 않는 지 30초가 지나면 다시 인증해야 해요.</string>
<string name="contact_wants_to_connect_with_you">님이 연결하고 싶어해요!</string>
@@ -841,7 +841,6 @@
<string name="select_contacts">연락처 선택</string>
<string name="skip_inviting_button">멤버 초대 건너뛰기</string>
<string name="sending_via">다음을 통해 보내기</string>
<string name="settings_send_files_via_xftp">XFTP로 동영상 및 파일 보내기</string>
<string name="stop_chat_confirmation">멈추기</string>
<string name="snd_group_event_changed_member_role">%s의 역할을 %s로 변경했어요.</string>
<string name="section_title_for_console">콘솔용</string>
@@ -887,4 +886,11 @@
<string name="smp_servers_your_server">내 서버</string>
<string name="smp_servers_your_server_address">내 서버 주소</string>
<string name="snd_group_event_member_deleted"><xliff:g id="member profile" example="alice (Alice)">%1$s</xliff:g>을(를) 강퇴했어요.</string>
<string name="stop_chat_to_export_import_or_delete_chat_database">채팅 데이터베이스를 내보내기, 가져오기 또는 삭제 하려면 채팅 기능을 중지해 주세요. 채팅 기능이 중지된 동안에는 메시지를 주고받을 수 없어요.</string>
<string name="store_passphrase_securely">비밀번호를 모르면 변경하거나 찾을 수 없으므로 비밀번호를 안전하게 보관해 주세요.</string>
<string name="submit_passcode">제출하기</string>
<string name="store_passphrase_securely_without_recover">비밀번호를 모르면 채팅에 액세스할 수 없으니 비밀번호를 안전하게 보관해 주세요.</string>
<string name="stop_chat_question">채팅 기능을 중지할까요\?</string>
<string name="stop_chat_to_enable_database_actions">데이터베이스 작업을 할 수 있도록 채팅 기능을 중지하기</string>
<string name="switch_receiving_address">수신 주소 바꾸기</string>
</resources>
@@ -385,6 +385,8 @@
<string name="file_not_found">Bestand niet gevonden</string>
<string name="file_saved">Bestand opgeslagen</string>
<string name="from_gallery_button">Galerij</string>
<string name="gallery_image_button">Foto</string>
<string name="gallery_video_button">Video</string>
<string name="error_saving_ICE_servers">Fout bij opslaan van ICE servers</string>
<string name="callstate_ended">geëindigd</string>
<string name="group_members_can_send_disappearing">Groepsleden kunnen verdwijnende berichten sturen.</string>
@@ -483,11 +485,9 @@
<string name="join_group_incognito_button">Doe incognito mee</string>
<string name="group_preview_join_as">lid worden als %s</string>
<string name="alert_text_skipped_messages_it_can_happen_when">Het kan gebeuren wanneer:
\n1. De berichten op de server verlopen als ze 30 dagen niet zijn ontvangen,
\n2. De server die u gebruikt om de berichten van deze contactpersoon te ontvangen, is bijgewerkt en opnieuw opgestart.
\n3. De verbinding is verbroken.
\nMaak verbinding met de ontwikkelaars via Instellingen om de updates over de servers te ontvangen.
\nWe zullen serverredundantie toevoegen om verloren berichten te voorkomen.</string>
\n1. De berichten zijn na 2 dagen verlopen bij de verzendende client of na 30 dagen op de server.
\n2. Decodering van het bericht is mislukt, omdat u of uw contactpersoon een oude databaseback-up heeft gebruikt.
\n3. De verbinding is verbroken.</string>
<string name="joining_group">Deel nemen aan groep</string>
<string name="leave_group_button">Verlaten</string>
<string name="group_member_role_member">Gebruiker</string>
@@ -846,7 +846,7 @@
<string name="app_name"><xliff:g id="appName">SimpleX</xliff:g></string>
<string name="connected_to_server_to_receive_messages_from_contact">U bent verbonden met de server die wordt gebruikt om berichten van dit contact te ontvangen.</string>
<string name="profile_will_be_sent_to_contact_sending_link">Je profiel wordt verzonden naar het contact van wie je deze link hebt ontvangen.</string>
<string name="you_will_join_group">U wordt lid van een groep waarnaar deze link verwijst en maakt verbinding met de groepsleden.</string>
<string name="you_will_join_group">U wordt lid van de groep waar deze link naar verwijst en maakt verbinding met de groepsleden.</string>
<string name="notifications_mode_off">Wordt uitgevoerd wanneer de app is geopend</string>
<string name="settings_notification_preview_mode_title">Toon voorbeeld</string>
<string name="ntf_channel_calls">SimpleX Chat oproepen</string>
@@ -1020,7 +1020,6 @@
<string name="to_reveal_profile_enter_password">Om uw verborgen profiel te onthullen, voert u een volledig wachtwoord in een zoekveld in op de pagina Uw chat profielen.</string>
<string name="button_welcome_message">Welkomst bericht</string>
<string name="you_will_still_receive_calls_and_ntfs">U ontvangt nog steeds oproepen en meldingen van gedempte profielen wanneer deze actief zijn.</string>
<string name="settings_send_files_via_xftp">Verzend video\'s en bestanden via XFTP</string>
<string name="database_downgrade">Database downgraden</string>
<string name="invalid_migration_confirmation">Ongeldige migratie bevestiging</string>
<string name="upgrade_and_open_chat">Upgrade en open chat</string>
@@ -1039,7 +1038,6 @@
<string name="hide_dev_options">Verbergen:</string>
<string name="show_developer_options">Ontwikkelaars opties tonen</string>
<string name="settings_section_title_experimenta">EXPERIMENTEEL</string>
<string name="xftp_requires_v461">v4.6.1+ is vereist om te ontvangen via XFTP.</string>
<string name="cancel_file__question">Bestand overdracht annuleren\?</string>
<string name="file_transfer_will_be_cancelled_warning">Bestand overdracht wordt geannuleerd. Als het bezig is, wordt het gestopt.</string>
<string name="delete_profile">Verwijder profiel</string>
@@ -1074,4 +1072,72 @@
<string name="error_loading_smp_servers">Fout bij het laden van SMP servers</string>
<string name="ensure_xftp_server_address_are_correct_format_and_unique">Zorg ervoor dat XFTP server adressen de juiste indeling hebben, regel gescheiden zijn en niet gedupliceerd zijn.</string>
<string name="network_proxy_port">poort %d</string>
<string name="lock_after">Vergrendelen na</string>
<string name="la_auth_failed">Verificatie mislukt</string>
<string name="la_change_app_passcode">Toegangscode wijzigen</string>
<string name="la_current_app_passcode">Huidige toegangscode</string>
<string name="la_enter_app_passcode">Voer toegangscode in</string>
<string name="la_no_app_password">Geen app toegangscode</string>
<string name="la_lock_mode_passcode">Toegangscode invoer</string>
<string name="la_lock_mode">SimpleX Vergrendel modus</string>
<string name="la_lock_mode_system">Systeem authenticatie</string>
<string name="la_could_not_be_verified">U kon niet worden geverifieerd; probeer het opnieuw.</string>
<string name="la_authenticate">Authenticeren</string>
<string name="la_minutes">%d minuten</string>
<string name="la_seconds">%d seconden</string>
<string name="la_immediately">Onmiddellijk</string>
<string name="la_please_remember_to_store_password">Onthoud of bewaar het veilig - er is geen manier om een verloren wachtwoord te herstellen!</string>
<string name="lock_not_enabled">SimpleX vergrendeling niet ingeschakeld!</string>
<string name="you_can_turn_on_lock">Je kunt SimpleX Vergrendeling aanzetten via Instellingen.</string>
<string name="enable_lock">Vergrendeling inschakelen</string>
<string name="lock_mode">Vergrendeling modus</string>
<string name="submit_passcode">Indienen</string>
<string name="authentication_cancelled">Verificatie geannuleerd</string>
<string name="change_lock_mode">Wijzig de vergrendelings modus</string>
<string name="confirm_passcode">Bevestig toegangscode</string>
<string name="incorrect_passcode">Onjuiste toegangscode</string>
<string name="new_passcode">Nieuwe toegangscode</string>
<string name="la_mode_passcode">Toegangscode</string>
<string name="passcode_changed">Toegangscode gewijzigd!</string>
<string name="passcode_not_changed">Toegangscode niet gewijzigd!</string>
<string name="passcode_set">Toegangscode ingesteld!</string>
<string name="la_mode_system">Systeem</string>
<string name="decryption_error">Decryptie fout</string>
<string name="alert_text_msg_bad_hash">De hash van het vorige bericht is anders.</string>
<string name="alert_text_decryption_error_too_many_skipped"><xliff:g id="message count" example="1">%1$d</xliff:g> berichten overgeslagen.</string>
<string name="alert_text_fragment_encryption_out_of_sync_old_database">Het kan gebeuren wanneer u of uw verbinding de oude databaseback-up gebruikte.</string>
<string name="alert_text_fragment_please_report_to_developers">Meld het alsjeblieft aan de ontwikkelaars.</string>
<string name="alert_text_fragment_permanent_error_reconnect">Deze fout is permanent voor deze verbinding, maak opnieuw verbinding.</string>
<string name="alert_title_msg_bad_hash">Onjuiste bericht hash</string>
<string name="alert_title_msg_bad_id">Onjuiste bericht ID</string>
<string name="alert_text_msg_bad_id">De ID van het volgende bericht is onjuist (minder of gelijk aan het vorige).
\nHet kan gebeuren vanwege een bug of wanneer de verbinding is aangetast.</string>
<string name="alert_text_decryption_error_header"><xliff:g id="message count" example="1">%1$d</xliff:g>-berichten konden niet worden ontsleuteld.</string>
<string name="no_spaces">Geen spaties!</string>
<string name="stop_rcv_file__message">Het ontvangen van het bestand wordt gestopt.</string>
<string name="revoke_file__confirm">Intrekken</string>
<string name="revoke_file__action">Bestand intrekken</string>
<string name="revoke_file__title">Bestand intrekken\?</string>
<string name="stop_file__confirm">Stop</string>
<string name="stop_file__action">Bestand stoppen</string>
<string name="stop_rcv_file__title">Stopt met het ontvangen van een bestand\?</string>
<string name="stop_snd_file__title">Bestand verzenden stoppen\?</string>
<string name="only_your_contact_can_make_calls">Alleen je contact kan bellen.</string>
<string name="revoke_file__message">Het bestand wordt van de servers verwijderd.</string>
<string name="both_you_and_your_contact_can_make_calls">Zowel u als uw contact persoon kunnen bellen.</string>
<string name="only_you_can_make_calls">Alleen jij kunt bellen.</string>
<string name="stop_snd_file__message">Het verzenden van het bestand wordt gestopt.</string>
<string name="allow_calls_only_if">Sta oproepen alleen toe als uw contact persoon dit toestaat.</string>
<string name="allow_your_contacts_to_call">Sta toe dat uw contacten u bellen.</string>
<string name="audio_video_calls">Audio/video oproepen</string>
<string name="available_in_v51">"
\nBeschikbaar in v5.1"</string>
<string name="prohibit_calls">Audio/video gesprekken verbieden.</string>
<string name="calls_prohibited_with_this_contact">Audio/video gesprekken zijn verboden.</string>
<string name="v5_0_large_files_support_descr">Snel en niet wachten tot de afzender online is!</string>
<string name="v5_0_app_passcode">App toegangscode</string>
<string name="v5_0_app_passcode_descr">Stel het in in plaats van systeemverificatie.</string>
<string name="v5_0_polish_interface">Poolse interface</string>
<string name="v5_0_polish_interface_descr">Dank aan de gebruikers draag bij via Weblate!</string>
<string name="v5_0_large_files_support">Video\'s en bestanden tot 1 GB</string>
</resources>
@@ -154,7 +154,7 @@
<string name="icon_descr_sent_msg_status_unauthorized_send">nieautoryzowane wysyłanie</string>
<string name="icon_descr_received_msg_status_unread">oznacz jako nieprzeczytane</string>
<string name="welcome">Witaj!</string>
<string name="personal_welcome">Witaj &lt;xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\"&gt;!</string>
<string name="personal_welcome">Witaj <xliff:g>%1$s</xliff:g>!</string>
<string name="group_preview_you_are_invited">jesteś zaproszony do grupy</string>
<string name="you_have_no_chats">Nie masz czatów</string>
<string name="your_chats">Twoje czaty</string>
@@ -224,9 +224,9 @@
<string name="scan_QR_code">Zeskanuj kod QR</string>
<string name="add_contact_or_create_group">Rozpocznij nowy czat</string>
<string name="to_share_with_your_contact">(aby udostępnić Twojemu kontaktowi)</string>
<string name="choose_file">Wybierz plik</string>
<string name="choose_file">Plik</string>
<string name="toast_permission_denied">Odmowa Uprawnienia!</string>
<string name="use_camera_button">Użyj Aparatu</string>
<string name="use_camera_button">Aparatu</string>
<string name="accept_contact_button">Akceptuj</string>
<string name="accept_contact_incognito_button">Akceptuj incognito</string>
<string name="clear_chat_warning">Wszystkie wiadomości zostaną usunięte - nie można tego cofnąć! Wiadomości zostaną usunięte TYLKO dla Ciebie.</string>
@@ -449,7 +449,7 @@
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages">Tylko urządzenia klienckie przechowują profile użytkowników, kontakty, grupy i wiadomości wysyłane za pomocą <b>2-warstwowego szyfrowania end-to-end</b>.</string>
<string name="onboarding_notifications_mode_periodic">Okresowo</string>
<string name="onboarding_notifications_mode_title">Prywatne powiadomienia</string>
<string name="read_more_in_github_with_link">Przeczytaj więcej w naszym <font color="#0088ff">repozytorium GitHub</font>.</string>
<string name="read_more_in_github_with_link">Przeczytaj więcej na naszym <font color="#0088ff">repozytorium GitHub</font>.</string>
<string name="read_more_in_github">Przeczytaj więcej na naszym repozytorium GitHub.</string>
<string name="use_chat">Użyj czatu</string>
<string name="onboarding_notifications_mode_off">Gdy aplikacja jest uruchomiona</string>
@@ -505,13 +505,11 @@
<string name="call_connection_via_relay">przez przekaźnik</string>
<string name="icon_descr_video_off">Wideo wyłączone</string>
<string name="icon_descr_video_on">Wideo włączone</string>
<string name="integrity_msg_skipped">&lt;xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\" id=\"connection ID\" example=\"1\"&gt; wiadomość(i) pominięta(e)</string>
<string name="integrity_msg_skipped"><xliff:g id="connection ID" example="1">%1$d</xliff:g> wiadomość(i) pominięta(e)</string>
<string name="alert_text_skipped_messages_it_can_happen_when">Może to nastąpić, gdy:
\n1. Wiadomości wygasają na serwerze, jeśli nie zostały odebrane przez 30 dni,
\n2. Serwer, którego używasz do odbierania wiadomości od tego kontaktu został zaktualizowany i uruchomiony ponownie.
\n3. Połączenie jest skompromitowane.
\nProszę połączyć się z deweloperami przez Ustawienia, aby otrzymać aktualizacje dotyczące serwerów.
\nBędziemy dodawać redundancję serwerów, aby zapobiec utracie wiadomości.</string>
\n1. Wiadomości wygasły w wysyłającym kliencie po 2 dniach lub na serwerze po 30 dniach.
\n2. Odszyfrowanie wiadomości nie powiodło się, ponieważ Ty lub Twój kontakt użyliście starej kopii zapasowej bazy danych.
\n3. Połączenie zostało skompromitowane.</string>
<string name="privacy_and_security">Prywatność i bezpieczeństwo</string>
<string name="alert_title_skipped_messages">Pominięte wiadomości</string>
<string name="your_privacy">Twoja prywatność</string>
@@ -541,13 +539,11 @@
<string name="protect_app_screen">Chroń ekran aplikacji</string>
<string name="run_chat_section">URUCHOM CZAT</string>
<string name="send_link_previews">Wyślij podgląd linku</string>
<string name="settings_send_files_via_xftp">Wysyłaj filmy i pliki przez XFTP</string>
<string name="settings_section_title_settings">USTAWIENIA</string>
<string name="settings_section_title_socks">PROXY SOCKS</string>
<string name="stop_chat_question">Zatrzymać czat\?</string>
<string name="settings_section_title_support">WSPIERAJ SIMPLEX CHAT</string>
<string name="settings_section_title_themes">MOTYWY</string>
<string name="xftp_requires_v461">v4.6.1+ jest wymagany do odbierania przez XFTP.</string>
<string name="settings_section_title_you">TY</string>
<string name="your_chat_database">Twoja baza danych czatu</string>
<string name="set_password_to_export">Ustaw hasło do eksportu</string>
@@ -723,7 +719,7 @@
<string name="button_leave_group">Opuść grupę</string>
<string name="button_welcome_message">Wiadomość powitalna</string>
<string name="invite_prohibited_description">Próbujesz zaprosić osobę, z którą masz wspólny profil incognito do grupy, w której używasz swojego głównego profilu</string>
<string name="group_info_member_you">ty: &lt;xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\" id=\"group_info_you\"&gt;</string>
<string name="group_info_member_you">ty: <xliff:g id="group_info_you">%1$s</xliff:g></string>
<string name="change_verb">Zmień</string>
<string name="change_member_role_question">Zmienić rolę grupy\?</string>
<string name="change_role">Zmień rolę</string>
@@ -808,7 +804,7 @@
<string name="feature_enabled_for_you">włączone dla Ciebie</string>
<string name="group_preferences">Preferencje grupy</string>
<string name="incognito">Incognito</string>
<string name="incognito_info_allows">Pozwala na posiadanie wielu anonimowych połączeń bez żadnych wspólnych danych między nimi w jednym profilu czatu.</string>
<string name="incognito_info_allows">To pozwala na posiadanie wielu anonimowych połączeń bez żadnych wspólnych danych między nimi w pojedynczym profilu czatu.</string>
<string name="theme_light">Jasny</string>
<string name="chat_preferences_no">nie</string>
<string name="chat_preferences_off">wyłączony</string>
@@ -925,7 +921,7 @@
<string name="users_delete_all_chats_deleted">Wszystkie czaty i wiadomości zostaną usunięte - nie można tego cofnąć!</string>
<string name="allow_verb">Pozwól</string>
<string name="chat_preferences_always">zawsze</string>
<string name="notifications_mode_service">Zawsze włączone</string>
<string name="notifications_mode_service">Zawsze włączona</string>
<string name="allow_irreversible_message_deletion_only_if">Zezwalaj na nieodwracalne usuwanie wiadomości tylko wtedy, gdy Twój kontakt Ci na to pozwoli.</string>
<string name="allow_to_send_disappearing">Zezwól na wysyłanie znikających wiadomości.</string>
<string name="allow_voice_messages_question">Zezwolić na wiadomości głosowe\?</string>
@@ -972,6 +968,8 @@
\n- usuwać wiadomości członków.
\n- wyłączyć członków (rola \"obserwatora\")</string>
<string name="from_gallery_button">Z Galerii</string>
<string name="gallery_image_button">Obraz</string>
<string name="gallery_video_button">Wideo</string>
<string name="feature_offered_item_with_param">zaproponował %s: %2s</string>
<string name="only_group_owners_can_enable_voice">Tylko właściciele grup mogą włączyć wiadomości głosowe.</string>
<string name="network_use_onion_hosts_no_desc_in_alert">Hosty onion nie będą używane.</string>
@@ -1036,11 +1034,11 @@
<string name="icon_descr_simplex_team">Drużyna <xliff:g id="appName">SimpleX</xliff:g></string>
<string name="network_use_onion_hosts_prefer">Gdy dostępny</string>
<string name="v4_2_auto_accept_contact_requests_desc">Z opcjonalną wiadomością powitalną.</string>
<string name="group_info_section_title_num_members">&lt;xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\" id=\"num_members\"&gt; CZŁONKÓW</string>
<string name="group_info_section_title_num_members"><xliff:g id="num_members">%1$s</xliff:g> CZŁONKÓW</string>
<string name="simplex_service_notification_title">serwis <xliff:g id="appNameFull">SimpleX Chat</xliff:g></string>
<string name="contact_wants_to_connect_via_call">&lt;xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\" id=\"contactName\" example=\"Alice\"&gt; chce się z Tobą połączyć przez</string>
<string name="contact_wants_to_connect_via_call"><xliff:g id="contactName" example="Alice">%1$s</xliff:g> chce się z Tobą połączyć przez</string>
<string name="you_are_already_connected_to_vName_via_this_link">Jesteś już połączony z <xliff:g id="contactName" example="Alice">%1$s!</xliff:g>.</string>
<string name="you_can_connect_to_simplex_chat_founder">Możesz <font color="#0088ff">połączyć się z deweloperami<xliff:g id="appNameFull">SimpleX Chat</xliff:g> aby zadać wszelkie pytania i otrzymywać aktualizacje</font>.</string>
<string name="you_can_connect_to_simplex_chat_founder">Możesz <font color="#0088ff">połączyć się z deweloperami <xliff:g id="appNameFull">SimpleX Chat</xliff:g> aby zadać wszelkie pytania i otrzymywać aktualizacje</font>.</string>
<string name="you_can_share_group_link_anybody_will_be_able_to_connect">Możesz udostępnić link lub kod QR - każdy będzie mógł dołączyć do grupy. Nie stracisz członków grupy, jeśli później ją usuniesz.</string>
<string name="you_must_use_the_most_recent_version_of_database">Musisz używać najnowszej wersji bazy danych czatu TYLKO na jednym urządzeniu, w przeciwnym razie możesz przestać otrzymywać wiadomości od niektórych kontaktów.</string>
<string name="you_can_start_chat_via_setting_or_by_restarting_the_app">Możesz rozpocząć czat poprzez Ustawienia aplikacji / Bazę danych lub poprzez ponowne uruchomienie aplikacji.</string>
@@ -1075,4 +1073,74 @@
<string name="network_socks_proxy_settings">Ustawienia PROXY SOCKS</string>
<string name="network_socks_toggle_use_socks_proxy">Użyj proxy SOCKS</string>
<string name="ensure_xftp_server_address_are_correct_format_and_unique">Upewnij się, że adresy serwerów XFTP są w poprawnym formacie, rozdzielone liniami i nie są zduplikowane.</string>
<string name="la_auth_failed">Uwierzytelnianie nie powiodło się</string>
<string name="la_lock_mode_passcode">Wpis pinu</string>
<string name="la_lock_mode">Tryb blokady SimpleX</string>
<string name="la_lock_mode_system">Uwierzytelnianie systemu</string>
<string name="la_could_not_be_verified">Nie można zweryfikować użytkownika; proszę spróbować ponownie.</string>
<string name="la_change_app_passcode">Zmień pin</string>
<string name="la_current_app_passcode">Aktualny Pin</string>
<string name="la_minutes">%d minut</string>
<string name="la_seconds">%d sekund</string>
<string name="la_enter_app_passcode">Wprowadź Pin</string>
<string name="la_no_app_password">Brak pinu aplikacji</string>
<string name="lock_not_enabled">Blokada SimpleX wyłączona!</string>
<string name="you_can_turn_on_lock">Możesz włączyć blokadę SimpleX poprzez Ustawienia.</string>
<string name="enable_lock">Włącz blokadę</string>
<string name="authentication_cancelled">Uwierzytelnianie anulowane</string>
<string name="confirm_passcode">Potwierdź Pin</string>
<string name="incorrect_passcode">Nieprawidłowy pin</string>
<string name="lock_after">Zablokuj po</string>
<string name="lock_mode">Tryb blokady</string>
<string name="new_passcode">Nowy Pin</string>
<string name="la_mode_passcode">Pin</string>
<string name="passcode_changed">Pin zmieniony!</string>
<string name="passcode_set">Pin ustawiony!</string>
<string name="submit_passcode">Zatwierdź</string>
<string name="la_mode_system">System</string>
<string name="change_lock_mode">Zmień tryb blokady</string>
<string name="passcode_not_changed">Pin nie został zmieniony!</string>
<string name="la_authenticate">Uwierzytelnij</string>
<string name="la_immediately">Natychmiast</string>
<string name="la_please_remember_to_store_password">Prosimy o jego zapamiętanie lub bezpieczne przechowywanie - nie ma możliwości odzyskania utraconego pinu!</string>
<string name="decryption_error">Błąd odszyfrowania</string>
<string name="decryption_error_permanent">Trwały błąd odszyfrowywania</string>
<string name="alert_title_msg_bad_hash">Zły hash wiadomości</string>
<string name="alert_title_msg_bad_id">Zły identyfikator wiadomości</string>
<string name="alert_text_msg_bad_hash">Hash poprzedniej wiadomości jest inny.</string>
<string name="alert_text_msg_bad_id">Identyfikator następnej wiadomości jest nieprawidłowy (mniejszy lub równy poprzedniej).
\nMoże się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skompromitowane.</string>
<string name="alert_text_decryption_error_header">Nie udało się odszyfrować <xliff:g id="message count" example="1">%1$d</xliff:g> wiadomości.</string>
<string name="alert_text_decryption_error_earlier">Nie udało się odszyfrować <xliff:g id="message count" example="1">%1$d</xliff:g> wiadomości i nie będą one pokazane.</string>
<string name="alert_text_fragment_permanent_error_reconnect">Ten błąd jest trwały dla tego połączenia, proszę o ponowne połączenie.</string>
<string name="alert_text_decryption_error_too_many_skipped"><xliff:g id="message count" example="1">%1$d</xliff:g> pominiętych wiadomości.</string>
<string name="alert_text_fragment_encryption_out_of_sync_old_database">Może się to zdarzyć, gdy Ty lub Twoje połączenie użyło starej kopii zapasowej bazy danych.</string>
<string name="alert_text_fragment_please_report_to_developers">Prosimy o zgłaszanie tego do deweloperów.</string>
<string name="calls_prohibited_with_this_contact">Połączenia audio/wideo są zabronione.</string>
<string name="revoke_file__message">Plik zostanie usunięty z serwerów.</string>
<string name="only_you_can_make_calls">Tylko Ty możesz wykonywać połączenia.</string>
<string name="stop_rcv_file__message">Odbieranie pliku zostanie przerwane.</string>
<string name="no_spaces">Bez spacji!</string>
<string name="allow_calls_only_if">Zezwalaj na połączenia tylko wtedy, gdy Twój kontakt na to pozwala.</string>
<string name="allow_your_contacts_to_call">Zezwól swoim kontaktom na połączenia do Ciebie.</string>
<string name="audio_video_calls">Połączenia audio/wideo</string>
<string name="available_in_v51">"
\nDostępny w v5.1"</string>
<string name="both_you_and_your_contact_can_make_calls">Zarówno Ty, jak i Twój kontakt możecie nawiązywać połączenia.</string>
<string name="prohibit_calls">Zabroń połączeń audio/wideo.</string>
<string name="only_your_contact_can_make_calls">Tylko Twój kontakt może wykonywać połączenia.</string>
<string name="revoke_file__action">Odwołaj plik</string>
<string name="revoke_file__title">Odwołać plik\?</string>
<string name="stop_snd_file__message">Wysyłanie pliku zostanie przerwane.</string>
<string name="stop_file__confirm">Zatrzymaj</string>
<string name="stop_file__action">Zatrzymaj plik</string>
<string name="stop_rcv_file__title">Przestać odbierać plik\?</string>
<string name="stop_snd_file__title">Przestać wysyłać plik\?</string>
<string name="revoke_file__confirm">Odwołaj</string>
<string name="v5_0_app_passcode">Pin aplikacji</string>
<string name="v5_0_polish_interface">Polski interfejs</string>
<string name="v5_0_large_files_support">Filmy i pliki do 1gb</string>
<string name="v5_0_app_passcode_descr">Ustaw go zamiast uwierzytelniania systemowego.</string>
<string name="v5_0_large_files_support_descr">Szybko i bez czekania aż nadawca będzie online!</string>
<string name="v5_0_polish_interface_descr">Podziękowania dla użytkowników - wkład za pośrednictwem Weblate!</string>
</resources>
@@ -24,7 +24,7 @@
<string name="icon_descr_asked_to_receive">Pediu para receber a imagem</string>
<string name="icon_descr_cancel_live_message">Cancelar mensagem ao vivo</string>
<string name="back">Voltar</string>
<string name="choose_file">Selecione o arquivo</string>
<string name="choose_file">Arquivo</string>
<string name="add_new_contact_to_create_one_time_QR_code"><b>Adicionar novo contato</b>: para criar seu QR code de uso único para seu contato.</string>
<string name="scan_QR_code_to_connect_to_contact_who_shows_QR_code"><b>Escanear código QR</b>: para se conectar ao seu contato que mostra o código QR para você.</string>
<string name="accept_contact_button">Aceitar</string>
@@ -352,6 +352,7 @@
<string name="description_via_one_time_link_incognito">anônimo via link único</string>
<string name="hide_verb">Ocultar</string>
<string name="from_gallery_button">Da Galeria</string>
<string name="gallery_video_button">Vídeo</string>
<string name="group_members_can_send_disappearing">Os membros do grupo podem enviar mensagens que desaparecem.</string>
<string name="icon_descr_file">Arquivo</string>
<string name="full_name__field">Nome completo:</string>
@@ -499,7 +500,7 @@
<string name="save_color">Salvar cor</string>
<string name="v4_5_italian_interface">interface italiana</string>
<string name="periodic_notifications">Notificações periódicas</string>
<string name="use_camera_button">Usar câmera</string>
<string name="use_camera_button">Câmera</string>
<string name="your_ICE_servers">Seus servidores ICE</string>
<string name="your_ice_servers">Seus servidores ICE</string>
<string name="your_privacy">Sua privacidade</string>
@@ -690,7 +691,7 @@
<string name="v4_6_reduced_battery_usage">Maior redução no uso da bateria</string>
<string name="v4_6_reduced_battery_usage_descr">Mais melhorias chegarão em breve!</string>
<string name="settings_section_title_you">VOCÊ</string>
<string name="settings_section_title_messages">MENSAGENS</string>
<string name="settings_section_title_messages">MENSAGENS E ARQUIVOS</string>
<string name="your_chat_database">Seu banco de dados de chat</string>
<string name="snd_group_event_member_deleted">Você removeu&lt;xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\" id=\"member profile\" example=\"alice (Alice)\"&gt;</string>
<string name="group_member_status_removed">removido</string>
@@ -699,7 +700,6 @@
<string name="group_member_status_invited">convidado</string>
<string name="select_contacts">Selecionar contatos</string>
<string name="num_contacts_selected">%d contato(s) selecionado(s)</string>
<string name="settings_send_files_via_xftp">Envie vídeos e arquivos via XFTP</string>
<string name="delete_chat_profile_action_cannot_be_undone_warning">Esta ação não pode ser desfeita - seu perfil, contatos, mensagens e arquivos serão irreversivelmente perdidos.</string>
<string name="remove_passphrase">Remover</string>
<string name="wrong_passphrase">Senha do banco de dados incorreta</string>
@@ -1010,7 +1010,6 @@
<string name="callstate_waiting_for_confirmation">aguardando confirmação…</string>
<string name="we_do_not_store_contacts_or_messages_on_servers">Não armazenamos nenhum dos seus contatos ou mensagens (uma vez entregues) nos servidores.</string>
<string name="alert_title_skipped_messages">Mensagens ignoradas</string>
<string name="xftp_requires_v461">v4.6.1+ é necessário receber via XFTP.</string>
<string name="tap_to_activate_profile">Toque para ativar o perfil.</string>
<string name="unhide_chat_profile">Mostrar perfil de chat</string>
<string name="unhide_profile">Mostrar perfil</string>
@@ -1038,7 +1037,7 @@
<string name="ntf_channel_calls">Chamadas</string>
<string name="ntf_channel_messages">Mensagens</string>
<string name="la_notice_title_simplex_lock">Bloqueio SimpleX</string>
<string name="markdown_help">Ajuda Markdown</string>
<string name="markdown_help">Ajuda com Markdown</string>
<string name="onboarding_notifications_mode_service">Instantânea</string>
<string name="open_simplex_chat_to_accept_call">Abra<xliff:g id="appNameFull">o chat do SimpleX</xliff:g> para aceitar a chamada</string>
<string name="call_connection_via_relay">via relay</string>
@@ -1055,4 +1054,52 @@
<string name="you_control_servers_to_receive_your_contacts_to_send">Você controla por meio de qual(is) servidor(es) <b>receber</b> as mensagens, seus contatos controlam os servidores que você usa para enviar mensagens.</string>
<string name="smp_server_test_secure_queue">Fila segura</string>
<string name="icon_descr_profile_image_placeholder">imagem de perfil temporária</string>
<string name="error_loading_smp_servers">Erro ao carregar servidores SMP</string>
<string name="error_loading_xftp_servers">Erro ao carregar servidores XFTP</string>
<string name="error_saving_xftp_servers">Erro ao salvar servidores XFTP</string>
<string name="ensure_xftp_server_address_are_correct_format_and_unique">Certifique-se de que os endereços dos servidores XFTP estejam no formato correto, separados por linha e não estão duplicados.</string>
<string name="smp_server_test_create_file">Criar arquivo</string>
<string name="smp_server_test_download_file">Baixar arquivo</string>
<string name="error_xftp_test_server_auth">O servidor requer autorização para fazer upload, verifique a senha</string>
<string name="smp_server_test_upload_file">Enviar arquivo</string>
<string name="smp_server_test_compare_file">Comparar arquivo</string>
<string name="smp_server_test_delete_file">Excluír arquivo</string>
<string name="your_XFTP_servers">Seus servidores XFTP</string>
<string name="la_auth_failed">Autenticação falhou</string>
<string name="la_change_app_passcode">Mudar senha</string>
<string name="la_current_app_passcode">Senha atual</string>
<string name="la_minutes">%d minutos</string>
<string name="la_seconds">%d segundos</string>
<string name="la_enter_app_passcode">Digite a senha</string>
<string name="la_immediately">Imediatamente</string>
<string name="la_no_app_password">Sem senha de aplicativo</string>
<string name="la_lock_mode_passcode">Entrada de senha</string>
<string name="la_please_remember_to_store_password">Por favor, lembre-se ou guarde-a com segurança - não há como recuperar uma senha perdida!</string>
<string name="la_lock_mode">Modo de bloqueio SimpleX</string>
<string name="la_lock_mode_system">Autenticação do sistema</string>
<string name="la_could_not_be_verified">Você não pôde ser verificado; por favor, tente novamente.</string>
<string name="la_authenticate">Autenticar</string>
<string name="lock_not_enabled">Bloqueio SimpleX não ativado!</string>
<string name="xftp_servers">Servidores XFTP</string>
<string name="network_proxy_port">porta %d</string>
<string name="network_socks_proxy_settings">Configurações de proxy SOCKS</string>
<string name="network_socks_toggle_use_socks_proxy">Usar proxy SOCKS</string>
<string name="host_verb">Hospedar</string>
<string name="disable_onion_hosts_when_not_supported">Definir <i>Usar hosts .onion</i> para não se o proxy SOCKS não oferecer suporte a eles.</string>
<string name="port_verb">Porta</string>
<string name="confirm_passcode">Confirmar senha</string>
<string name="incorrect_passcode">Senha incorreta</string>
<string name="lock_after">Bloquear após</string>
<string name="submit_passcode">Enviar</string>
<string name="change_lock_mode">Mudar modo de bloqueio</string>
<string name="lock_mode">Modo de bloqueio</string>
<string name="new_passcode">Nova Senha</string>
<string name="passcode_not_changed">A senha não foi alterada!</string>
<string name="passcode_set">Senha definida!</string>
<string name="la_mode_system">Sistema</string>
<string name="la_mode_passcode">Senha</string>
<string name="authentication_cancelled">Autenticação cancelada</string>
<string name="enable_lock">Habilitar bloqueio</string>
<string name="passcode_changed">Senha alterada!</string>
<string name="you_can_turn_on_lock">Você pode ativar o bloqueio SimpleX via Configurações.</string>
</resources>
@@ -258,7 +258,9 @@
<string name="toast_permission_denied">Разрешение не получено!</string>
<string name="use_camera_button">Камера</string>
<string name="from_gallery_button">Галерея</string>
<string name="choose_file">Файлы</string>
<string name="gallery_image_button">Изображение</string>
<string name="gallery_video_button">Видео</string>
<string name="choose_file">Файл</string>
<!-- help - ChatHelpView.kt -->
<string name="thank_you_for_installing_simplex">Спасибо, что установили <xliff:g id="appNameFull">SimpleX Chat</xliff:g>!</string>
<string name="you_can_connect_to_simplex_chat_founder">Вы можете <font color="#0088ff">соединиться с разработчиками</font>, чтобы задать любые вопросы или получать уведомления о новых версиях.</string>
@@ -561,12 +563,10 @@
<string name="integrity_msg_bad_id">ошибка ID сообщения</string>
<string name="integrity_msg_duplicate">повторное сообщение</string>
<string name="alert_title_skipped_messages">Пропущенные сообщения</string>
<string name="alert_text_skipped_messages_it_can_happen_when">Это может случится, когда:
\n1. Сервер удалил сообщения, если они не были доставлены в течение 30 дней.
\n2. Сервер, через который Вы получаете сообщения от контакта, был обновлён и перезапущен.
\n3. Соединение компроментировано.
\nПожалуйста, соединитесь с девелоперами через Настройки, чтобы получать уведомления о серверах.
\nМы планируем добавить избыточную доставку сообщений, чтобы не терять сообщения.</string>
<string name="alert_text_skipped_messages_it_can_happen_when">Это может произойти, когда:
\n1. Клиент отправителя удалил неотправленные сообщения через 2 дня, или сервер – через 30 дней.
\n2. Расшифровка сообщения была невозможна, когда Вы или Ваш контакт использовали старую копию базы данных.
\n3. Соединение компроментировано.</string>
<!-- Privacy settings -->
<string name="privacy_and_security">Конфиденциальность</string>
<string name="your_privacy">Конфиденциальность</string>
@@ -587,7 +587,7 @@
<string name="settings_section_title_socks">SOCKS ПРОКСИ</string>
<string name="settings_section_title_icon">ИКОНКА</string>
<string name="settings_section_title_themes">ТЕМЫ</string>
<string name="settings_section_title_messages">СООБЩЕНИЯ</string>
<string name="settings_section_title_messages">СООБЩЕНИЯ И ФАЙЛЫ</string>
<string name="settings_section_title_calls">ЗВОНКИ</string>
<string name="settings_section_title_incognito">Режим Инкогнито</string>
<!-- DatabaseView.kt -->
@@ -1104,7 +1104,6 @@
<string name="v4_6_chinese_spanish_interface_descr">Благодаря пользователям – добавьте переводы через Weblate!</string>
<string name="you_will_still_receive_calls_and_ntfs">Вы все равно получите звонки и уведомления в профилях без звука, когда они активные.</string>
<string name="you_can_hide_or_mute_user_profile">Вы можете скрыть профиль или выключить уведомления - подержите, чтобы увидеть меню.</string>
<string name="settings_send_files_via_xftp">Отправлять видео и файлы через XFTP</string>
<string name="image_will_be_received_when_contact_completes_uploading">Изображение будет принято когда Ваш контакт его загрузит.</string>
<string name="file_will_be_received_when_contact_completes_uploading">Файл будет принят когда Ваш контакт загрузит его.</string>
<string name="database_upgrade">Обновление базы данных</string>
@@ -1126,7 +1125,6 @@
<string name="delete_chat_profile">Удалить профиль чата</string>
<string name="delete_profile">Удалить профиль</string>
<string name="profile_password">Пароль профиля</string>
<string name="xftp_requires_v461">v4.6.1+ необходима для приема файлов через XFTP.</string>
<string name="videos_limit_title">Слишком много видео!</string>
<string name="icon_descr_video_asked_to_receive">Запросил прием видео</string>
<string name="video_descr">Видео</string>
@@ -1140,4 +1138,90 @@
<string name="unhide_profile">Раскрыть профиль</string>
<string name="video_will_be_received_when_contact_is_online">Видео будет получено, когда Ваш контакт будет онлайн, пожалуйста, подождите или проверьте позже!</string>
<string name="unhide_chat_profile">Раскрыть профиль чата</string>
<string name="error_loading_smp_servers">Ошибка при загрузке SMP серверов</string>
<string name="error_loading_xftp_servers">Ошибка при загрузке XFTP серверов</string>
<string name="error_saving_xftp_servers">Ошибка при сохранении XFTP серверов</string>
<string name="ensure_xftp_server_address_are_correct_format_and_unique">Проверьте, что адреса XFTP северов в правильном формате и не дублируются.</string>
<string name="error_xftp_test_server_auth">Сервер требует авторизации для загрузки, проверьте пароль.</string>
<string name="smp_server_test_compare_file">Сравнение файла</string>
<string name="smp_server_test_delete_file">Удалить файл</string>
<string name="smp_server_test_download_file">Загрузка файла</string>
<string name="smp_server_test_upload_file">Загрузка файла</string>
<string name="xftp_servers">XFTP серверы</string>
<string name="your_XFTP_servers">Ваши XFTP серверы</string>
<string name="disable_onion_hosts_when_not_supported">Установите <i>Использовать .onion хосты</i> в Нет если SOCKS прокси их не поддерживает.</string>
<string name="la_auth_failed">Ошибка аутентификации</string>
<string name="la_no_app_password">Нет кода доступа</string>
<string name="la_lock_mode_passcode">Ввод кода доступа</string>
<string name="la_lock_mode">Режим Блокировки SimpleX</string>
<string name="la_lock_mode_system">Системная аутентификация</string>
<string name="la_could_not_be_verified">Ошибка аутентификации; попробуйте еще раз.</string>
<string name="la_immediately">Сразу</string>
<string name="la_authenticate">Аутентифицировать</string>
<string name="la_change_app_passcode">Изменить код доступа</string>
<string name="la_current_app_passcode">Текущий Код</string>
<string name="la_enter_app_passcode">Введите Код</string>
<string name="network_socks_proxy_settings">Настройки SOCKS прокси</string>
<string name="network_socks_toggle_use_socks_proxy">Использовать SOCKS прокси</string>
<string name="host_verb">Хост</string>
<string name="port_verb">Порт</string>
<string name="network_proxy_port">порт %d</string>
<string name="enable_lock">Включить блокировку</string>
<string name="authentication_cancelled">Аутентификация отменена</string>
<string name="la_mode_system">Системная</string>
<string name="la_seconds">%d секунд</string>
<string name="alert_text_decryption_error_header"><xliff:g id="message count" example="1">%1$d</xliff:g> сообщений не удалось расшифровать.</string>
<string name="decryption_error">Ошибка расшифровки</string>
<string name="lock_not_enabled">Блокировка SimpleX не включена!</string>
<string name="alert_title_msg_bad_hash">Ошибка хэш сообщения</string>
<string name="alert_text_msg_bad_hash">Хэш предыдущего сообщения отличается.</string>
<string name="confirm_passcode">Подтвердить Код</string>
<string name="incorrect_passcode">Неправильный код</string>
<string name="lock_after">Заблокировать через</string>
<string name="lock_mode">Режим блокировки</string>
<string name="new_passcode">Новый Код</string>
<string name="submit_passcode">Продолжить</string>
<string name="la_mode_passcode">Код доступа</string>
<string name="passcode_changed">Код доступа изменён!</string>
<string name="passcode_not_changed">Код доступа не изменён!</string>
<string name="passcode_set">Код доступа установлен!</string>
<string name="change_lock_mode">Изменить режим блокировки</string>
<string name="stop_rcv_file__message">Приём файла будет прекращён.</string>
<string name="revoke_file__confirm">Отозвать</string>
<string name="revoke_file__title">Отозвать файл\?</string>
<string name="stop_snd_file__message">Отправка файла будет остановлена.</string>
<string name="stop_file__confirm">Остановить</string>
<string name="stop_file__action">Остановить файл</string>
<string name="stop_snd_file__title">Остановить отправку файла\?</string>
<string name="alert_title_msg_bad_id">Ошибка ID сообщения</string>
<string name="alert_text_fragment_encryption_out_of_sync_old_database">Это может произойти, когда Вы или Ваш контакт используете старую копию базы данных.</string>
<string name="alert_text_fragment_please_report_to_developers">Пожалуйста, сообщите об этой ошибке девелоперам.</string>
<string name="alert_text_msg_bad_id">Неправильный ID предыдущего сообщения (меньше или равен предыдущему).
\nЭто может произойти из-за ошибки программы, или когда соединение компроментировано.</string>
<string name="alert_text_fragment_permanent_error_reconnect">Эта ошибка постоянная для этого соединения, пожалуйста, соединитесь снова.</string>
<string name="alert_text_decryption_error_too_many_skipped"><xliff:g id="message count" example="1">%1$d</xliff:g> сообщений пропущено.</string>
<string name="allow_calls_only_if">Разрешить звонки, только если их разрешает Ваш контакт.</string>
<string name="allow_your_contacts_to_call">Разрешить Вашим контактам звонить Вам.</string>
<string name="audio_video_calls">Аудио/видео звонки</string>
<string name="calls_prohibited_with_this_contact">Аудио/видео звонки запрещены.</string>
<string name="available_in_v51">"
\nДоступно в v5.1"</string>
<string name="both_you_and_your_contact_can_make_calls">Вы и Ваш контакт можете совершать звонки.</string>
<string name="only_you_can_make_calls">Только Вы можете совершать звонки.</string>
<string name="only_your_contact_can_make_calls">Только Ваш контакт может совершать звонки.</string>
<string name="prohibit_calls">Запретить аудио/видео звонки.</string>
<string name="no_spaces">Без пробелов!</string>
<string name="v5_0_large_files_support_descr">Быстрые и не нужно ждать, когда отправитель онлайн!</string>
<string name="v5_0_polish_interface">Польский интерфейс</string>
<string name="v5_0_app_passcode_descr">Установите код вместо системной аутентификации.</string>
<string name="v5_0_polish_interface_descr">Благодаря пользователям – добавьте переводы через Weblate!</string>
<string name="v5_0_large_files_support">Видео и файлы до 1гб</string>
<string name="v5_0_app_passcode">Код доступа в приложение</string>
<string name="revoke_file__message">Файл будет удалён с серверов.</string>
<string name="smp_server_test_create_file">Создание файла</string>
<string name="la_minutes">%d минут(ы)</string>
<string name="la_please_remember_to_store_password">Пожалуйста, запомните или сохраните его - восстановить потерянный код доступа невозможно!</string>
<string name="revoke_file__action">Отозвать файл</string>
<string name="stop_rcv_file__title">Остановить приём файла\?</string>
<string name="you_can_turn_on_lock">Вы можете включить Блокировку SimpleX через Настройки.</string>
</resources>
@@ -103,7 +103,7 @@
<string name="app_version_name">应用程序版本:v%s</string>
<string name="notifications_mode_off_desc">仅在运行时应用程序可以接受通知,不会启动后台服务</string>
<string name="incognito_random_profile_description">一个随机资料将发送给您的联系人</string>
<string name="auth_unavailable">身份证不可用</string>
<string name="auth_unavailable">身份证不可用</string>
<string name="auto_accept_images">自动接受图像</string>
<string name="attach">附件</string>
<string name="icon_descr_audio_call">语音通话</string>
@@ -238,7 +238,7 @@
<string name="callstate_connected">已连接</string>
<string name="connect_button">连接</string>
<string name="connect_via_link_verb">连接</string>
<string name="choose_file">选择文件</string>
<string name="choose_file">文件</string>
<string name="network_session_mode_user">聊天资料</string>
<string name="v4_5_transport_isolation_descr">按聊天资料(默认)或按连接(BETA)。</string>
<string name="smp_servers_check_address">检查服务器地址并再试一次。</string>
@@ -429,12 +429,14 @@
<string name="network_disable_socks_info">如果您确认,消息服务器将能够看到您的 IP 地址和您的提供商——以及您正在连接的服务器。</string>
<string name="image_descr">图片</string>
<string name="icon_descr_image_snd_complete">图片已发送</string>
<string name="auth_device_authentication_is_disabled_turning_off">设备证被禁用。关闭 SimpleX 锁定。</string>
<string name="auth_device_authentication_is_not_enabled_you_can_turn_on_in_settings_once_enabled">没有启用设备证。一旦启用设备证,您可以通过设置打开 SimpleX 锁定。</string>
<string name="auth_device_authentication_is_disabled_turning_off">设备证被禁用。关闭 SimpleX 锁定。</string>
<string name="auth_device_authentication_is_not_enabled_you_can_turn_on_in_settings_once_enabled">没有启用设备证。一旦启用设备证,您可以通过设置打开 SimpleX 锁定。</string>
<string name="auth_disable_simplex_lock">禁用 SimpleX 锁定</string>
<string name="maximum_supported_file_size">目前支持的最大文件尺寸是 <xliff:g id="maxFileSize">%1$s</xliff:g></string>
<string name="file_will_be_received_when_contact_is_online">文件将在您的联系人在线时收到,请稍等或稍后再查看!</string>
<string name="from_gallery_button">从图库</string>
<string name="gallery_image_button">照片</string>
<string name="gallery_video_button">视频</string>
<string name="exit_without_saving">退出而不保存</string>
<string name="icon_descr_flip_camera">翻转相机</string>
<string name="enable_automatic_deletion_question">启用自动删除消息?</string>
@@ -451,12 +453,10 @@
<string name="image_descr_link_preview">链接预览图片</string>
<string name="invalid_QR_code">无效的二维码</string>
<string name="onboarding_notifications_mode_subtitle">以后可以通过设置进行更改。</string>
<string name="alert_text_skipped_messages_it_can_happen_when">它可在以下情况发生:
\n1. 如果消息在30天内没有被收到,就会在服务器上过期。
\n2. 您用于接收来自此联系人的消息的服务器已更新并重新启动
\n3. 连接受损。
\n请通过设置与开发者联系,以接收有关服务器的更新。
\n我们将添加服务器冗余以防止丢失消息。</string>
<string name="alert_text_skipped_messages_it_can_happen_when">它可在以下情况发生:
\n1. 消息在发送客户端 2 天后或在服务器上 30 天后过期。
\n2. 消息解密失败,因为您或您的联系人使用了旧的数据库备份
\n3.连接被破坏。</string>
<string name="leave_group_question">离开群组?</string>
<string name="rcv_group_event_invited_via_your_group_link">通过您的群组链接邀请</string>
<string name="info_row_local_name">本地名称</string>
@@ -857,7 +857,7 @@
<string name="toast_permission_denied">权限被拒绝!</string>
<string name="chat_help_tap_button">点击按钮</string>
<string name="thank_you_for_installing_simplex">感谢您安装 <xliff:g id="appNameFull">SimpleX Chat</xliff:g></string>
<string name="use_camera_button">使用相机</string>
<string name="use_camera_button">相机</string>
<string name="smp_servers_preset_address">预设服务器地址</string>
<string name="smp_servers_scan_qr">扫描服务器二维码</string>
<string name="smp_servers_test_failed">服务器测试失败!</string>
@@ -1021,7 +1021,6 @@
<string name="you_will_still_receive_calls_and_ntfs">当静音配置文件处于活动状态时,您仍会收到来自静音配置文件的电话和通知。</string>
<string name="you_can_hide_or_mute_user_profile">您可以隐藏或静音用户配置文件——长按以显示菜单。</string>
<string name="group_welcome_title">欢迎信息</string>
<string name="settings_send_files_via_xftp">通过 XFTP 发送视频和文件</string>
<string name="confirm_database_upgrades">确认数据库升级</string>
<string name="settings_section_title_experimenta">实验性</string>
<string name="database_upgrade">数据库升级</string>
@@ -1036,7 +1035,6 @@
<string name="database_migrations">迁移:%s</string>
<string name="image_will_be_received_when_contact_completes_uploading">图片将在您的联系人完成上传后收到。</string>
<string name="show_developer_options">显示开发者选项</string>
<string name="xftp_requires_v461">通过 XFTP 接收需要 v4.6.1 以上版本。</string>
<string name="upgrade_and_open_chat">升级并打开聊天</string>
<string name="database_downgrade_warning">警告:您可能会丢失部分数据!</string>
<string name="invalid_migration_confirmation">迁移确认无效</string>
@@ -1075,4 +1073,48 @@
<string name="error_saving_xftp_servers">保存 SMP 服务器时出错</string>
<string name="network_proxy_port">端口 %d</string>
<string name="network_socks_proxy_settings">SOCKS 代理设置</string>
<string name="la_lock_mode">SimpleX 锁定模式</string>
<string name="la_lock_mode_system">系统验证</string>
<string name="la_minutes">%d 分钟</string>
<string name="la_seconds">%d 秒</string>
<string name="la_enter_app_passcode">输入密码</string>
<string name="la_no_app_password">没有应用程序密码</string>
<string name="la_lock_mode_passcode">密码输入</string>
<string name="la_please_remember_to_store_password">请牢记或妥善保管——丢失的密码将无法恢复!</string>
<string name="you_can_turn_on_lock">您可以通过设置开启 SimpleX 锁定。</string>
<string name="la_authenticate">身份验证</string>
<string name="la_auth_failed">身份验证失败</string>
<string name="la_change_app_passcode">更改密码</string>
<string name="submit_passcode">提交</string>
<string name="confirm_passcode">确认密码</string>
<string name="enable_lock">启用锁定</string>
<string name="incorrect_passcode">密码错误</string>
<string name="lock_after">在此后锁定</string>
<string name="lock_mode">锁定模式</string>
<string name="new_passcode">新密码</string>
<string name="change_lock_mode">更改锁定模式</string>
<string name="la_mode_passcode">密码</string>
<string name="passcode_changed">密码已更改!</string>
<string name="passcode_not_changed">密码未更改!</string>
<string name="passcode_set">密码已设置!</string>
<string name="la_mode_system">系统</string>
<string name="lock_not_enabled">未启用 SimpleX 锁定!</string>
<string name="la_could_not_be_verified">您的身份无法验证,请再试一次。</string>
<string name="authentication_cancelled">身份验证已取消</string>
<string name="la_current_app_passcode">当前密码</string>
<string name="la_immediately">立即</string>
<string name="alert_title_msg_bad_hash">错误消息散列</string>
<string name="alert_title_msg_bad_id">错误消息 ID</string>
<string name="alert_text_decryption_error_header"><xliff:g id="message count" example="1">%1$d</xliff:g> 消息解密失败。</string>
<string name="alert_text_decryption_error_too_many_skipped"><xliff:g id="message count" example="1">%1$d</xliff:g> 已跳过消息。</string>
<string name="alert_text_fragment_permanent_error_reconnect">此错误对于此连接是永久性的,请重新连接。</string>
<string name="alert_text_fragment_encryption_out_of_sync_old_database">当您或您的连接使用旧数据库备份时,可能会发生这种情况。</string>
<string name="decryption_error">解密错误</string>
<string name="decryption_error_permanent">永久解密错误</string>
<string name="alert_text_fragment_please_report_to_developers">请向开发者报告。</string>
<string name="alert_text_msg_bad_hash">上一条消息的散列不同。</string>
<string name="alert_text_msg_bad_id">下一条消息的 ID 不正确(小于或等于上一条)。
\n它可能是由于某些错误或连接被破坏才发生。</string>
<string name="alert_text_decryption_error_earlier"><xliff:g id="message count" example="1">%1$d</xliff:g> 消息解密失败并且不会显示。</string>
<string name="no_spaces">没有空格!</string>
</resources>
@@ -52,7 +52,7 @@
<string name="add_new_contact_to_create_one_time_QR_code"><b>新增新的聯絡人</b>:新增新的聯絡人可以使用二維碼建立你的一次性二維碼。</string>
<string name="scan_QR_code_to_connect_to_contact_who_shows_QR_code"><b>掃描二維碼</b>:連接到向你出示二維碼的聯絡人。</string>
<string name="choose_file">選擇檔案</string>
<string name="use_camera_button">使用相機</string>
<string name="use_camera_button">相機</string>
<string name="from_gallery_button">從圖片庫選擇圖片</string>
<string name="accept_contact_incognito_button">接受匿名聊天模式</string>
<string name="clear_chat_warning">所有訊息記錄會刪除 - 這不能還原!這些訊息只會在你裝置中刪除。</string>
@@ -1025,7 +1025,6 @@
<string name="user_unmute">取消靜音</string>
<string name="you_will_still_receive_calls_and_ntfs">當靜音配置檔案處於活動狀態時,你仍會收到來自靜音配置檔案的通話和通知。</string>
<string name="user_unhide">取消隱藏</string>
<string name="settings_send_files_via_xftp">通過 XFTP 傳送影片和檔案</string>
<string name="video_will_be_received_when_contact_is_online">影片將會在你的聯絡人在線時接收,請你等等或者稍後再檢查!</string>
<string name="confirm_database_upgrades">確認數據庫更新</string>
<string name="incompatible_database_version">數據庫版本不相容</string>
@@ -1039,7 +1038,6 @@
<string name="image_will_be_received_when_contact_completes_uploading">圖片將會在你的聯絡人完成上傳後接收。</string>
<string name="file_will_be_received_when_contact_completes_uploading">檔案將會在你的聯絡人完成上傳後接收。</string>
<string name="settings_section_title_experimenta">實驗性</string>
<string name="xftp_requires_v461">通過 XFTP 去接收需要 v4.6.1 以上的版本。</string>
<string name="upgrade_and_open_chat">升級和開始對話</string>
<string name="cancel_file__question">取消傳輸檔案?</string>
<string name="file_transfer_will_be_cancelled_warning">檔案傳遞將會取消。若是在傳遞檔案中,亦會暫停。</string>
@@ -32,6 +32,7 @@
<string name="moderated_description">moderated</string>
<string name="invalid_chat">invalid chat</string>
<string name="invalid_data">invalid data</string>
<string name="decryption_error">Decryption error</string>
<!-- PendingContactConnection - ChatModel.kt -->
<string name="connection_local_display_name">connection <xliff:g id="connection ID" example="1">%1$d</xliff:g></string>
@@ -217,10 +218,18 @@
<string name="delete_member_message__question">Delete member message?</string>
<string name="moderate_message_will_be_deleted_warning">The message will be deleted for all members.</string>
<string name="moderate_message_will_be_marked_warning">The message will be marked as moderated for all members.</string>
<string name="cancel_file__question">Cancel file transfer?</string>
<string name="file_transfer_will_be_cancelled_warning">File transfer will be cancelled. If it\'s in progress it will be stoppped.</string>
<string name="for_me_only">Delete for me</string>
<string name="for_everybody">For everyone</string>
<string name="stop_file__action">Stop file</string>
<string name="stop_snd_file__title">Stop sending file?</string>
<string name="stop_snd_file__message">Sending file will be stopped.</string>
<string name="stop_rcv_file__title">Stop receiving file?</string>
<string name="stop_rcv_file__message">Receiving file will be stopped.</string>
<string name="stop_file__confirm">Stop</string>
<string name="revoke_file__action">Revoke file</string>
<string name="revoke_file__title">Revoke file?</string>
<string name="revoke_file__message">File will be deleted from servers.</string>
<string name="revoke_file__confirm">Revoke</string>
<!-- CIMetaView.kt -->
<string name="icon_descr_edited">edited</string>
@@ -351,9 +360,11 @@
<!-- GetImageView -->
<string name="toast_permission_denied">Permission Denied!</string>
<string name="use_camera_button">Use Camera</string>
<string name="use_camera_button">Camera</string>
<string name="from_gallery_button">From Gallery</string>
<string name="choose_file">Choose file</string>
<string name="choose_file">File</string>
<string name="gallery_image_button">Image</string>
<string name="gallery_video_button">Video</string>
<!-- help - ChatHelpView.kt -->
<string name="thank_you_for_installing_simplex">Thank you for installing <xliff:g id="appNameFull">SimpleX Chat</xliff:g>!</string>
@@ -606,6 +617,7 @@
<string name="create_profile">Create profile</string>
<string name="your_profile_is_stored_on_your_device">Your profile, contacts and delivered messages are stored on your device.</string>
<string name="profile_is_only_shared_with_your_contacts">The profile is only shared with your contacts.</string>
<string name="no_spaces">No spaces!</string>
<string name="display_name_cannot_contain_whitespace">Display name cannot contain whitespace.</string>
<string name="display_name">Display Name</string>
<string name="full_name_optional__prompt">Full Name (optional)</string>
@@ -741,7 +753,16 @@
<string name="integrity_msg_bad_id">bad message ID</string>
<string name="integrity_msg_duplicate">duplicate message</string>
<string name="alert_title_skipped_messages">Skipped messages</string>
<string name="alert_text_skipped_messages_it_can_happen_when">It can happen when:\n1. The messages expire on the server if they were not received for 30 days,\n2. The server you use to receive the messages from this contact was updated and restarted.\n3. The connection is compromised.\nPlease connect to the developers via Settings to receive the updates about the servers.\nWe will be adding server redundancy to prevent lost messages.</string>
<string name="alert_text_skipped_messages_it_can_happen_when">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.</string>
<string name="alert_title_msg_bad_hash">Bad message hash</string>
<string name="alert_text_msg_bad_hash">The hash of the previous message is different."</string>
<string name="alert_title_msg_bad_id">Bad message ID</string>
<string name="alert_text_msg_bad_id">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.</string>
<string name="alert_text_decryption_error_header"><xliff:g id="message count" example="1">%1$d</xliff:g> messages failed to decrypt.</string>
<string name="alert_text_decryption_error_too_many_skipped"><xliff:g id="message count" example="1">%1$d</xliff:g> messages skipped.</string>
<string name="alert_text_fragment_encryption_out_of_sync_old_database">It can happen when you or your connection used the old database backup.</string>
<string name="alert_text_fragment_permanent_error_reconnect">This error is permanent for this connection, please re-connect.</string>
<string name="alert_text_fragment_please_report_to_developers">Please report it to the developers.</string>
<!-- Privacy settings -->
<string name="privacy_and_security">Privacy &amp; security</string>
@@ -783,8 +804,6 @@
<string name="settings_section_title_calls">CALLS</string>
<string name="settings_section_title_incognito">Incognito mode</string>
<string name="settings_section_title_experimenta">EXPERIMENTAL</string>
<string name="settings_send_files_via_xftp">Send videos and files via XFTP</string>
<string name="xftp_requires_v461">v4.6.1+ is required to receive via XFTP.</string>
<!-- DatabaseView.kt -->
<string name="your_chat_database">Your chat database</string>
@@ -1165,6 +1184,8 @@
<string name="direct_messages">Direct messages</string>
<string name="full_deletion">Delete for everyone</string>
<string name="voice_messages">Voice messages</string>
<string name="audio_video_calls">Audio/video calls</string>
<string name="available_in_v51">\nAvailable in v5.1</string>
<string name="feature_enabled">enabled</string>
<string name="feature_enabled_for_you">enabled for you</string>
<string name="feature_enabled_for_contact">enabled for contact</string>
@@ -1181,6 +1202,9 @@
<string name="allow_your_contacts_to_send_voice_messages">Allow your contacts to send voice messages.</string>
<string name="allow_voice_messages_only_if">Allow voice messages only if your contact allows them.</string>
<string name="prohibit_sending_voice_messages">Prohibit sending voice messages.</string>
<string name="allow_your_contacts_to_call">Allow your contacts to call you.</string>
<string name="allow_calls_only_if">Allow calls only if your contact allows them.</string>
<string name="prohibit_calls">Prohibit audio/video calls.</string>
<string name="both_you_and_your_contact_can_send_disappearing">Both you and your contact can send disappearing messages.</string>
<string name="only_you_can_send_disappearing">Only you can send disappearing messages.</string>
<string name="only_your_contact_can_send_disappearing">Only your contact can send disappearing messages.</string>
@@ -1193,6 +1217,10 @@
<string name="only_you_can_send_voice">Only you can send voice messages.</string>
<string name="only_your_contact_can_send_voice">Only your contact can send voice messages.</string>
<string name="voice_prohibited_in_this_chat">Voice messages are prohibited in this chat.</string>
<string name="both_you_and_your_contact_can_make_calls">Both you and your contact can make calls.</string>
<string name="only_you_can_make_calls">Only you can make calls.</string>
<string name="only_your_contact_can_make_calls">Only your contact can make calls.</string>
<string name="calls_prohibited_with_this_contact">Audio/video calls are prohibited.</string>
<string name="allow_to_send_disappearing">Allow to send disappearing messages.</string>
<string name="prohibit_sending_disappearing">Prohibit sending disappearing messages.</string>
<string name="allow_direct_messages">Allow sending direct messages to members.</string>
@@ -1279,4 +1307,10 @@
<string name="v4_6_reduced_battery_usage_descr">More improvements are coming soon!</string>
<string name="v4_6_chinese_spanish_interface">Chinese and Spanish interface</string>
<string name="v4_6_chinese_spanish_interface_descr">Thanks to the users contribute via Weblate!</string>
<string name="v5_0_large_files_support">Videos and files up to 1gb</string>
<string name="v5_0_large_files_support_descr">Fast and no wait until the sender is online!</string>
<string name="v5_0_app_passcode">App passcode</string>
<string name="v5_0_app_passcode_descr">Set it instead of system authentication.</string>
<string name="v5_0_polish_interface">Polish interface</string>
<string name="v5_0_polish_interface_descr">Thanks to the users contribute via Weblate!</string>
</resources>
+7 -1
View File
@@ -187,7 +187,7 @@ func apiDeleteUser(_ userId: Int64, _ delSMPQueues: Bool, viewPwd: String?) asyn
}
func apiStartChat() throws -> Bool {
let r = chatSendCmdSync(.startChat(subscribe: true, expire: true))
let r = chatSendCmdSync(.startChat(subscribe: true, expire: true, xftp: true))
switch r {
case .chatStarted: return true
case .chatRunning: return false
@@ -1333,6 +1333,9 @@ func processReceivedMsg(_ res: ChatResponse) async {
cleanupFile(aChatItem)
case let .rcvFileProgressXFTP(user, aChatItem, _, _):
chatItemSimpleUpdate(user, aChatItem)
case let .rcvFileError(user, aChatItem):
chatItemSimpleUpdate(user, aChatItem)
cleanupFile(aChatItem)
case let .sndFileStart(user, aChatItem, _):
chatItemSimpleUpdate(user, aChatItem)
case let .sndFileComplete(user, aChatItem, _):
@@ -1346,6 +1349,9 @@ func processReceivedMsg(_ res: ChatResponse) async {
case let .sndFileCompleteXFTP(user, aChatItem, _):
chatItemSimpleUpdate(user, aChatItem)
cleanupFile(aChatItem)
case let .sndFileError(user, aChatItem):
chatItemSimpleUpdate(user, aChatItem)
cleanupFile(aChatItem)
case let .callInvitation(invitation):
m.callInvitations[invitation.contact.id] = invitation
activateCall(invitation)
@@ -55,11 +55,13 @@ struct CIFileView: View {
case .sndTransfer: return false
case .sndComplete: return false
case .sndCancelled: return false
case .sndError: return false
case .rcvInvitation: return true
case .rcvAccepted: return true
case .rcvTransfer: return false
case .rcvComplete: return true
case .rcvCancelled: return false
case .rcvError: return false
}
}
return false
@@ -130,6 +132,7 @@ struct CIFileView: View {
}
case .sndComplete: fileIcon("doc.fill", innerIcon: "checkmark", innerIconSize: 10)
case .sndCancelled: fileIcon("doc.fill", innerIcon: "xmark", innerIconSize: 10)
case .sndError: fileIcon("doc.fill", innerIcon: "xmark", innerIconSize: 10)
case .rcvInvitation:
if fileSizeValid() {
fileIcon("arrow.down.doc.fill", color: .accentColor)
@@ -145,6 +148,7 @@ struct CIFileView: View {
}
case .rcvComplete: fileIcon("doc.fill")
case .rcvCancelled: fileIcon("doc.fill", innerIcon: "xmark", innerIconSize: 10)
case .rcvError: fileIcon("doc.fill", innerIcon: "xmark", innerIconSize: 10)
}
} else {
fileIcon("doc.fill")
@@ -93,10 +93,12 @@ struct CIImageView: View {
case .sndTransfer: progressView()
case .sndComplete: fileIcon("checkmark", 10, 13)
case .sndCancelled: fileIcon("xmark", 10, 13)
case .sndError: fileIcon("xmark", 10, 13)
case .rcvInvitation: fileIcon("arrow.down", 10, 13)
case .rcvAccepted: fileIcon("ellipsis", 14, 11)
case .rcvTransfer: progressView()
case .rcvCancelled: fileIcon("xmark", 10, 13)
case .rcvError: fileIcon("xmark", 10, 13)
default: EmptyView()
}
}
@@ -0,0 +1,40 @@
//
// CIRcvDecryptionError.swift
// SimpleX (iOS)
//
// Created by Evgeny on 15/04/2023.
// Copyright © 2023 SimpleX Chat. All rights reserved.
//
import SwiftUI
import SimpleXChat
let decryptErrorReason: LocalizedStringKey = "It can happen when you or your connection used the old database backup."
struct CIRcvDecryptionError: View {
var msgDecryptError: MsgDecryptError
var msgCount: UInt32
var chatItem: ChatItem
var showMember = false
var body: some View {
CIMsgError(chatItem: chatItem, showMember: showMember) {
var message: Text
let why = Text(decryptErrorReason)
let permanent = Text("This error is permanent for this connection, please re-connect.")
switch msgDecryptError {
case .ratchetHeader:
message = Text("\(msgCount) messages failed to decrypt.") + Text("\n") + why + Text("\n") + permanent
case .tooManySkipped:
message = Text("\(msgCount) messages skipped.") + Text("\n") + why + Text("\n") + permanent
}
AlertManager.shared.showAlert(Alert(title: Text("Decryption error"), message: message))
}
}
}
//struct CIRcvDecryptionError_Previews: PreviewProvider {
// static var previews: some View {
// CIRcvDecryptionError(msgDecryptError: .ratchetHeader, msgCount: 1, chatItem: ChatItem.getIntegrityErrorSample())
// }
//}
@@ -199,38 +199,33 @@ struct CIVideoView: View {
case .xftp: progressCircle(sndProgress, sndTotal)
case .smp: progressView()
}
case .sndComplete:
Image(systemName: "checkmark")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 10, height: 10)
.foregroundColor(.white)
.padding(13)
case .rcvInvitation:
Image(systemName: "arrow.down")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 14, height: 14)
.foregroundColor(.white)
.padding(11)
case .rcvAccepted:
Image(systemName: "ellipsis")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 14, height: 14)
.foregroundColor(.white)
.padding(11)
case .sndComplete: fileIcon("checkmark", 10, 13)
case .sndCancelled: fileIcon("xmark", 10, 13)
case .sndError: fileIcon("xmark", 10, 13)
case .rcvInvitation: fileIcon("arrow.down", 10, 13)
case .rcvAccepted: fileIcon("ellipsis", 14, 11)
case let .rcvTransfer(rcvProgress, rcvTotal):
if file.fileProtocol == .xftp && rcvProgress < rcvTotal {
progressCircle(rcvProgress, rcvTotal)
} else {
progressView()
}
case .rcvCancelled: fileIcon("xmark", 10, 13)
case .rcvError: fileIcon("xmark", 10, 13)
default: EmptyView()
}
}
}
private func fileIcon(_ icon: String, _ size: CGFloat, _ padding: CGFloat) -> some View {
Image(systemName: icon)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: size, height: size)
.foregroundColor(.white)
.padding(padding)
}
private func progressView() -> some View {
ProgressView()
.progressViewStyle(.circular)
@@ -108,11 +108,13 @@ struct VoiceMessagePlayer: View {
case .sndTransfer: playbackButton()
case .sndComplete: playbackButton()
case .sndCancelled: playbackButton()
case .sndError: playbackButton()
case .rcvInvitation: loadingIcon()
case .rcvAccepted: loadingIcon()
case .rcvTransfer: loadingIcon()
case .rcvComplete: playbackButton()
case .rcvCancelled: playPauseIcon("play.fill", Color(uiColor: .tertiaryLabel))
case .rcvError: playPauseIcon("play.fill", Color(uiColor: .tertiaryLabel))
}
} else {
playPauseIcon("play.fill", Color(uiColor: .tertiaryLabel))
@@ -10,9 +10,53 @@ import SwiftUI
import SimpleXChat
struct IntegrityErrorItemView: View {
var msgError: MsgErrorType
var chatItem: ChatItem
var showMember = false
var body: some View {
CIMsgError(chatItem: chatItem, showMember: showMember) {
switch msgError {
case .msgSkipped:
AlertManager.shared.showAlertMsg(
title: "Skipped messages",
message: """
It can happen when:
1. The messages expired in the sending client after 2 days or on the server after 30 days.
2. Message decryption failed, because you or your contact used old database backup.
3. The connection was compromised.
"""
)
case .msgBadHash:
AlertManager.shared.showAlert(Alert(
title: Text("Bad message hash"),
message: Text("The hash of the previous message is different.") + Text("\n") +
Text(decryptErrorReason) + Text("\n") +
Text("Please report it to the developers.")
))
case .msgBadId: msgBadIdAlert()
case .msgDuplicate: msgBadIdAlert()
}
}
}
private func msgBadIdAlert() {
AlertManager.shared.showAlert(Alert(
title: Text("Bad message ID"),
message: Text("""
The ID of the next message is incorrect (less or equal to the previous).
It can happen because of some bug or when the connection is compromised.
""") + Text("\n") +
Text("Please report it to the developers.")
))
}
}
struct CIMsgError: View {
var chatItem: ChatItem
var showMember = false
var onTap: () -> Void
var body: some View {
HStack(alignment: .bottom, spacing: 0) {
if showMember, let member = chatItem.memberDisplayName {
@@ -29,26 +73,12 @@ struct IntegrityErrorItemView: View {
.background(Color(uiColor: .tertiarySystemGroupedBackground))
.cornerRadius(18)
.textSelection(.disabled)
.onTapGesture { skippedMessagesAlert() }
}
private func skippedMessagesAlert() {
AlertManager.shared.showAlertMsg(
title: "Skipped messages",
message: """
It can happen when:
1. The messages expire on the server if they were not received for 30 days,
2. The server you use to receive the messages from this contact was updated and restarted.
3. The connection is compromised.
Please connect to the developers via Settings to receive the updates about the servers.
We will be adding server redundancy to prevent lost messages.
"""
)
.onTapGesture(perform: onTap)
}
}
struct IntegrityErrorItemView_Previews: PreviewProvider {
static var previews: some View {
IntegrityErrorItemView(chatItem: ChatItem.getIntegrityErrorSample())
IntegrityErrorItemView(msgError: .msgBadHash, chatItem: ChatItem.getIntegrityErrorSample())
}
}
+13 -1
View File
@@ -55,7 +55,8 @@ struct ChatItemContentView<Content: View>: View {
case .rcvDeleted: deletedItemView()
case let .sndCall(status, duration): callItemView(status, duration)
case let .rcvCall(status, duration): callItemView(status, duration)
case .rcvIntegrityError: IntegrityErrorItemView(chatItem: chatItem, showMember: showMember)
case let .rcvIntegrityError(msgError): IntegrityErrorItemView(msgError: msgError, chatItem: chatItem, showMember: showMember)
case let .rcvDecryptionError(msgDecryptError, msgCount): CIRcvDecryptionError(msgDecryptError: msgDecryptError, msgCount: msgCount, chatItem: chatItem, showMember: showMember)
case let .rcvGroupInvitation(groupInvitation, memberRole): groupInvitationItemView(groupInvitation, memberRole)
case let .sndGroupInvitation(groupInvitation, memberRole): groupInvitationItemView(groupInvitation, memberRole)
case .rcvGroupEvent: eventItemView()
@@ -132,6 +133,17 @@ struct ChatItemView_NonMsgContentDeleted_Previews: PreviewProvider {
),
revealed: Binding.constant(true)
)
ChatItemView(
chatInfo: ChatInfo.sampleData.direct,
chatItem: ChatItem(
chatDir: .directRcv,
meta: CIMeta.getSample(1, .now, "1 skipped message", .rcvRead),
content: .rcvDecryptionError(msgDecryptError: .ratchetHeader, msgCount: 2),
quotedItem: nil,
file: nil
),
revealed: Binding.constant(true)
)
ChatItemView(
chatInfo: ChatInfo.sampleData.direct,
chatItem: ChatItem(
+19 -14
View File
@@ -140,12 +140,16 @@ struct ChatView: View {
switch cInfo {
case let .direct(contact):
HStack {
callButton(contact, .audio, imageName: "phone")
if contact.allowsFeature(.calls) {
callButton(contact, .audio, imageName: "phone")
}
Menu {
Button {
CallController.shared.startCall(contact, .video)
} label: {
Label("Video call", systemImage: "video")
if contact.allowsFeature(.calls) {
Button {
CallController.shared.startCall(contact, .video)
} label: {
Label("Video call", systemImage: "video")
}
}
searchButton()
toggleNtfsButton(chat)
@@ -492,8 +496,8 @@ struct ChatView: View {
}
if ci.meta.itemDeleted == nil,
let file = ci.file,
file.cancellable {
menu.append(cancelFileUIAction(file.fileId, sent: ci.chatDir.sent))
let cancelAction = file.cancelAction {
menu.append(cancelFileUIAction(file.fileId, cancelAction))
}
if !live || !ci.meta.isLive {
menu.append(deleteUIAction())
@@ -585,15 +589,16 @@ struct ChatView: View {
}
}
private func cancelFileUIAction(_ fileId: Int64, sent: Bool) -> UIAction {
UIAction(
title: NSLocalizedString("Stop file", comment: "chat item action"),
image: UIImage(systemName: "xmark")
private func cancelFileUIAction(_ fileId: Int64, _ cancelAction: CancelAction) -> UIAction {
return UIAction(
title: cancelAction.uiAction,
image: UIImage(systemName: "xmark"),
attributes: [.destructive]
) { _ in
AlertManager.shared.showAlert(Alert(
title: Text(sent ? "Stop sending file?" : "Stop receiving file?"),
message: Text(sent ? "Sending file will be stopped." : "Receiving file will be stopped."),
primaryButton: .destructive(Text("Stop")) {
title: Text(cancelAction.alert.title),
message: Text(cancelAction.alert.message),
primaryButton: .destructive(Text(cancelAction.alert.confirm)) {
Task {
if let user = ChatModel.shared.currentUser {
await cancelFile(user: user, fileId: fileId)
@@ -241,8 +241,6 @@ struct ComposeView: View {
@State var pendingLinkUrl: URL? = nil
@State var cancelledLinks: Set<String> = []
@AppStorage(GROUP_DEFAULT_XFTP_SEND_ENABLED, store: groupDefaults) private var xftpSendEnabled = false
@State private var showChooseSource = false
@State private var showMediaPicker = false
@State private var showTakePhoto = false
@@ -462,8 +460,7 @@ struct ComposeView: View {
}
private var maxFileSize: Int64 {
let fileProtocol: FileProtocol = xftpSendEnabled ? .xftp : .smp
return getMaxFileSize(fileProtocol)
getMaxFileSize(.xftp)
}
private func sendLiveMessage() async {
@@ -25,6 +25,7 @@ struct ContactPreferencesView: View {
timedMessagesFeatureSection()
featureSection(.fullDelete, user.fullPreferences.fullDelete.allow, contact.mergedPreferences.fullDelete, $featuresAllowed.fullDelete)
featureSection(.voice, user.fullPreferences.voice.allow, contact.mergedPreferences.voice, $featuresAllowed.voice)
featureSection(.calls, user.fullPreferences.calls.allow, contact.mergedPreferences.calls, $featuresAllowed.calls).disabled(true)
Section {
Button("Reset") { featuresAllowed = currentFeaturesAllowed }
@@ -106,7 +107,7 @@ struct ContactPreferencesView: View {
}
private func featureFooter(_ feature: ChatFeature, _ enabled: FeatureEnabled) -> some View {
Text(feature.enabledDescription(enabled))
(Text(feature.enabledDescription(enabled)) + (feature == .calls ? Text("\nAvailable in v5.1").bold() : Text("")))
.frame(height: 36, alignment: .topLeading)
}
@@ -71,7 +71,7 @@ struct ChatListView: View {
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Button {
if chatModel.users.filter { u in u.user.activeUser || !u.user.hidden }.count > 1 {
if chatModel.users.filter({ u in u.user.activeUser || !u.user.hidden }).count > 1 {
withAnimation {
userPickerVisible.toggle()
}
@@ -28,7 +28,6 @@ struct LibraryImagePicker: View {
struct LibraryMediaListPicker: UIViewControllerRepresentable {
typealias UIViewControllerType = PHPickerViewController
@AppStorage(GROUP_DEFAULT_XFTP_SEND_ENABLED, store: groupDefaults) var xftpSendEnabled = false
@Binding var media: [UploadContent]
var selectionLimit: Int
var didFinishPicking: (_ didSelectItems: Bool) -> Void
@@ -131,12 +130,7 @@ struct LibraryMediaListPicker: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> PHPickerViewController {
var config = PHPickerConfiguration()
let allowVideoAttachment = xftpSendEnabled
if allowVideoAttachment {
config.filter = .any(of: [.images, .videos])
} else {
config.filter = .images
}
config.filter = .any(of: [.images, .videos])
config.selectionLimit = selectionLimit
config.selection = .ordered
//config.preferredAssetRepresentationMode = .current
@@ -164,6 +164,26 @@ private let versionDescriptions: [VersionDescription] = [
description: "Thanks to the users [contribute via Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#translate-the-apps)!"
),
]
),
VersionDescription(
version: "v5.0",
features: [
FeatureDescription(
icon: "arrow.up.doc",
title: "Videos and files up to 1gb",
description: "Fast and no wait until the sender is online!"
),
FeatureDescription(
icon: "lock",
title: "App passcode",
description: "Set it instead of system authentication."
),
FeatureDescription(
icon: "character",
title: "Polish interface",
description: "Thanks to the users [contribute via Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#translate-the-apps)!"
),
]
)
]
@@ -197,6 +217,7 @@ struct WhatsNewView: View {
.padding(.vertical)
ForEach(v.features, id: \.icon) { f in
featureDescription(f.icon, f.title, f.description)
.padding(.bottom, 8)
}
if !viaSettings {
Spacer()
@@ -223,7 +244,7 @@ struct WhatsNewView: View {
}
private func featureDescription(_ icon: String, _ title: LocalizedStringKey, _ description: LocalizedStringKey) -> some View {
VStack(alignment: .leading) {
VStack(alignment: .leading, spacing: 4) {
HStack(alignment: .center, spacing: 4) {
Image(systemName: icon).foregroundColor(.secondary)
.frame(minWidth: 30, alignment: .center)
@@ -12,7 +12,6 @@ import SimpleXChat
struct DeveloperView: View {
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
@AppStorage(GROUP_DEFAULT_CONFIRM_DB_UPGRADES, store: groupDefaults) private var confirmDatabaseUpgrades = false
@AppStorage(GROUP_DEFAULT_XFTP_SEND_ENABLED, store: groupDefaults) private var xftpSendEnabled = false
@Environment(\.colorScheme) var colorScheme
var body: some View {
@@ -44,24 +43,24 @@ struct DeveloperView: View {
(developerTools ? Text("Show:") : Text("Hide:")) + Text(" ") + Text("Database IDs and Transport isolation option.")
}
Section {
settingsRow("arrow.up.doc") {
Toggle("Send videos and files via XFTP", isOn: $xftpSendEnabled)
.onChange(of: xftpSendEnabled) { _ in
do {
try setXFTPConfig(getXFTPCfg())
} catch {
logger.error("setXFTPConfig: cannot set XFTP config \(responseError(error))")
}
}
}
} header: {
Text("Experimental")
} footer: {
if xftpSendEnabled {
Text("v4.6.1+ is required to receive via XFTP.")
}
}
// Section {
// settingsRow("arrow.up.doc") {
// Toggle("Send videos and files via XFTP", isOn: $xftpSendEnabled)
// .onChange(of: xftpSendEnabled) { _ in
// do {
// try setXFTPConfig(getXFTPCfg())
// } catch {
// logger.error("setXFTPConfig: cannot set XFTP config \(responseError(error))")
// }
// }
// }
// } header: {
// Text("Experimental")
// } footer: {
// if xftpSendEnabled {
// Text("v4.6.1+ is required to receive via XFTP.")
// }
// }
}
}
}
@@ -1,37 +0,0 @@
//
// ExperimentalFeaturesView.swift
// SimpleX (iOS)
//
// Created by Evgeny on 30/05/2022.
// Copyright © 2022 SimpleX Chat. All rights reserved.
//
import SwiftUI
import SimpleXChat
struct ExperimentalFeaturesView: View {
@AppStorage(GROUP_DEFAULT_XFTP_SEND_ENABLED, store: groupDefaults) private var xftpSendEnabled = false
var body: some View {
List {
Section("") {
settingsRow("arrow.up.doc") {
Toggle("Send videos and files via XFTP", isOn: $xftpSendEnabled)
.onChange(of: xftpSendEnabled) { _ in
do {
try setXFTPConfig(getXFTPCfg())
} catch {
logger.error("setXFTPConfig: cannot set XFTP config \(responseError(error))")
}
}
}
}
}
}
}
struct ExperimentalFeaturesView_Previews: PreviewProvider {
static var previews: some View {
ExperimentalFeaturesView()
}
}
@@ -25,7 +25,6 @@ private enum NetworkAlert: Identifiable {
struct NetworkAndServers: View {
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
@AppStorage(GROUP_DEFAULT_XFTP_SEND_ENABLED, store: groupDefaults) private var xftpSendEnabled = false
@State private var cfgLoaded = false
@State private var currentNetCfg = NetCfg.defaults
@State private var netCfg = NetCfg.defaults
@@ -44,13 +43,11 @@ struct NetworkAndServers: View {
Text("SMP servers")
}
if xftpSendEnabled {
NavigationLink {
ProtocolServersView(serverProtocol: .xftp)
.navigationTitle("Your XFTP servers")
} label: {
Text("XFTP servers")
}
NavigationLink {
ProtocolServersView(serverProtocol: .xftp)
.navigationTitle("Your XFTP servers")
} label: {
Text("XFTP servers")
}
Picker("Use .onion hosts", selection: $onionHosts) {
@@ -21,6 +21,7 @@ struct PreferencesView: View {
timedMessagesFeatureSection($preferences.timedMessages.allow)
featureSection(.fullDelete, $preferences.fullDelete.allow)
featureSection(.voice, $preferences.voice.allow)
featureSection(.calls, $preferences.calls.allow).disabled(true)
Section {
Button("Reset") { preferences = currentPreferences }
@@ -60,7 +61,7 @@ struct PreferencesView: View {
}
private func featureFooter(_ feature: ChatFeature, _ allowFeature: Binding<FeatureAllowed>) -> some View {
Text(feature.allowDescription(allowFeature.wrappedValue))
(Text(feature.allowDescription(allowFeature.wrappedValue)) + (feature == .calls ? Text("\nAvailable in v5.1").bold() : Text("")))
.frame(height: 36, alignment: .topLeading)
}
@@ -232,14 +232,6 @@ struct SettingsView: View {
} label: {
settingsRow("info") { Text("About SimpleX Chat") }
}
// NavigationLink {
// MarkdownHelp()
// .padding()
// .navigationTitle("How to use markdown")
// .frame(maxHeight: .infinity, alignment: .top)
// } label: {
// settingsRow("textformat") { Text("Markdown in messages") }
// }
settingsRow("number") {
Button("Send questions and ideas") {
showSettings = false
@@ -278,12 +270,6 @@ struct SettingsView: View {
} label: {
settingsRow("chevron.left.forwardslash.chevron.right") { Text("Developer tools") }
}
// NavigationLink {
// ExperimentalFeaturesView()
// .navigationTitle("Experimental features")
// } label: {
// settingsRow("gauge") { Text("Experimental features") }
// }
NavigationLink {
VersionView()
.navigationBarTitle("App version")
@@ -12,6 +12,11 @@
</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="&#10;Available in v5.1" xml:space="preserve">
<source>
Available in v5.1</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id=" " xml:space="preserve">
<source> </source>
<target> </target>
@@ -144,6 +149,7 @@
</trans-unit>
<trans-unit id="%lld minutes" xml:space="preserve">
<source>%lld minutes</source>
<target>%lld minut</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lld second(s)" xml:space="preserve">
@@ -153,6 +159,7 @@
</trans-unit>
<trans-unit id="%lld seconds" xml:space="preserve">
<source>%lld seconds</source>
<target>%lld vteřin</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lldd" xml:space="preserve">
@@ -190,6 +197,14 @@
<target>%lldw</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages failed to decrypt." xml:space="preserve">
<source>%u messages failed to decrypt.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages skipped." xml:space="preserve">
<source>%u messages skipped.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="(" xml:space="preserve">
<source>(</source>
<target>(</target>
@@ -438,6 +453,10 @@
<target>Povolit</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow calls only if your contact allows them." xml:space="preserve">
<source>Allow calls only if your contact allows them.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow disappearing messages only if your contact allows it to you." xml:space="preserve">
<source>Allow disappearing messages only if your contact allows it to you.</source>
<target>Povolte mizící zprávy, pouze pokud vám to váš kontakt dovolí.</target>
@@ -478,6 +497,10 @@
<target>Povolit hlasové zprávy?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to call you." xml:space="preserve">
<source>Allow your contacts to call you.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to irreversibly delete sent messages." xml:space="preserve">
<source>Allow your contacts to irreversibly delete sent messages.</source>
<target>Umožněte svým kontaktům nevratně odstranit odeslané zprávy.</target>
@@ -518,6 +541,10 @@
<target>Ikona aplikace</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App passcode" xml:space="preserve">
<source>App passcode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>Verze aplikace</target>
@@ -548,8 +575,17 @@
<target>Hlasové a video hovory</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Audio/video calls" xml:space="preserve">
<source>Audio/video calls</source>
<note>chat feature</note>
</trans-unit>
<trans-unit id="Audio/video calls are prohibited." xml:space="preserve">
<source>Audio/video calls are prohibited.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Authentication cancelled" xml:space="preserve">
<source>Authentication cancelled</source>
<target>Ověření zrušeno</target>
<note>PIN entry</note>
</trans-unit>
<trans-unit id="Authentication failed" xml:space="preserve">
@@ -587,11 +623,25 @@
<target>Zpět</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bad message ID" xml:space="preserve">
<source>Bad message ID</source>
<target>Špatné ID zprávy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bad message hash" xml:space="preserve">
<source>Bad message hash</source>
<target>Špatný hash zprávy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can irreversibly delete sent messages." xml:space="preserve">
<source>Both you and your contact can irreversibly delete sent messages.</source>
<target>Vy i váš kontakt můžete nevratně mazat odeslané zprávy.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can make calls." xml:space="preserve">
<source>Both you and your contact can make calls.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can send disappearing messages." xml:space="preserve">
<source>Both you and your contact can send disappearing messages.</source>
<target>Vy i váš kontakt můžete posílat mizící zprávy.</target>
@@ -635,11 +685,6 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Zrušit</target>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Cancel file transfer?" xml:space="preserve">
<source>Cancel file transfer?</source>
<target>Zrušit přenos souboru?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
@@ -659,6 +704,7 @@
</trans-unit>
<trans-unit id="Change Passcode" xml:space="preserve">
<source>Change Passcode</source>
<target>Změna hesla</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change database passphrase?" xml:space="preserve">
@@ -668,6 +714,7 @@
</trans-unit>
<trans-unit id="Change lock mode" xml:space="preserve">
<source>Change lock mode</source>
<target>Změnit zamykání</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Change member role?" xml:space="preserve">
@@ -677,6 +724,7 @@
</trans-unit>
<trans-unit id="Change passcode" xml:space="preserve">
<source>Change passcode</source>
<target>Změnit heslo</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Change receiving address" xml:space="preserve">
@@ -786,6 +834,7 @@
</trans-unit>
<trans-unit id="Compare file" xml:space="preserve">
<source>Compare file</source>
<target>Porovnat soubor</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Compare security codes with your contacts." xml:space="preserve">
@@ -805,6 +854,7 @@
</trans-unit>
<trans-unit id="Confirm Passcode" xml:space="preserve">
<source>Confirm Passcode</source>
<target>Potvrdit heslo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm database upgrades" xml:space="preserve">
@@ -964,6 +1014,7 @@
</trans-unit>
<trans-unit id="Create file" xml:space="preserve">
<source>Create file</source>
<target>Vytvořit soubor</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Create group link" xml:space="preserve">
@@ -1003,6 +1054,7 @@
</trans-unit>
<trans-unit id="Current Passcode" xml:space="preserve">
<source>Current Passcode</source>
<target>Aktuální heslo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Current passphrase…" xml:space="preserve">
@@ -1118,6 +1170,11 @@
<target>Decentralizované</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decryption error" xml:space="preserve">
<source>Decryption error</source>
<target>Chyba dešifrování</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete" xml:space="preserve">
<source>Delete</source>
<target>Smazat</target>
@@ -1190,6 +1247,7 @@
</trans-unit>
<trans-unit id="Delete file" xml:space="preserve">
<source>Delete file</source>
<target>Smazat soubor</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Delete files and media?" xml:space="preserve">
@@ -1394,6 +1452,7 @@
</trans-unit>
<trans-unit id="Download file" xml:space="preserve">
<source>Download file</source>
<target>Stáhnout soubor</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Duplicate display name!" xml:space="preserve">
@@ -1438,6 +1497,7 @@
</trans-unit>
<trans-unit id="Enable lock" xml:space="preserve">
<source>Enable lock</source>
<target>Povolit zámek</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable notifications" xml:space="preserve">
@@ -1497,6 +1557,7 @@
</trans-unit>
<trans-unit id="Enter Passcode" xml:space="preserve">
<source>Enter Passcode</source>
<target>Zadat heslo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enter correct passphrase." xml:space="preserve">
@@ -1641,6 +1702,7 @@
</trans-unit>
<trans-unit id="Error loading %@ servers" xml:space="preserve">
<source>Error loading %@ servers</source>
<target>Chyba načítání %@ serverů</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error receiving file" xml:space="preserve">
@@ -1670,6 +1732,7 @@
</trans-unit>
<trans-unit id="Error saving passcode" xml:space="preserve">
<source>Error saving passcode</source>
<target>Chyba uložení hesla</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error saving passphrase to keychain" xml:space="preserve">
@@ -1747,11 +1810,6 @@
<target>Ukončit bez uložení</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Experimental" xml:space="preserve">
<source>Experimental</source>
<target>Pokusný</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Export database" xml:space="preserve">
<source>Export database</source>
<target>Export databáze</target>
@@ -1777,9 +1835,12 @@
<target>Přístupovou frázi se nepodařilo odstranit</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File transfer will be cancelled. If it's in progress it will be stoppped." xml:space="preserve">
<source>File transfer will be cancelled. If it's in progress it will be stoppped.</source>
<target>Přenos souboru bude zrušen. Pokud probíhá, bude zastaven.</target>
<trans-unit id="Fast and no wait until the sender is online!" xml:space="preserve">
<source>Fast and no wait until the sender is online!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be deleted from servers." xml:space="preserve">
<source>File will be deleted from servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be received when your contact completes uploading it." xml:space="preserve">
@@ -2049,6 +2110,7 @@
</trans-unit>
<trans-unit id="Immediately" xml:space="preserve">
<source>Immediately</source>
<target>Ihned</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Immune to spam and abuse" xml:space="preserve">
@@ -2123,6 +2185,7 @@
</trans-unit>
<trans-unit id="Incorrect passcode" xml:space="preserve">
<source>Incorrect passcode</source>
<target>Nesprávné heslo</target>
<note>PIN entry</note>
</trans-unit>
<trans-unit id="Incorrect security code!" xml:space="preserve">
@@ -2202,19 +2265,20 @@
<target>Umožňuje mít v jednom profilu chatu mnoho anonymních spojení bez jakýchkoli sdílených údajů mezi nimi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It can happen when:&#10;1. The messages expire on the server if they were not received for 30 days,&#10;2. The server you use to receive the messages from this contact was updated and restarted.&#10;3. The connection is compromised.&#10;Please connect to the developers via Settings to receive the updates about the servers.&#10;We will be adding server redundancy to prevent lost messages." xml:space="preserve">
<trans-unit id="It can happen when you or your connection used the old database backup." xml:space="preserve">
<source>It can happen when you or your connection used the old database backup.</source>
<target>Může se to stát, když vy nebo vaše připojení použijete starou zálohu databáze.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It can happen when:&#10;1. The messages expired in the sending client after 2 days or on the server after 30 days.&#10;2. Message decryption failed, because you or your contact used old database backup.&#10;3. The connection was compromised." xml:space="preserve">
<source>It can happen when:
1. The messages expire on the server if they were not received for 30 days,
2. The server you use to receive the messages from this contact was updated and restarted.
3. The connection is compromised.
Please connect to the developers via Settings to receive the updates about the servers.
We will be adding server redundancy to prevent lost messages.</source>
1. The messages expired in the sending client after 2 days or on the server after 30 days.
2. Message decryption failed, because you or your contact used old database backup.
3. The connection was compromised.</source>
<target>Může se to stát, když:
1. Zprávy na serveru vyprší, pokud nebyly přijaty po dobu 30 dnů,
2. Server, který používáte pro příjem zpráv od tohoto kontaktu, byl aktualizován a restartován.
3. Spojení je narušeno.
Připojte se k vývojářům prostřednictvím Nastavení, abyste mohli dostávat aktualizace o serverech.
Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</target>
1. Zprávy vypršely v odesílajícím klientovi po 2 dnech nebo na serveru po 30 dnech.
2. Dešifrování zprávy se nezdařilo, protože vy nebo váš kontakt jste použili starou zálohu databáze.
3. Spojení je kompromitováno.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It seems like you are already connected via this link. If it is not the case, there was an error (%@)." xml:space="preserve">
@@ -2249,6 +2313,7 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
</trans-unit>
<trans-unit id="KeyChain error" xml:space="preserve">
<source>KeyChain error</source>
<target>Chyba klíčenky</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Keychain error" xml:space="preserve">
@@ -2313,10 +2378,12 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
</trans-unit>
<trans-unit id="Lock after" xml:space="preserve">
<source>Lock after</source>
<target>Zamknout po</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Lock mode" xml:space="preserve">
<source>Lock mode</source>
<target>Režim zámku</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make a private connection" xml:space="preserve">
@@ -2491,6 +2558,7 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
</trans-unit>
<trans-unit id="New Passcode" xml:space="preserve">
<source>New Passcode</source>
<target>Nové heslo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New contact request" xml:space="preserve">
@@ -2535,6 +2603,7 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
</trans-unit>
<trans-unit id="No app password" xml:space="preserve">
<source>No app password</source>
<target>Žádné heslo aplikace</target>
<note>Authentication unavailable</note>
</trans-unit>
<trans-unit id="No contacts selected" xml:space="preserve">
@@ -2588,6 +2657,7 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
</trans-unit>
<trans-unit id="Off" xml:space="preserve">
<source>Off</source>
<target>Vypnout</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Off (Local)" xml:space="preserve">
@@ -2650,6 +2720,10 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
<target>Nevratně mazat zprávy můžete pouze vy (váš kontakt je může označit ke smazání).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can make calls." xml:space="preserve">
<source>Only you can make calls.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can send disappearing messages." xml:space="preserve">
<source>Only you can send disappearing messages.</source>
<target>Mizící zprávy můžete odesílat pouze vy.</target>
@@ -2665,6 +2739,10 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
<target>Nevratně mazat zprávy může pouze váš kontakt (vy je můžete označit ke smazání).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can make calls." xml:space="preserve">
<source>Only your contact can make calls.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can send disappearing messages." xml:space="preserve">
<source>Only your contact can send disappearing messages.</source>
<target>Zmizelé zprávy může odesílat pouze váš kontakt.</target>
@@ -2717,22 +2795,27 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
</trans-unit>
<trans-unit id="Passcode" xml:space="preserve">
<source>Passcode</source>
<target>Heslo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Passcode changed!" xml:space="preserve">
<source>Passcode changed!</source>
<target>Heslo změněno!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Passcode entry" xml:space="preserve">
<source>Passcode entry</source>
<target>Zadat heslo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Passcode not changed!" xml:space="preserve">
<source>Passcode not changed!</source>
<target>Heslo nezměněno!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Passcode set!" xml:space="preserve">
<source>Passcode set!</source>
<target>Heslo nastaveno!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Password to show" xml:space="preserve">
@@ -2770,6 +2853,11 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
<target>Pravidelně</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Permanent decryption error" xml:space="preserve">
<source>Permanent decryption error</source>
<target>Chyba dešifrování</target>
<note>message decrypt error item</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable sending voice messages." xml:space="preserve">
<source>Please ask your contact to enable sending voice messages.</source>
<target>Prosím, požádejte kontaktní osobu, aby umožnila odesílání hlasových zpráv.</target>
@@ -2807,6 +2895,12 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
</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>Zapamatujte si ho nebo bezpečně uložte - neexistuje žádný způsob, jak obnovit ztracený heslo!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please report it to the developers." xml:space="preserve">
<source>Please report it to the developers.</source>
<target>Nahlaste to prosím vývojářům.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please restart the app and migrate the database to enable push notifications." xml:space="preserve">
@@ -2824,6 +2918,10 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
<target>Heslo uložte bezpečně, v případě jeho ztráty jej NEBUDE možné změnit.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
<source>Possibly, certificate fingerprint in server address is incorrect</source>
<target>Je možné, že otisk certifikátu v adrese serveru je nesprávný</target>
@@ -2874,6 +2972,10 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
<target>Heslo profilu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit audio/video calls." xml:space="preserve">
<source>Prohibit audio/video calls.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit irreversible message deletion." xml:space="preserve">
<source>Prohibit irreversible message deletion.</source>
<target>Zakázat nevratné mazání zpráv.</target>
@@ -2939,6 +3041,10 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
<target>Událost přijatého souboru</target>
<note>notification</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving via" xml:space="preserve">
<source>Receiving via</source>
<target>Příjem přes</target>
@@ -3064,6 +3170,18 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
<target>Vrátit</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Revoke file" xml:space="preserve">
<source>Revoke file</source>
<note>cancel file action</note>
</trans-unit>
<trans-unit id="Revoke file?" xml:space="preserve">
<source>Revoke file?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Role" xml:space="preserve">
<source>Role</source>
<target>Role</target>
@@ -3239,11 +3357,6 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
<target>Odeslat je z galerie nebo vlastní klávesnice.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send videos and files via XFTP" xml:space="preserve">
<source>Send videos and files via XFTP</source>
<target>Odeslat soubory přes XFTP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
<source>Sender cancelled file transfer.</source>
<target>Odesílatel zrušil přenos souboru.</target>
@@ -3254,6 +3367,10 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
<target>Odesílatel možná smazal požadavek připojení.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending file will be stopped." xml:space="preserve">
<source>Sending file will be stopped.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending via" xml:space="preserve">
<source>Sending via</source>
<target>Odesílání přes</target>
@@ -3276,6 +3393,7 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
</trans-unit>
<trans-unit id="Server requires authorization to upload, check password" xml:space="preserve">
<source>Server requires authorization to upload, check password</source>
<target>Server vyžaduje autorizaci pro nahrávání, zkontrolujte heslo</target>
<note>server test error</note>
</trans-unit>
<trans-unit id="Server test failed!" xml:space="preserve">
@@ -3303,6 +3421,10 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
<target>Nastavení skupinových předvoleb</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set it instead of system authentication." xml:space="preserve">
<source>Set it instead of system authentication.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set passphrase to export" xml:space="preserve">
<source>Set passphrase to export</source>
<target>Nastavení přístupové fráze pro export</target>
@@ -3380,10 +3502,12 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
</trans-unit>
<trans-unit id="SimpleX Lock mode" xml:space="preserve">
<source>SimpleX Lock mode</source>
<target>SimpleX zámek</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Lock not enabled!" xml:space="preserve">
<source>SimpleX Lock not enabled!</source>
<target>Zámek SimpleX není povolen!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Lock turned on" xml:space="preserve">
@@ -3471,8 +3595,21 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
<target>Zastavit chat?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop file" xml:space="preserve">
<source>Stop file</source>
<note>cancel file action</note>
</trans-unit>
<trans-unit id="Stop receiving file?" xml:space="preserve">
<source>Stop receiving file?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop sending file?" xml:space="preserve">
<source>Stop sending file?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
<source>Submit</source>
<target>Odeslat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Support SimpleX Chat" xml:space="preserve">
@@ -3487,6 +3624,7 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
</trans-unit>
<trans-unit id="System authentication" xml:space="preserve">
<source>System authentication</source>
<target>Ověření systému</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="TCP connection timeout" xml:space="preserve">
@@ -3579,6 +3717,13 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
<target>1. Platforma bez identifikátorů uživatelů - soukromá už od záměru.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The ID of the next message is incorrect (less or equal to the previous).&#10;It can happen because of some bug or when the connection is compromised." xml:space="preserve">
<source>The ID of the next message is incorrect (less or equal to the previous).
It can happen because of some bug or when the connection is compromised.</source>
<target>ID další zprávy je nesprávné (menší nebo rovno předchozí).
Může se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitováno.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app can notify you when you receive messages or contact requests - please open settings to enable." xml:space="preserve">
<source>The app can notify you when you receive messages or contact requests - please open settings to enable.</source>
<target>Aplikace vás může upozornit na přijaté zprávy nebo žádosti o kontakt - povolte to v nastavení.</target>
@@ -3609,6 +3754,11 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
<target>Skupina je plně decentralizovaná - je viditelná pouze pro členy.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
<source>The hash of the previous message is different.</source>
<target>Hash předchozí zprávy se liší.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The message will be deleted for all members." xml:space="preserve">
<source>The message will be deleted for all members.</source>
<target>Zpráva bude smazána pro všechny členy.</target>
@@ -3674,6 +3824,11 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
<target>Tuto akci nelze vzít zpět - váš profil, kontakty, zprávy a soubory budou nenávratně ztraceny.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This error is permanent for this connection, please re-connect." xml:space="preserve">
<source>This error is permanent for this connection, please re-connect.</source>
<target>Tato chyba je pro toto připojení trvalá, připojte se znovu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member)." xml:space="preserve">
<source>This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member).</source>
<target>Tato funkce je experimentální! Bude fungovat pouze v případě, že druhý klient má nainstalovanou verzi 4.2. Po dokončení změny adresy by se měla v konverzaci zobrazit zpráva - zkontrolujte, zda můžete od tohoto kontaktu (nebo člena skupiny) stále přijímat zprávy.</target>
@@ -3835,6 +3990,7 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
</trans-unit>
<trans-unit id="Unlock app" xml:space="preserve">
<source>Unlock app</source>
<target>Odemknout aplikaci</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Unmute" xml:space="preserve">
@@ -3889,6 +4045,7 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
</trans-unit>
<trans-unit id="Upload file" xml:space="preserve">
<source>Upload file</source>
<target>Nahrát soubor</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Use .onion hosts" xml:space="preserve">
@@ -3958,10 +4115,16 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
</trans-unit>
<trans-unit id="Video will be received when your contact completes uploading it." xml:space="preserve">
<source>Video will be received when your contact completes uploading it.</source>
<target>Video bude přijato, až kontakt dokončí jeho nahrávání.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Video will be received when your contact is online, please wait or check later!" xml:space="preserve">
<source>Video will be received when your contact is online, please wait or check later!</source>
<target>Video obdržíte, až bude váš kontakt online, vyčkejte prosím nebo zkontrolujte později!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Videos and files up to 1gb" xml:space="preserve">
<source>Videos and files up to 1gb</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="View security code" xml:space="preserve">
@@ -4006,6 +4169,7 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
</trans-unit>
<trans-unit id="Waiting for video" xml:space="preserve">
<source>Waiting for video</source>
<target>Čekám na video</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
@@ -4142,6 +4306,7 @@ SimpleX zámek musí být povolen.</target>
</trans-unit>
<trans-unit id="You can turn on SimpleX Lock via Settings." xml:space="preserve">
<source>You can turn on SimpleX Lock via Settings.</source>
<target>Zámek SimpleX můžete zapnout v Nastavení.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can use markdown to format messages:" xml:space="preserve">
@@ -4276,6 +4441,7 @@ SimpleX zámek musí být povolen.</target>
</trans-unit>
<trans-unit id="Your XFTP servers" xml:space="preserve">
<source>Your XFTP servers</source>
<target>Vaše XFTP servery</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your calls" xml:space="preserve">
@@ -4918,11 +5084,6 @@ Servery SimpleX nevidí váš profil.</target>
<target>v%@ (%@)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="v4.6.1+ is required to receive via XFTP." xml:space="preserve">
<source>v4.6.1+ is required to receive via XFTP.</source>
<target>Pro příjem přes XFTP je vyžadována verze 4.6.1+.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="via contact address link" xml:space="preserve">
<source>via contact address link</source>
<target>prostřednictvím odkazu na kontaktní adresu</target>
@@ -12,6 +12,11 @@
</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="&#10;Available in v5.1" xml:space="preserve">
<source>
Available in v5.1</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id=" " xml:space="preserve">
<source> </source>
<target> </target>
@@ -144,6 +149,7 @@
</trans-unit>
<trans-unit id="%lld minutes" xml:space="preserve">
<source>%lld minutes</source>
<target>%lld Minuten</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lld second(s)" xml:space="preserve">
@@ -153,6 +159,7 @@
</trans-unit>
<trans-unit id="%lld seconds" xml:space="preserve">
<source>%lld seconds</source>
<target>%lld Sekunden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lldd" xml:space="preserve">
@@ -190,6 +197,14 @@
<target>%lldW</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages failed to decrypt." xml:space="preserve">
<source>%u messages failed to decrypt.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages skipped." xml:space="preserve">
<source>%u messages skipped.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="(" xml:space="preserve">
<source>(</source>
<target>(</target>
@@ -438,6 +453,10 @@
<target>Erlauben</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow calls only if your contact allows them." xml:space="preserve">
<source>Allow calls only if your contact allows them.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow disappearing messages only if your contact allows it to you." xml:space="preserve">
<source>Allow disappearing messages only if your contact allows it to you.</source>
<target>Verschwindende Nachrichten nur erlauben, wenn Ihr Kontakt das ebenfalls erlaubt.</target>
@@ -478,6 +497,10 @@
<target>Sprachnachricht erlauben?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to call you." xml:space="preserve">
<source>Allow your contacts to call you.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to irreversibly delete sent messages." xml:space="preserve">
<source>Allow your contacts to irreversibly delete sent messages.</source>
<target>Erlauben Sie Ihren Kontakten gesendete Nachrichten unwiederbringlich zu löschen.</target>
@@ -518,6 +541,10 @@
<target>App Icon</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App passcode" xml:space="preserve">
<source>App passcode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>App Version</target>
@@ -548,8 +575,17 @@
<target>Audio- und Videoanrufe</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Audio/video calls" xml:space="preserve">
<source>Audio/video calls</source>
<note>chat feature</note>
</trans-unit>
<trans-unit id="Audio/video calls are prohibited." xml:space="preserve">
<source>Audio/video calls are prohibited.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Authentication cancelled" xml:space="preserve">
<source>Authentication cancelled</source>
<target>Authentifizierung abgebrochen</target>
<note>PIN entry</note>
</trans-unit>
<trans-unit id="Authentication failed" xml:space="preserve">
@@ -587,11 +623,25 @@
<target>Zurück</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bad message ID" xml:space="preserve">
<source>Bad message ID</source>
<target>Falsche Nachrichten-ID</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bad message hash" xml:space="preserve">
<source>Bad message hash</source>
<target>Ungültiger Nachrichten-Hash</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can irreversibly delete sent messages." xml:space="preserve">
<source>Both you and your contact can irreversibly delete sent messages.</source>
<target>Sowohl Ihr Kontakt, als auch Sie können gesendete Nachrichten unwiederbringlich löschen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can make calls." xml:space="preserve">
<source>Both you and your contact can make calls.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can send disappearing messages." xml:space="preserve">
<source>Both you and your contact can send disappearing messages.</source>
<target>Ihr Kontakt und Sie können beide verschwindende Nachrichten senden.</target>
@@ -635,11 +685,6 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Abbrechen</target>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Cancel file transfer?" xml:space="preserve">
<source>Cancel file transfer?</source>
<target>Dateitransfer abbrechen?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
@@ -659,6 +704,7 @@
</trans-unit>
<trans-unit id="Change Passcode" xml:space="preserve">
<source>Change Passcode</source>
<target>Passwort ändern</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change database passphrase?" xml:space="preserve">
@@ -668,6 +714,7 @@
</trans-unit>
<trans-unit id="Change lock mode" xml:space="preserve">
<source>Change lock mode</source>
<target>Sperr-Modus ändern</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Change member role?" xml:space="preserve">
@@ -677,6 +724,7 @@
</trans-unit>
<trans-unit id="Change passcode" xml:space="preserve">
<source>Change passcode</source>
<target>Passwort ändern</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Change receiving address" xml:space="preserve">
@@ -786,6 +834,7 @@
</trans-unit>
<trans-unit id="Compare file" xml:space="preserve">
<source>Compare file</source>
<target>Datei vergleichen</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Compare security codes with your contacts." xml:space="preserve">
@@ -805,6 +854,7 @@
</trans-unit>
<trans-unit id="Confirm Passcode" xml:space="preserve">
<source>Confirm Passcode</source>
<target>Passwort bestätigen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm database upgrades" xml:space="preserve">
@@ -964,6 +1014,7 @@
</trans-unit>
<trans-unit id="Create file" xml:space="preserve">
<source>Create file</source>
<target>Datei erstellen</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Create group link" xml:space="preserve">
@@ -1003,6 +1054,7 @@
</trans-unit>
<trans-unit id="Current Passcode" xml:space="preserve">
<source>Current Passcode</source>
<target>Aktuelles Passwort</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Current passphrase…" xml:space="preserve">
@@ -1118,6 +1170,11 @@
<target>Dezentral</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decryption error" xml:space="preserve">
<source>Decryption error</source>
<target>Entschlüsselungsfehler</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete" xml:space="preserve">
<source>Delete</source>
<target>Löschen</target>
@@ -1190,6 +1247,7 @@
</trans-unit>
<trans-unit id="Delete file" xml:space="preserve">
<source>Delete file</source>
<target>Datei löschen</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Delete files and media?" xml:space="preserve">
@@ -1394,6 +1452,7 @@
</trans-unit>
<trans-unit id="Download file" xml:space="preserve">
<source>Download file</source>
<target>Datei herunterladen</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Duplicate display name!" xml:space="preserve">
@@ -1438,6 +1497,7 @@
</trans-unit>
<trans-unit id="Enable lock" xml:space="preserve">
<source>Enable lock</source>
<target>Sperre aktivieren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable notifications" xml:space="preserve">
@@ -1497,6 +1557,7 @@
</trans-unit>
<trans-unit id="Enter Passcode" xml:space="preserve">
<source>Enter Passcode</source>
<target>Passwort eingeben</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enter correct passphrase." xml:space="preserve">
@@ -1641,6 +1702,7 @@
</trans-unit>
<trans-unit id="Error loading %@ servers" xml:space="preserve">
<source>Error loading %@ servers</source>
<target>Fehler beim Laden von %@ Servern</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error receiving file" xml:space="preserve">
@@ -1670,6 +1732,7 @@
</trans-unit>
<trans-unit id="Error saving passcode" xml:space="preserve">
<source>Error saving passcode</source>
<target>Fehler beim Speichern des Passworts</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error saving passphrase to keychain" xml:space="preserve">
@@ -1747,11 +1810,6 @@
<target>Beenden ohne Speichern</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Experimental" xml:space="preserve">
<source>Experimental</source>
<target>Experimentell</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Export database" xml:space="preserve">
<source>Export database</source>
<target>Datenbank exportieren</target>
@@ -1777,9 +1835,12 @@
<target>Das Entfernen des Passworts ist fehlgeschlagen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File transfer will be cancelled. If it's in progress it will be stoppped." xml:space="preserve">
<source>File transfer will be cancelled. If it's in progress it will be stoppped.</source>
<target>Der Dateitransfer wird abgebrochen. Falls er gerade abläuft, wird er angehalten.</target>
<trans-unit id="Fast and no wait until the sender is online!" xml:space="preserve">
<source>Fast and no wait until the sender is online!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be deleted from servers." xml:space="preserve">
<source>File will be deleted from servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be received when your contact completes uploading it." xml:space="preserve">
@@ -2049,6 +2110,7 @@
</trans-unit>
<trans-unit id="Immediately" xml:space="preserve">
<source>Immediately</source>
<target>Sofort</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Immune to spam and abuse" xml:space="preserve">
@@ -2123,6 +2185,7 @@
</trans-unit>
<trans-unit id="Incorrect passcode" xml:space="preserve">
<source>Incorrect passcode</source>
<target>Passwort falsch</target>
<note>PIN entry</note>
</trans-unit>
<trans-unit id="Incorrect security code!" xml:space="preserve">
@@ -2202,19 +2265,20 @@
<target>Er ermöglicht mehrere anonyme Verbindungen in einem einzigen Chat-Profil ohne Daten zwischen diesen zu teilen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It can happen when:&#10;1. The messages expire on the server if they were not received for 30 days,&#10;2. The server you use to receive the messages from this contact was updated and restarted.&#10;3. The connection is compromised.&#10;Please connect to the developers via Settings to receive the updates about the servers.&#10;We will be adding server redundancy to prevent lost messages." xml:space="preserve">
<trans-unit id="It can happen when you or your connection used the old database backup." xml:space="preserve">
<source>It can happen when you or your connection used the old database backup.</source>
<target>Dies kann passieren, falls Sie oder Ihre Verbindung ein altes Datenbank-Backup genutzt haben.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It can happen when:&#10;1. The messages expired in the sending client after 2 days or on the server after 30 days.&#10;2. Message decryption failed, because you or your contact used old database backup.&#10;3. The connection was compromised." xml:space="preserve">
<source>It can happen when:
1. The messages expire on the server if they were not received for 30 days,
2. The server you use to receive the messages from this contact was updated and restarted.
3. The connection is compromised.
Please connect to the developers via Settings to receive the updates about the servers.
We will be adding server redundancy to prevent lost messages.</source>
1. The messages expired in the sending client after 2 days or on the server after 30 days.
2. Message decryption failed, because you or your contact used old database backup.
3. The connection was compromised.</source>
<target>Dies kann unter folgenden Umständen passieren:
1. Die Nachrichten verfallen auf dem Server, wenn sie 30 Tage lang nicht empfangen wurden.
2. Der Server, den Sie zum Empfang der Nachrichten von diesem Kontakt verwenden, wurde aktualisiert und neu gestartet.
3. Die Verbindung ist kompromittiert.
Bitte nehmen Sie über die Einstellungen Verbindung mit den Entwicklern auf, um Updates zu den Servern zu erhalten.
Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu verhindern.</target>
1. Die Nachrichten verfallen auf dem sendenden Client-System nach 2 Tagen oder auf dem Server nach 30 Tagen.
2. Die Nachrichten-Entschlüsselung ist fehlgeschlagen, da von Ihnen oder Ihrem Kontakt ein altes Datenbank-Backup genutzt wurde.
3. Die Verbindung wurde kompromittiert.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It seems like you are already connected via this link. If it is not the case, there was an error (%@)." xml:space="preserve">
@@ -2249,6 +2313,7 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
</trans-unit>
<trans-unit id="KeyChain error" xml:space="preserve">
<source>KeyChain error</source>
<target>Keystore Fehler</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Keychain error" xml:space="preserve">
@@ -2313,10 +2378,12 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
</trans-unit>
<trans-unit id="Lock after" xml:space="preserve">
<source>Lock after</source>
<target>Sperre nach</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Lock mode" xml:space="preserve">
<source>Lock mode</source>
<target>Sperr-Modus</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make a private connection" xml:space="preserve">
@@ -2491,6 +2558,7 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
</trans-unit>
<trans-unit id="New Passcode" xml:space="preserve">
<source>New Passcode</source>
<target>Neues Passwort</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New contact request" xml:space="preserve">
@@ -2535,6 +2603,7 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
</trans-unit>
<trans-unit id="No app password" xml:space="preserve">
<source>No app password</source>
<target>Kein App-Passwort</target>
<note>Authentication unavailable</note>
</trans-unit>
<trans-unit id="No contacts selected" xml:space="preserve">
@@ -2588,6 +2657,7 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
</trans-unit>
<trans-unit id="Off" xml:space="preserve">
<source>Off</source>
<target>Aus</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Off (Local)" xml:space="preserve">
@@ -2650,6 +2720,10 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
<target>Nur Sie können Nachrichten unwiederbringlich löschen (Ihr Kontakt kann sie zum Löschen markieren).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can make calls." xml:space="preserve">
<source>Only you can make calls.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can send disappearing messages." xml:space="preserve">
<source>Only you can send disappearing messages.</source>
<target>Nur Sie können verschwindende Nachrichten senden.</target>
@@ -2665,6 +2739,10 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
<target>Nur Ihr Kontakt kann Nachrichten unwiederbringlich löschen (Sie können sie zum Löschen markieren).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can make calls." xml:space="preserve">
<source>Only your contact can make calls.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can send disappearing messages." xml:space="preserve">
<source>Only your contact can send disappearing messages.</source>
<target>Nur Ihr Kontakt kann verschwindende Nachrichten senden.</target>
@@ -2717,22 +2795,27 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
</trans-unit>
<trans-unit id="Passcode" xml:space="preserve">
<source>Passcode</source>
<target>Passwort</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Passcode changed!" xml:space="preserve">
<source>Passcode changed!</source>
<target>Passwort geändert!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Passcode entry" xml:space="preserve">
<source>Passcode entry</source>
<target>Passworteingabe</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Passcode not changed!" xml:space="preserve">
<source>Passcode not changed!</source>
<target>Passwort wurde nicht geändert!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Passcode set!" xml:space="preserve">
<source>Passcode set!</source>
<target>Passwort wurde geändert!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Password to show" xml:space="preserve">
@@ -2770,6 +2853,11 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
<target>Periodisch</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Permanent decryption error" xml:space="preserve">
<source>Permanent decryption error</source>
<target>Entschlüsselungsfehler</target>
<note>message decrypt error item</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable sending voice messages." xml:space="preserve">
<source>Please ask your contact to enable sending voice messages.</source>
<target>Bitten Sie Ihren Kontakt darum, das Senden von Sprachnachrichten zu aktivieren.</target>
@@ -2807,6 +2895,12 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
</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>Es gibt keine Möglichkeit ein vergessenes Passwort wiederherzustellen - bitte erinnern Sie sich gut daran oder speichern Sie es sicher ab!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please report it to the developers." xml:space="preserve">
<source>Please report it to the developers.</source>
<target>Bitte melden Sie es den Entwicklern.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please restart the app and migrate the database to enable push notifications." xml:space="preserve">
@@ -2824,6 +2918,10 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
<target>Bitte bewahren Sie das Passwort sicher auf, Sie können es NICHT mehr ändern, wenn Sie es vergessen haben oder verlieren.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
<source>Possibly, certificate fingerprint in server address is incorrect</source>
<target>Der Fingerabdruck des Zertifikats in der Serveradresse ist wahrscheinlich ungültig</target>
@@ -2874,6 +2972,10 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
<target>Passwort für Profil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit audio/video calls." xml:space="preserve">
<source>Prohibit audio/video calls.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit irreversible message deletion." xml:space="preserve">
<source>Prohibit irreversible message deletion.</source>
<target>Unwiederbringliches löschen von Nachrichten nicht erlauben.</target>
@@ -2939,6 +3041,10 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
<target>Datei-Ereignis empfangen</target>
<note>notification</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving via" xml:space="preserve">
<source>Receiving via</source>
<target>Empfangen über</target>
@@ -3064,6 +3170,18 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
<target>Zurückkehren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Revoke file" xml:space="preserve">
<source>Revoke file</source>
<note>cancel file action</note>
</trans-unit>
<trans-unit id="Revoke file?" xml:space="preserve">
<source>Revoke file?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Role" xml:space="preserve">
<source>Role</source>
<target>Rolle</target>
@@ -3239,11 +3357,6 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
<target>Senden Sie diese aus dem Fotoalbum oder von individuellen Tastaturen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send videos and files via XFTP" xml:space="preserve">
<source>Send videos and files via XFTP</source>
<target>Dateien per XFTP versenden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
<source>Sender cancelled file transfer.</source>
<target>Der Absender hat die Dateiübertragung abgebrochen.</target>
@@ -3254,6 +3367,10 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
<target>Der Absender hat möglicherweise die Verbindungsanfrage gelöscht.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending file will be stopped." xml:space="preserve">
<source>Sending file will be stopped.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending via" xml:space="preserve">
<source>Sending via</source>
<target>Senden über</target>
@@ -3276,6 +3393,7 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
</trans-unit>
<trans-unit id="Server requires authorization to upload, check password" xml:space="preserve">
<source>Server requires authorization to upload, check password</source>
<target>Bitte das Passwort überprüfen - für den Upload benötigt der Server eine Berechtigung</target>
<note>server test error</note>
</trans-unit>
<trans-unit id="Server test failed!" xml:space="preserve">
@@ -3303,6 +3421,10 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
<target>Gruppenpräferenzen einstellen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set it instead of system authentication." xml:space="preserve">
<source>Set it instead of system authentication.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set passphrase to export" xml:space="preserve">
<source>Set passphrase to export</source>
<target>Passwort für den Export festlegen</target>
@@ -3380,10 +3502,12 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
</trans-unit>
<trans-unit id="SimpleX Lock mode" xml:space="preserve">
<source>SimpleX Lock mode</source>
<target>SimpleX Sperr-Modus</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Lock not enabled!" xml:space="preserve">
<source>SimpleX Lock not enabled!</source>
<target>SimpleX Sperre ist nicht aktiviert!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Lock turned on" xml:space="preserve">
@@ -3471,8 +3595,21 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
<target>Chat beenden?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop file" xml:space="preserve">
<source>Stop file</source>
<note>cancel file action</note>
</trans-unit>
<trans-unit id="Stop receiving file?" xml:space="preserve">
<source>Stop receiving file?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop sending file?" xml:space="preserve">
<source>Stop sending file?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
<source>Submit</source>
<target>Übermitteln</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Support SimpleX Chat" xml:space="preserve">
@@ -3487,6 +3624,7 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
</trans-unit>
<trans-unit id="System authentication" xml:space="preserve">
<source>System authentication</source>
<target>System-Authentifizierung</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="TCP connection timeout" xml:space="preserve">
@@ -3579,6 +3717,13 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
<target>Die erste Plattform ohne Benutzerkennungen Privat per Design.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The ID of the next message is incorrect (less or equal to the previous).&#10;It can happen because of some bug or when the connection is compromised." xml:space="preserve">
<source>The ID of the next message is incorrect (less or equal to the previous).
It can happen because of some bug or when the connection is compromised.</source>
<target>Die ID der nächsten Nachricht ist falsch (kleiner oder gleich der Vorherigen).
Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompromittiert wurde.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app can notify you when you receive messages or contact requests - please open settings to enable." xml:space="preserve">
<source>The app can notify you when you receive messages or contact requests - please open settings to enable.</source>
<target>Wenn sie Nachrichten oder Kontaktanfragen empfangen, kann Sie die App benachrichtigen - Um dies zu aktivieren, öffnen Sie bitte die Einstellungen.</target>
@@ -3609,6 +3754,11 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
<target>Die Gruppe ist vollständig dezentralisiert sie ist nur für Mitglieder sichtbar.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
<source>The hash of the previous message is different.</source>
<target>Der Hash der vorherigen Nachricht ist unterschiedlich.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The message will be deleted for all members." xml:space="preserve">
<source>The message will be deleted for all members.</source>
<target>Diese Nachricht wird für alle Gruppenmitglieder gelöscht.</target>
@@ -3674,6 +3824,11 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
<target>Diese Aktion kann nicht rückgängig gemacht werden! Ihr Profil und Ihre Kontakte, Nachrichten und Dateien gehen unwiderruflich verloren.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This error is permanent for this connection, please re-connect." xml:space="preserve">
<source>This error is permanent for this connection, please re-connect.</source>
<target>Es handelt sich um einen permanenten Fehler für diese Verbindung - bitte verbinden Sie sich neu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member)." xml:space="preserve">
<source>This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member).</source>
<target>Diese Funktion ist experimentell! Sie wird nur funktionieren, wenn der Kontakt ebenfalls eine SimpleX-Version ab v4.2 installiert hat. Sobald der Adress-Wechsel abgeschlossen ist, sollten Sie die Nachricht im Chat-Verlauf sehen. Bitte prüfen Sie, ob Sie weiterhin Nachrichten von diesem Kontakt (oder Gruppenmitglied) empfangen können.</target>
@@ -3835,6 +3990,7 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
</trans-unit>
<trans-unit id="Unlock app" xml:space="preserve">
<source>Unlock app</source>
<target>App entsperren</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Unmute" xml:space="preserve">
@@ -3889,6 +4045,7 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
</trans-unit>
<trans-unit id="Upload file" xml:space="preserve">
<source>Upload file</source>
<target>Datei hochladen</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Use .onion hosts" xml:space="preserve">
@@ -3958,10 +4115,16 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
</trans-unit>
<trans-unit id="Video will be received when your contact completes uploading it." xml:space="preserve">
<source>Video will be received when your contact completes uploading it.</source>
<target>Das Video wird empfangen, sobald Ihr Kontakt das Hochladen beendet hat.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Video will be received when your contact is online, please wait or check later!" xml:space="preserve">
<source>Video will be received when your contact is online, please wait or check later!</source>
<target>Das Video wird empfangen, wenn Ihr Kontakt online ist. Bitte warten oder überprüfen Sie es später!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Videos and files up to 1gb" xml:space="preserve">
<source>Videos and files up to 1gb</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="View security code" xml:space="preserve">
@@ -4006,6 +4169,7 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
</trans-unit>
<trans-unit id="Waiting for video" xml:space="preserve">
<source>Waiting for video</source>
<target>Auf das Video warten</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
@@ -4142,6 +4306,7 @@ Dafür muss die SimpleX Sperre aktiviert sein.</target>
</trans-unit>
<trans-unit id="You can turn on SimpleX Lock via Settings." xml:space="preserve">
<source>You can turn on SimpleX Lock via Settings.</source>
<target>Sie können die SimpleX Sperre über die Einstellungen aktivieren.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can use markdown to format messages:" xml:space="preserve">
@@ -4919,11 +5084,6 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
<target>v%@ (%@)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="v4.6.1+ is required to receive via XFTP." xml:space="preserve">
<source>v4.6.1+ is required to receive via XFTP.</source>
<target>Für den Empfang per XFTP wird v4.6.1 oder neuer benötigt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="via contact address link" xml:space="preserve">
<source>via contact address link</source>
<target>über einen Kontaktadressen-Link</target>
@@ -12,6 +12,13 @@
</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="&#10;Available in v5.1" xml:space="preserve">
<source>
Available in v5.1</source>
<target>
Available in v5.1</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id=" " xml:space="preserve">
<source> </source>
<target> </target>
@@ -192,6 +199,16 @@
<target>%lldw</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages failed to decrypt." xml:space="preserve">
<source>%u messages failed to decrypt.</source>
<target>%u messages failed to decrypt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages skipped." xml:space="preserve">
<source>%u messages skipped.</source>
<target>%u messages skipped.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="(" xml:space="preserve">
<source>(</source>
<target>(</target>
@@ -440,6 +457,11 @@
<target>Allow</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow calls only if your contact allows them." xml:space="preserve">
<source>Allow calls only if your contact allows them.</source>
<target>Allow calls only if your contact allows them.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow disappearing messages only if your contact allows it to you." xml:space="preserve">
<source>Allow disappearing messages only if your contact allows it to you.</source>
<target>Allow disappearing messages only if your contact allows it to you.</target>
@@ -480,6 +502,11 @@
<target>Allow voice messages?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to call you." xml:space="preserve">
<source>Allow your contacts to call you.</source>
<target>Allow your contacts to call you.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to irreversibly delete sent messages." xml:space="preserve">
<source>Allow your contacts to irreversibly delete sent messages.</source>
<target>Allow your contacts to irreversibly delete sent messages.</target>
@@ -520,6 +547,11 @@
<target>App icon</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App passcode" xml:space="preserve">
<source>App passcode</source>
<target>App passcode</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>App version</target>
@@ -550,6 +582,16 @@
<target>Audio and video calls</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Audio/video calls" xml:space="preserve">
<source>Audio/video calls</source>
<target>Audio/video calls</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="Audio/video calls are prohibited." xml:space="preserve">
<source>Audio/video calls are prohibited.</source>
<target>Audio/video calls are prohibited.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Authentication cancelled" xml:space="preserve">
<source>Authentication cancelled</source>
<target>Authentication cancelled</target>
@@ -590,11 +632,26 @@
<target>Back</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bad message ID" xml:space="preserve">
<source>Bad message ID</source>
<target>Bad message ID</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bad message hash" xml:space="preserve">
<source>Bad message hash</source>
<target>Bad message hash</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can irreversibly delete sent messages." xml:space="preserve">
<source>Both you and your contact can irreversibly delete sent messages.</source>
<target>Both you and your contact can irreversibly delete sent messages.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can make calls." xml:space="preserve">
<source>Both you and your contact can make calls.</source>
<target>Both you and your contact can make calls.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can send disappearing messages." xml:space="preserve">
<source>Both you and your contact can send disappearing messages.</source>
<target>Both you and your contact can send disappearing messages.</target>
@@ -638,11 +695,6 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Cancel</target>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Cancel file transfer?" xml:space="preserve">
<source>Cancel file transfer?</source>
<target>Cancel file transfer?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
@@ -1128,6 +1180,11 @@
<target>Decentralized</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decryption error" xml:space="preserve">
<source>Decryption error</source>
<target>Decryption error</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete" xml:space="preserve">
<source>Delete</source>
<target>Delete</target>
@@ -1763,11 +1820,6 @@
<target>Exit without saving</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Experimental" xml:space="preserve">
<source>Experimental</source>
<target>Experimental</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Export database" xml:space="preserve">
<source>Export database</source>
<target>Export database</target>
@@ -1793,9 +1845,14 @@
<target>Failed to remove passphrase</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File transfer will be cancelled. If it's in progress it will be stoppped." xml:space="preserve">
<source>File transfer will be cancelled. If it's in progress it will be stoppped.</source>
<target>File transfer will be cancelled. If it's in progress it will be stoppped.</target>
<trans-unit id="Fast and no wait until the sender is online!" xml:space="preserve">
<source>Fast and no wait until the sender is online!</source>
<target>Fast and no wait until the sender is online!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be deleted from servers." xml:space="preserve">
<source>File will be deleted from servers.</source>
<target>File will be deleted from servers.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be received when your contact completes uploading it." xml:space="preserve">
@@ -2220,19 +2277,20 @@
<target>It allows having many anonymous connections without any shared data between them in a single chat profile.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It can happen when:&#10;1. The messages expire on the server if they were not received for 30 days,&#10;2. The server you use to receive the messages from this contact was updated and restarted.&#10;3. The connection is compromised.&#10;Please connect to the developers via Settings to receive the updates about the servers.&#10;We will be adding server redundancy to prevent lost messages." xml:space="preserve">
<trans-unit id="It can happen when you or your connection used the old database backup." xml:space="preserve">
<source>It can happen when you or your connection used the old database backup.</source>
<target>It can happen when you or your connection used the old database backup.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It can happen when:&#10;1. The messages expired in the sending client after 2 days or on the server after 30 days.&#10;2. Message decryption failed, because you or your contact used old database backup.&#10;3. The connection was compromised." xml:space="preserve">
<source>It can happen when:
1. The messages expire on the server if they were not received for 30 days,
2. The server you use to receive the messages from this contact was updated and restarted.
3. The connection is compromised.
Please connect to the developers via Settings to receive the updates about the servers.
We will be adding server redundancy to prevent lost messages.</source>
1. The messages expired in the sending client after 2 days or on the server after 30 days.
2. Message decryption failed, because you or your contact used old database backup.
3. The connection was compromised.</source>
<target>It can happen when:
1. The messages expire on the server if they were not received for 30 days,
2. The server you use to receive the messages from this contact was updated and restarted.
3. The connection is compromised.
Please connect to the developers via Settings to receive the updates about the servers.
We will be adding server redundancy to prevent lost messages.</target>
1. The messages expired in the sending client after 2 days or on the server after 30 days.
2. Message decryption failed, because you or your contact used old database backup.
3. The connection was compromised.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It seems like you are already connected via this link. If it is not the case, there was an error (%@)." xml:space="preserve">
@@ -2674,6 +2732,11 @@ We will be adding server redundancy to prevent lost messages.</target>
<target>Only you can irreversibly delete messages (your contact can mark them for deletion).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can make calls." xml:space="preserve">
<source>Only you can make calls.</source>
<target>Only you can make calls.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can send disappearing messages." xml:space="preserve">
<source>Only you can send disappearing messages.</source>
<target>Only you can send disappearing messages.</target>
@@ -2689,6 +2752,11 @@ We will be adding server redundancy to prevent lost messages.</target>
<target>Only your contact can irreversibly delete messages (you can mark them for deletion).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can make calls." xml:space="preserve">
<source>Only your contact can make calls.</source>
<target>Only your contact can make calls.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can send disappearing messages." xml:space="preserve">
<source>Only your contact can send disappearing messages.</source>
<target>Only your contact can send disappearing messages.</target>
@@ -2799,6 +2867,11 @@ We will be adding server redundancy to prevent lost messages.</target>
<target>Periodically</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Permanent decryption error" xml:space="preserve">
<source>Permanent decryption error</source>
<target>Permanent decryption error</target>
<note>message decrypt error item</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable sending voice messages." xml:space="preserve">
<source>Please ask your contact to enable sending voice messages.</source>
<target>Please ask your contact to enable sending voice messages.</target>
@@ -2839,6 +2912,11 @@ We will be adding server redundancy to prevent lost messages.</target>
<target>Please remember or store it securely - there is no way to recover a lost passcode!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please report it to the developers." xml:space="preserve">
<source>Please report it to the developers.</source>
<target>Please report it to the developers.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please restart the app and migrate the database to enable push notifications." xml:space="preserve">
<source>Please restart the app and migrate the database to enable push notifications.</source>
<target>Please restart the app and migrate the database to enable push notifications.</target>
@@ -2854,6 +2932,11 @@ We will be adding server redundancy to prevent lost messages.</target>
<target>Please store passphrase securely, you will NOT be able to change it if you lose it.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<target>Polish interface</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
<source>Possibly, certificate fingerprint in server address is incorrect</source>
<target>Possibly, certificate fingerprint in server address is incorrect</target>
@@ -2904,6 +2987,11 @@ We will be adding server redundancy to prevent lost messages.</target>
<target>Profile password</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit audio/video calls." xml:space="preserve">
<source>Prohibit audio/video calls.</source>
<target>Prohibit audio/video calls.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit irreversible message deletion." xml:space="preserve">
<source>Prohibit irreversible message deletion.</source>
<target>Prohibit irreversible message deletion.</target>
@@ -2969,6 +3057,11 @@ We will be adding server redundancy to prevent lost messages.</target>
<target>Received file event</target>
<note>notification</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Receiving file will be stopped.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving via" xml:space="preserve">
<source>Receiving via</source>
<target>Receiving via</target>
@@ -3094,6 +3187,21 @@ We will be adding server redundancy to prevent lost messages.</target>
<target>Revert</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<target>Revoke</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Revoke file" xml:space="preserve">
<source>Revoke file</source>
<target>Revoke file</target>
<note>cancel file action</note>
</trans-unit>
<trans-unit id="Revoke file?" xml:space="preserve">
<source>Revoke file?</source>
<target>Revoke file?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Role" xml:space="preserve">
<source>Role</source>
<target>Role</target>
@@ -3269,11 +3377,6 @@ We will be adding server redundancy to prevent lost messages.</target>
<target>Send them from gallery or custom keyboards.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send videos and files via XFTP" xml:space="preserve">
<source>Send videos and files via XFTP</source>
<target>Send videos and files via XFTP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
<source>Sender cancelled file transfer.</source>
<target>Sender cancelled file transfer.</target>
@@ -3284,6 +3387,11 @@ We will be adding server redundancy to prevent lost messages.</target>
<target>Sender may have deleted the connection request.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending file will be stopped." xml:space="preserve">
<source>Sending file will be stopped.</source>
<target>Sending file will be stopped.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending via" xml:space="preserve">
<source>Sending via</source>
<target>Sending via</target>
@@ -3334,6 +3442,11 @@ We will be adding server redundancy to prevent lost messages.</target>
<target>Set group preferences</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set it instead of system authentication." xml:space="preserve">
<source>Set it instead of system authentication.</source>
<target>Set it instead of system authentication.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set passphrase to export" xml:space="preserve">
<source>Set passphrase to export</source>
<target>Set passphrase to export</target>
@@ -3504,6 +3617,21 @@ We will be adding server redundancy to prevent lost messages.</target>
<target>Stop chat?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop file" xml:space="preserve">
<source>Stop file</source>
<target>Stop file</target>
<note>cancel file action</note>
</trans-unit>
<trans-unit id="Stop receiving file?" xml:space="preserve">
<source>Stop receiving file?</source>
<target>Stop receiving file?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop sending file?" xml:space="preserve">
<source>Stop sending file?</source>
<target>Stop sending file?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
<source>Submit</source>
<target>Submit</target>
@@ -3614,6 +3742,13 @@ We will be adding server redundancy to prevent lost messages.</target>
<target>The 1st platform without any user identifiers private by design.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The ID of the next message is incorrect (less or equal to the previous).&#10;It can happen because of some bug or when the connection is compromised." xml:space="preserve">
<source>The ID of the next message is incorrect (less or equal to the previous).
It can happen because of some bug or when the connection is compromised.</source>
<target>The ID of the next message is incorrect (less or equal to the previous).
It can happen because of some bug or when the connection is compromised.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app can notify you when you receive messages or contact requests - please open settings to enable." xml:space="preserve">
<source>The app can notify you when you receive messages or contact requests - please open settings to enable.</source>
<target>The app can notify you when you receive messages or contact requests - please open settings to enable.</target>
@@ -3644,6 +3779,11 @@ We will be adding server redundancy to prevent lost messages.</target>
<target>The group is fully decentralized it is visible only to the members.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
<source>The hash of the previous message is different.</source>
<target>The hash of the previous message is different.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The message will be deleted for all members." xml:space="preserve">
<source>The message will be deleted for all members.</source>
<target>The message will be deleted for all members.</target>
@@ -3709,6 +3849,11 @@ We will be adding server redundancy to prevent lost messages.</target>
<target>This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This error is permanent for this connection, please re-connect." xml:space="preserve">
<source>This error is permanent for this connection, please re-connect.</source>
<target>This error is permanent for this connection, please re-connect.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member)." xml:space="preserve">
<source>This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member).</source>
<target>This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member).</target>
@@ -4003,6 +4148,11 @@ To connect, please ask your contact to create another connection link and check
<target>Video will be received when your contact is online, please wait or check later!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Videos and files up to 1gb" xml:space="preserve">
<source>Videos and files up to 1gb</source>
<target>Videos and files up to 1gb</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="View security code" xml:space="preserve">
<source>View security code</source>
<target>View security code</target>
@@ -4960,11 +5110,6 @@ SimpleX servers cannot see your profile.</target>
<target>v%@ (%@)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="v4.6.1+ is required to receive via XFTP." xml:space="preserve">
<source>v4.6.1+ is required to receive via XFTP.</source>
<target>v4.6.1+ is required to receive via XFTP.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="via contact address link" xml:space="preserve">
<source>via contact address link</source>
<target>via contact address link</target>
@@ -12,6 +12,11 @@
</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="&#10;Available in v5.1" xml:space="preserve">
<source>
Available in v5.1</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id=" " xml:space="preserve">
<source> </source>
<target> </target>
@@ -192,6 +197,14 @@
<target>%lldw</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages failed to decrypt." xml:space="preserve">
<source>%u messages failed to decrypt.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages skipped." xml:space="preserve">
<source>%u messages skipped.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="(" xml:space="preserve">
<source>(</source>
<target>(</target>
@@ -346,7 +359,7 @@
</trans-unit>
<trans-unit id="Accent color" xml:space="preserve">
<source>Accent color</source>
<target>Acentuar el color</target>
<target>Color</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accept" xml:space="preserve">
@@ -440,14 +453,18 @@
<target>Permitir</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow calls only if your contact allows them." xml:space="preserve">
<source>Allow calls only if your contact allows them.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow disappearing messages only if your contact allows it to you." xml:space="preserve">
<source>Allow disappearing messages only if your contact allows it to you.</source>
<target>Permitir mensajes temporales sólo si tu contacto también los permite.</target>
<target>Se permiten mensajes temporales sólo si tu contacto también los permite para tí.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you." xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you.</source>
<target>Permitir la eliminación irreversible de mensajes sólo si tu contacto también lo permite para tí.</target>
<target>Se permite la eliminación irreversible de mensajes sólo si tu contacto también la permite para tí.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow sending direct messages to members." xml:space="preserve">
@@ -457,42 +474,46 @@
</trans-unit>
<trans-unit id="Allow sending disappearing messages." xml:space="preserve">
<source>Allow sending disappearing messages.</source>
<target>Permitir el envío de mensajes temporales.</target>
<target>Permites el envío de mensajes temporales.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to irreversibly delete sent messages." xml:space="preserve">
<source>Allow to irreversibly delete sent messages.</source>
<target>Permitir la eliminación irreversible de los mensajes enviados.</target>
<target>Permites la eliminación irreversible de los mensajes enviados.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send voice messages." xml:space="preserve">
<source>Allow to send voice messages.</source>
<target>Permitir enviar mensajes de voz.</target>
<target>Permites enviar mensajes de voz.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow voice messages only if your contact allows them." xml:space="preserve">
<source>Allow voice messages only if your contact allows them.</source>
<target>Permitir mensajes de voz sólo si tu contacto los permite.</target>
<target>Se permiten mensajes de voz sólo si tu contacto también los permite.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow voice messages?" xml:space="preserve">
<source>Allow voice messages?</source>
<target>¿Permitir mensajes de voz?</target>
<target>¿Permites los mensajes de voz?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to call you." xml:space="preserve">
<source>Allow your contacts to call you.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to irreversibly delete sent messages." xml:space="preserve">
<source>Allow your contacts to irreversibly delete sent messages.</source>
<target>Permitir a tus contactos eliminar irreversiblemente los mensajes enviados.</target>
<target>Permites a tus contactos eliminar irreversiblemente los mensajes enviados.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to send disappearing messages." xml:space="preserve">
<source>Allow your contacts to send disappearing messages.</source>
<target>Permitir a tus contactos enviar mensajes temporales.</target>
<target>Permites a tus contactos enviar mensajes temporales.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
<source>Allow your contacts to send voice messages.</source>
<target>Permitir a tus contactos enviar mensajes de voz.</target>
<target>Permites a tus contactos enviar mensajes de voz.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Already connected?" xml:space="preserve">
@@ -520,6 +541,10 @@
<target>Icono app</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App passcode" xml:space="preserve">
<source>App passcode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>Versión de la aplicación</target>
@@ -550,6 +575,14 @@
<target>Llamadas y videollamadas</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Audio/video calls" xml:space="preserve">
<source>Audio/video calls</source>
<note>chat feature</note>
</trans-unit>
<trans-unit id="Audio/video calls are prohibited." xml:space="preserve">
<source>Audio/video calls are prohibited.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Authentication cancelled" xml:space="preserve">
<source>Authentication cancelled</source>
<target>Autenticación cancelada</target>
@@ -590,11 +623,25 @@
<target>Volver</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bad message ID" xml:space="preserve">
<source>Bad message ID</source>
<target>ID de mensaje incorrecto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bad message hash" xml:space="preserve">
<source>Bad message hash</source>
<target>Hash de mensaje incorrecto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can irreversibly delete sent messages." xml:space="preserve">
<source>Both you and your contact can irreversibly delete sent messages.</source>
<target>Tanto tú como tu contacto podéis eliminar de forma irreversible los mensajes enviados.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can make calls." xml:space="preserve">
<source>Both you and your contact can make calls.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can send disappearing messages." xml:space="preserve">
<source>Both you and your contact can send disappearing messages.</source>
<target>Tanto tú como tu contacto podéis enviar mensajes temporales.</target>
@@ -638,11 +685,6 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Cancelar</target>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Cancel file transfer?" xml:space="preserve">
<source>Cancel file transfer?</source>
<target>¿Cancelar el envío de archivos?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
@@ -662,7 +704,7 @@
</trans-unit>
<trans-unit id="Change Passcode" xml:space="preserve">
<source>Change Passcode</source>
<target>Cambiar contraseña</target>
<target>Cambiar el código de acceso</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change database passphrase?" xml:space="preserve">
@@ -682,7 +724,7 @@
</trans-unit>
<trans-unit id="Change passcode" xml:space="preserve">
<source>Change passcode</source>
<target>Cambiar contraseña</target>
<target>Cambiar el código de acceso</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Change receiving address" xml:space="preserve">
@@ -812,7 +854,7 @@
</trans-unit>
<trans-unit id="Confirm Passcode" xml:space="preserve">
<source>Confirm Passcode</source>
<target>Confirmar contraseña</target>
<target>Confirmar el código de acceso</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm database upgrades" xml:space="preserve">
@@ -947,7 +989,7 @@
</trans-unit>
<trans-unit id="Contacts can mark messages for deletion; you will be able to view them." xml:space="preserve">
<source>Contacts can mark messages for deletion; you will be able to view them.</source>
<target>El contacto puede marcar los mensajes para eliminar; tu podrás verlos.</target>
<target>El contacto solo puede marcar los mensajes para eliminar. Tu podrás verlos.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Copy" xml:space="preserve">
@@ -987,7 +1029,7 @@
</trans-unit>
<trans-unit id="Create one-time invitation link" xml:space="preserve">
<source>Create one-time invitation link</source>
<target>Crear enlace de invitación de un uso</target>
<target>Crear enlace de invitación de un solo uso</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Create queue" xml:space="preserve">
@@ -1012,7 +1054,7 @@
</trans-unit>
<trans-unit id="Current Passcode" xml:space="preserve">
<source>Current Passcode</source>
<target>Contraseña actual</target>
<target>Código de acceso actual</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Current passphrase…" xml:space="preserve">
@@ -1128,6 +1170,11 @@
<target>Descentralizado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decryption error" xml:space="preserve">
<source>Decryption error</source>
<target>Error de descifrado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete" xml:space="preserve">
<source>Delete</source>
<target>Eliminar</target>
@@ -1275,7 +1322,7 @@
</trans-unit>
<trans-unit id="Delete old database?" xml:space="preserve">
<source>Delete old database?</source>
<target>¿Eliminar base de datos antígua?</target>
<target>¿Eliminar base de datos antigua?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete pending connection" xml:space="preserve">
@@ -1325,12 +1372,12 @@
</trans-unit>
<trans-unit id="Device authentication is disabled. Turning off SimpleX Lock." xml:space="preserve">
<source>Device authentication is disabled. Turning off SimpleX Lock.</source>
<target>Autenticación de dispositivo desactivada. SimpleX Lock deshabilitado.</target>
<target>Autenticación de dispositivo desactivada. Bloqueo SimpleX deshabilitado.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Device authentication is not enabled. You can turn on SimpleX Lock via Settings, once you enable device authentication." xml:space="preserve">
<source>Device authentication is not enabled. You can turn on SimpleX Lock via Settings, once you enable device authentication.</source>
<target>Autenticación de dispositivo desactivada. Puedes habilitar SimpleX Lock en Configuración, después de activar la autenticación de dispositivo.</target>
<target>Autenticación de dispositivo desactivada. Puedes habilitar Bloqueo SimpleX en Configuración, después de activar la autenticación de dispositivo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Different names, avatars and transport isolation." xml:space="preserve">
@@ -1350,7 +1397,7 @@
</trans-unit>
<trans-unit id="Disable SimpleX Lock" xml:space="preserve">
<source>Disable SimpleX Lock</source>
<target>Desactivar SimpleX Lock</target>
<target>Desactivar Bloqueo SimpleX</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Disappearing messages" xml:space="preserve">
@@ -1430,7 +1477,7 @@
</trans-unit>
<trans-unit id="Enable SimpleX Lock" xml:space="preserve">
<source>Enable SimpleX Lock</source>
<target>Activar SimpleX Lock</target>
<target>Activar Bloqueo SimpleX</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Enable TCP keep-alive" xml:space="preserve">
@@ -1510,7 +1557,7 @@
</trans-unit>
<trans-unit id="Enter Passcode" xml:space="preserve">
<source>Enter Passcode</source>
<target>Introducir contraseña</target>
<target>Introducir código de acceso</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enter correct passphrase." xml:space="preserve">
@@ -1615,7 +1662,7 @@
</trans-unit>
<trans-unit id="Error deleting old database" xml:space="preserve">
<source>Error deleting old database</source>
<target>Error eliminando base de datos antígua</target>
<target>Error eliminando base de datos antigua</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error deleting token" xml:space="preserve">
@@ -1685,7 +1732,7 @@
</trans-unit>
<trans-unit id="Error saving passcode" xml:space="preserve">
<source>Error saving passcode</source>
<target>Error al guardar contraseña</target>
<target>Error al guardar el código de acceso</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error saving passphrase to keychain" xml:space="preserve">
@@ -1763,11 +1810,6 @@
<target>Salir sin guardar</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Experimental" xml:space="preserve">
<source>Experimental</source>
<target>Experimental</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Export database" xml:space="preserve">
<source>Export database</source>
<target>Exportar base de datos</target>
@@ -1793,9 +1835,12 @@
<target>Error eliminando la contraseña</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File transfer will be cancelled. If it's in progress it will be stoppped." xml:space="preserve">
<source>File transfer will be cancelled. If it's in progress it will be stoppped.</source>
<target>El envío de archivos será cancelado. Si está en progreso se detendrá.</target>
<trans-unit id="Fast and no wait until the sender is online!" xml:space="preserve">
<source>Fast and no wait until the sender is online!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be deleted from servers." xml:space="preserve">
<source>File will be deleted from servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be received when your contact completes uploading it." xml:space="preserve">
@@ -2115,7 +2160,7 @@
</trans-unit>
<trans-unit id="Incognito mode protects the privacy of your main profile name and image — for each new contact a new random profile is created." xml:space="preserve">
<source>Incognito mode protects the privacy of your main profile name and image — for each new contact a new random profile is created.</source>
<target>El modo incógnito protege la identidad del perfil principal, por cada contacto nuevo se genera un perfil nuevo aleatorio.</target>
<target>La función del modo incógnito es proteger la identidad del perfil principal: por cada contacto nuevo se genera un perfil aleatorio.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Incoming audio call" xml:space="preserve">
@@ -2140,7 +2185,7 @@
</trans-unit>
<trans-unit id="Incorrect passcode" xml:space="preserve">
<source>Incorrect passcode</source>
<target>Contraseña incorrecta</target>
<target>Código de acceso incorrecto</target>
<note>PIN entry</note>
</trans-unit>
<trans-unit id="Incorrect security code!" xml:space="preserve">
@@ -2217,22 +2262,23 @@
</trans-unit>
<trans-unit id="It allows having many anonymous connections without any shared data between them in a single chat profile." xml:space="preserve">
<source>It allows having many anonymous connections without any shared data between them in a single chat profile.</source>
<target>Permite tener varias conexiones anónimas sin datos compartidos entre estas en un único perfil de chat.</target>
<target>Permite tener varias conexiones anónimas sin datos compartidos entre estas dentro del mismo perfil.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It can happen when:&#10;1. The messages expire on the server if they were not received for 30 days,&#10;2. The server you use to receive the messages from this contact was updated and restarted.&#10;3. The connection is compromised.&#10;Please connect to the developers via Settings to receive the updates about the servers.&#10;We will be adding server redundancy to prevent lost messages." xml:space="preserve">
<trans-unit id="It can happen when you or your connection used the old database backup." xml:space="preserve">
<source>It can happen when you or your connection used the old database backup.</source>
<target>Puede ocurrir cuando tu o tu contacto estáis usando una copia de seguridad antigua de la base de datos.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It can happen when:&#10;1. The messages expired in the sending client after 2 days or on the server after 30 days.&#10;2. Message decryption failed, because you or your contact used old database backup.&#10;3. The connection was compromised." xml:space="preserve">
<source>It can happen when:
1. The messages expire on the server if they were not received for 30 days,
2. The server you use to receive the messages from this contact was updated and restarted.
3. The connection is compromised.
Please connect to the developers via Settings to receive the updates about the servers.
We will be adding server redundancy to prevent lost messages.</source>
1. The messages expired in the sending client after 2 days or on the server after 30 days.
2. Message decryption failed, because you or your contact used old database backup.
3. The connection was compromised.</source>
<target>Esto puede suceder cuando:
1. Los mensajes caducan en el servidor si no se han recibido durante 30 días.
2. El servidor que utiliza para recibir los mensajes de este contacto fue actualizado y reiniciado.
3. La conexión está comprometida.
Por favor, contacta con los desarrolladores a través del menú Configuración para recibir actualizaciones sobre los servidores.
Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</target>
1. Los mensajes caducan en el cliente saliente tras 2 días o en el servidor tras 30 días.
2. El descifrado ha fallado porque tu o tu contacto estáis usando una copia de seguridad antigua de la base de datos.
3. La conexión ha sido comprometida.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It seems like you are already connected via this link. If it is not the case, there was an error (%@)." xml:space="preserve">
@@ -2512,7 +2558,7 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
</trans-unit>
<trans-unit id="New Passcode" xml:space="preserve">
<source>New Passcode</source>
<target>Nueva contraseña</target>
<target>Código de acceso nuevo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New contact request" xml:space="preserve">
@@ -2626,7 +2672,7 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
</trans-unit>
<trans-unit id="Old database" xml:space="preserve">
<source>Old database</source>
<target>Base de datos antígua</target>
<target>Base de datos antigua</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Old database archive" xml:space="preserve">
@@ -2671,7 +2717,11 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
</trans-unit>
<trans-unit id="Only you can irreversibly delete messages (your contact can mark them for deletion)." xml:space="preserve">
<source>Only you can irreversibly delete messages (your contact can mark them for deletion).</source>
<target>Sólo tú puedes eliminar mensajes de forma irreversible (tu contacto puede marcar para eliminar).</target>
<target>Sólo tú puedes eliminar mensajes de forma irreversible (tu contacto puede marcarlos para eliminar).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can make calls." xml:space="preserve">
<source>Only you can make calls.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can send disappearing messages." xml:space="preserve">
@@ -2686,7 +2736,11 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
</trans-unit>
<trans-unit id="Only your contact can irreversibly delete messages (you can mark them for deletion)." xml:space="preserve">
<source>Only your contact can irreversibly delete messages (you can mark them for deletion).</source>
<target>Sólo tu contacto puede eliminar mensajes de forma irreversible (tu puedes marcar para eliminar).</target>
<target>Sólo tu contacto puede eliminar mensajes de forma irreversible (tu puedes marcarlos para eliminar).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can make calls." xml:space="preserve">
<source>Only your contact can make calls.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can send disappearing messages." xml:space="preserve">
@@ -2741,27 +2795,27 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
</trans-unit>
<trans-unit id="Passcode" xml:space="preserve">
<source>Passcode</source>
<target>Contraseña</target>
<target>Código de acceso</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Passcode changed!" xml:space="preserve">
<source>Passcode changed!</source>
<target>¡Contraseña cambiada!</target>
<target>¡Código de acceso cambiado!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Passcode entry" xml:space="preserve">
<source>Passcode entry</source>
<target>Entrada de contraseña</target>
<target>Campo de código de acceso</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Passcode not changed!" xml:space="preserve">
<source>Passcode not changed!</source>
<target>¡Contraseña no cambiada!</target>
<target>¡Código de acceso no cambiado!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Passcode set!" xml:space="preserve">
<source>Passcode set!</source>
<target>¡Contraseña guardada!</target>
<target>¡Código de acceso guardado!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Password to show" xml:space="preserve">
@@ -2799,6 +2853,11 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
<target>Periódico</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Permanent decryption error" xml:space="preserve">
<source>Permanent decryption error</source>
<target>Error de descifrado</target>
<note>message decrypt error item</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable sending voice messages." xml:space="preserve">
<source>Please ask your contact to enable sending voice messages.</source>
<target>Solicita que tu contacto habilite el envío de mensajes de voz.</target>
@@ -2836,7 +2895,12 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
</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 la contraseña en un lugar seguro. ¡No hay manera de recuperar una contraseña perdida!</target>
<target>Por favor, recuerda y guarda el código de acceso en un lugar seguro. ¡No hay ninguna manera de recuperar un código de acceso perdido!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please report it to the developers." xml:space="preserve">
<source>Please report it to the developers.</source>
<target>Por favor, informa a los desarrolladores.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please restart the app and migrate the database to enable push notifications." xml:space="preserve">
@@ -2854,6 +2918,10 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
<target>Guarda la contraseña de forma segura, NO podrás cambiarla si la pierdes.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
<source>Possibly, certificate fingerprint in server address is incorrect</source>
<target>Posiblemente la huella digital del certificado en la dirección del servidor es incorrecta</target>
@@ -2904,6 +2972,10 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
<target>Contraseña del perfil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit audio/video calls." xml:space="preserve">
<source>Prohibit audio/video calls.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit irreversible message deletion." xml:space="preserve">
<source>Prohibit irreversible message deletion.</source>
<target>Prohibir la eliminación irreversible de mensajes.</target>
@@ -2916,12 +2988,12 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
</trans-unit>
<trans-unit id="Prohibit sending disappearing messages." xml:space="preserve">
<source>Prohibit sending disappearing messages.</source>
<target>Prohibir el envío de mensajes temporales.</target>
<target>Prohibes el envío de mensajes temporales.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending voice messages." xml:space="preserve">
<source>Prohibit sending voice messages.</source>
<target>Prohibir el envío de mensajes de voz.</target>
<target>Prohibes el envío de mensajes de voz.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
@@ -2931,7 +3003,7 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
</trans-unit>
<trans-unit id="Protect your chat profiles with a password!" xml:space="preserve">
<source>Protect your chat profiles with a password!</source>
<target>¡Protege tus perfiles Chat con contraseña!</target>
<target>¡Protege tus perfiles con contraseña!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protocol timeout" xml:space="preserve">
@@ -2969,6 +3041,10 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
<target>Evento de archivo recibido</target>
<note>notification</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving via" xml:space="preserve">
<source>Receiving via</source>
<target>Recibiendo mediante</target>
@@ -3094,6 +3170,18 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
<target>Revertir</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Revoke file" xml:space="preserve">
<source>Revoke file</source>
<note>cancel file action</note>
</trans-unit>
<trans-unit id="Revoke file?" xml:space="preserve">
<source>Revoke file?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Role" xml:space="preserve">
<source>Role</source>
<target>Rol</target>
@@ -3269,11 +3357,6 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
<target>Envíalos desde la galería o desde teclados personalizados.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send videos and files via XFTP" xml:space="preserve">
<source>Send videos and files via XFTP</source>
<target>Enviar archivos vía XFTP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
<source>Sender cancelled file transfer.</source>
<target>El remitente ha cancelado la transferencia de archivos.</target>
@@ -3284,6 +3367,10 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
<target>El remitente puede haber eliminado la solicitud de conexión.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending file will be stopped." xml:space="preserve">
<source>Sending file will be stopped.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending via" xml:space="preserve">
<source>Sending via</source>
<target>Envando mediante</target>
@@ -3334,6 +3421,10 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
<target>Establecer preferencias de grupo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set it instead of system authentication." xml:space="preserve">
<source>Set it instead of system authentication.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set passphrase to export" xml:space="preserve">
<source>Set passphrase to export</source>
<target>Escribe la contraseña para exportar</target>
@@ -3504,6 +3595,18 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
<target>¿Detener Chat?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop file" xml:space="preserve">
<source>Stop file</source>
<note>cancel file action</note>
</trans-unit>
<trans-unit id="Stop receiving file?" xml:space="preserve">
<source>Stop receiving file?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop sending file?" xml:space="preserve">
<source>Stop sending file?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
<source>Submit</source>
<target>Enviar</target>
@@ -3556,7 +3659,7 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
</trans-unit>
<trans-unit id="Tap to activate profile." xml:space="preserve">
<source>Tap to activate profile.</source>
<target>Pulsa para activar el perfil.</target>
<target>Pulsa sobre un perfil para activarlo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap to join" xml:space="preserve">
@@ -3614,6 +3717,13 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
<target>La primera plataforma sin identificadores de usuario: diseñada para la privacidad.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The ID of the next message is incorrect (less or equal to the previous).&#10;It can happen because of some bug or when the connection is compromised." xml:space="preserve">
<source>The ID of the next message is incorrect (less or equal to the previous).
It can happen because of some bug or when the connection is compromised.</source>
<target>El ID del siguiente mensaje es incorrecto (menor o igual que el anterior).
Puede ocurrir por algún bug o cuando la conexión está comprometida.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app can notify you when you receive messages or contact requests - please open settings to enable." xml:space="preserve">
<source>The app can notify you when you receive messages or contact requests - please open settings to enable.</source>
<target>La aplicación puede notificarte cuando recibas mensajes o solicitudes de contacto: abre la configuración para habilitar.</target>
@@ -3644,6 +3754,11 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
<target>El grupo está totalmente descentralizado y sólo es visible para los miembros.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
<source>The hash of the previous message is different.</source>
<target>El hash del mensaje anterior es diferente.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The message will be deleted for all members." xml:space="preserve">
<source>The message will be deleted for all members.</source>
<target>El mensaje se eliminará para todos los miembros.</target>
@@ -3709,6 +3824,11 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
<target>Esta acción no se puede deshacer. Tu perfil, contactos, mensajes y archivos se perderán irreversiblemente.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This error is permanent for this connection, please re-connect." xml:space="preserve">
<source>This error is permanent for this connection, please re-connect.</source>
<target>El error es permanente para esta conexión, por favor vuelve a conectarte.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member)." xml:space="preserve">
<source>This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member).</source>
<target>¡Experimental! Sólo funcionará si el otro cliente tiene instalada la versión 4.2. Deberías ver el mensaje en la conversación una vez completado el cambio de dirección. Comprueba que puedes seguir recibiendo mensajes de este contacto (o miembro del grupo).</target>
@@ -3731,7 +3851,7 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
</trans-unit>
<trans-unit id="To find the profile used for an incognito connection, tap the contact or group name on top of the chat." xml:space="preserve">
<source>To find the profile used for an incognito connection, tap the contact or group name on top of the chat.</source>
<target>Para encontrar el perfil usado en una conexión en modo incógnito, pulsa el nombre del contacto o del grupo en la parte superior del chat.</target>
<target>Para conocer el perfil usado en una conexión en modo incógnito, pulsa el nombre del contacto o del grupo en la parte superior del chat.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To make a new connection" xml:space="preserve">
@@ -3752,7 +3872,7 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
<target>Para proteger tu información, activa SimpleX Lock.
<target>Para proteger tu información, activa Bloqueo SimpleX.
Se te pedirá que completes la autenticación antes de activar esta función.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
@@ -4004,6 +4124,10 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
<target>El vídeo se recibirá cuando tu contacto esté en línea, por favor espera o compruébalo más tarde.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Videos and files up to 1gb" xml:space="preserve">
<source>Videos and files up to 1gb</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="View security code" xml:space="preserve">
<source>View security code</source>
<target>Ver código de seguridad</target>
@@ -4081,7 +4205,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
</trans-unit>
<trans-unit id="When you share an incognito profile with somebody, this profile will be used for the groups they invite you to." xml:space="preserve">
<source>When you share an incognito profile with somebody, this profile will be used for the groups they invite you to.</source>
<target>Cuando compartes un perfil incógnito con alguien, este perfil se usará para los grupos a los que te inviten.</target>
<target>Cuando compartes un perfil incógnito con alguien, este perfil también se usará para los grupos a los que te inviten.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="With optional welcome message." xml:space="preserve">
@@ -4153,7 +4277,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
<source>You can hide or mute a user profile - swipe it to the right.
SimpleX Lock must be enabled.</source>
<target>Puedes ocultar o silenciar un perfil de usuario: deslízalo hacia la derecha.
SimpleX Lock debe estar activado.</target>
Bloqueo SimpleX debe estar activado.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can now send messages to %@" xml:space="preserve">
@@ -4183,7 +4307,7 @@ SimpleX Lock debe estar activado.</target>
</trans-unit>
<trans-unit id="You can turn on SimpleX Lock via Settings." xml:space="preserve">
<source>You can turn on SimpleX Lock via Settings.</source>
<target>Puedes activar el bloqueo de SimpleX a través de Configuración.</target>
<target>Puedes activar el Bloqueo SimpleX a través de Configuración.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can use markdown to format messages:" xml:space="preserve">
@@ -4238,7 +4362,7 @@ SimpleX Lock debe estar activado.</target>
</trans-unit>
<trans-unit id="You need to allow your contact to send voice messages to be able to send them." xml:space="preserve">
<source>You need to allow your contact to send voice messages to be able to send them.</source>
<target>Para poder enviar mensajes de voz debes permitir que tu contacto pueda enviarlos.</target>
<target>Para poder enviar mensajes de voz antes debes permitir que tu contacto pueda enviarlos.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You rejected group invitation" xml:space="preserve">
@@ -4288,12 +4412,12 @@ SimpleX Lock debe estar activado.</target>
</trans-unit>
<trans-unit id="You're trying to invite contact with whom you've shared an incognito profile to the group in which you're using your main profile" xml:space="preserve">
<source>You're trying to invite contact with whom you've shared an incognito profile to the group in which you're using your main profile</source>
<target>Estás intentando invitar a un contacto con el que has compartido un perfil incógnito, al grupo en el que utilizas tu perfil principal</target>
<target>Estás intentando invitar a un contacto con el que compartes un perfil incógnito a un grupo en el que usas tu perfil principal</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You're using an incognito profile for this group - to prevent sharing your main profile inviting contacts is not allowed" xml:space="preserve">
<source>You're using an incognito profile for this group - to prevent sharing your main profile inviting contacts is not allowed</source>
<target>Estás utilizando un perfil incógnito para este grupo. Para evitar compartir tu perfil principal, invitar contactos no está permitido</target>
<target>Estás usando un perfil incógnito para este grupo, por tanto para evitar compartir tu perfil principal no se permite invitar contactos</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your %@ servers" xml:space="preserve">
@@ -4313,7 +4437,7 @@ SimpleX Lock debe estar activado.</target>
</trans-unit>
<trans-unit id="Your SimpleX contact address" xml:space="preserve">
<source>Your SimpleX contact address</source>
<target>Tu dirección de contacto SimpleX</target>
<target>Mi dirección de contacto SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your XFTP servers" xml:space="preserve">
@@ -4348,7 +4472,7 @@ SimpleX Lock debe estar activado.</target>
</trans-unit>
<trans-unit id="Your chat profiles" xml:space="preserve">
<source>Your chat profiles</source>
<target>Tus perfiles Chat</target>
<target>Mis perfiles</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your chats" xml:space="preserve">
@@ -4358,7 +4482,7 @@ SimpleX Lock debe estar activado.</target>
</trans-unit>
<trans-unit id="Your contact address" xml:space="preserve">
<source>Your contact address</source>
<target>Tu dirección de contacto</target>
<target>Mi dirección de contacto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact can scan it from the app." xml:space="preserve">
@@ -4400,7 +4524,7 @@ Puedes cancelar esta conexión y eliminar el contacto (e intentarlo más tarde c
</trans-unit>
<trans-unit id="Your privacy" xml:space="preserve">
<source>Your privacy</source>
<target>Tu privacidad</target>
<target>Privacidad</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile is stored on your device and shared only with your contacts.&#10;SimpleX servers cannot see your profile." xml:space="preserve">
@@ -4437,7 +4561,7 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
</trans-unit>
<trans-unit id="Your settings" xml:space="preserve">
<source>Your settings</source>
<target>Tu configuración</target>
<target>Mi configuración</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="[Contribute](https://github.com/simplex-chat/simplex-chat#contribute)" xml:space="preserve">
@@ -4961,11 +5085,6 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
<target>v%@ (%@)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="v4.6.1+ is required to receive via XFTP." xml:space="preserve">
<source>v4.6.1+ is required to receive via XFTP.</source>
<target>Se requiere v4.6.1+ para recibir vía XFTP.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="via contact address link" xml:space="preserve">
<source>via contact address link</source>
<target>mediante enlace de dirección de contacto</target>
@@ -12,6 +12,11 @@
</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="&#10;Available in v5.1" xml:space="preserve">
<source>
Available in v5.1</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id=" " xml:space="preserve">
<source> </source>
<target> </target>
@@ -192,6 +197,14 @@
<target>%lldsmn</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages failed to decrypt." xml:space="preserve">
<source>%u messages failed to decrypt.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages skipped." xml:space="preserve">
<source>%u messages skipped.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="(" xml:space="preserve">
<source>(</source>
<target>(</target>
@@ -440,6 +453,11 @@
<target>Autoriser</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow calls only if your contact allows them." xml:space="preserve">
<source>Allow calls only if your contact allows them.</source>
<target>Autoriser les appels que si votre contact les autorise.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow disappearing messages only if your contact allows it to you." xml:space="preserve">
<source>Allow disappearing messages only if your contact allows it to you.</source>
<target>Autorise les messages éphémères seulement si votre contact vous lautorise.</target>
@@ -480,6 +498,11 @@
<target>Autoriser les messages vocaux ?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to call you." xml:space="preserve">
<source>Allow your contacts to call you.</source>
<target>Autorise vos contacts à vous appeler.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to irreversibly delete sent messages." xml:space="preserve">
<source>Allow your contacts to irreversibly delete sent messages.</source>
<target>Autorise vos contacts à supprimer de manière irréversible les messages envoyés.</target>
@@ -520,6 +543,10 @@
<target>Icône de l'app</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App passcode" xml:space="preserve">
<source>App passcode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>Version de l'app</target>
@@ -550,6 +577,16 @@
<target>Appels audio et vidéo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Audio/video calls" xml:space="preserve">
<source>Audio/video calls</source>
<target>Appels audio/vidéo</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="Audio/video calls are prohibited." xml:space="preserve">
<source>Audio/video calls are prohibited.</source>
<target>Interdire les appels audio/vidéo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Authentication cancelled" xml:space="preserve">
<source>Authentication cancelled</source>
<target>Authentification interrompue</target>
@@ -590,11 +627,26 @@
<target>Retour</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bad message ID" xml:space="preserve">
<source>Bad message ID</source>
<target>Mauvais ID de message</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bad message hash" xml:space="preserve">
<source>Bad message hash</source>
<target>Mauvais hash de message</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can irreversibly delete sent messages." xml:space="preserve">
<source>Both you and your contact can irreversibly delete sent messages.</source>
<target>Vous et votre contact êtes tous deux en mesure de supprimer de manière irréversible les messages envoyés.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can make calls." xml:space="preserve">
<source>Both you and your contact can make calls.</source>
<target>Vous et votre contact pouvez tous deux passer des appels.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can send disappearing messages." xml:space="preserve">
<source>Both you and your contact can send disappearing messages.</source>
<target>Vous et votre contact êtes tous deux en mesure d'envoyer des messages éphémères.</target>
@@ -638,11 +690,6 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Annuler</target>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Cancel file transfer?" xml:space="preserve">
<source>Cancel file transfer?</source>
<target>Annuler le transfert de fichiers ?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
@@ -1128,6 +1175,11 @@
<target>Décentralisé</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decryption error" xml:space="preserve">
<source>Decryption error</source>
<target>Erreur de déchiffrement</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete" xml:space="preserve">
<source>Delete</source>
<target>Supprimer</target>
@@ -1763,11 +1815,6 @@
<target>Quitter sans sauvegarder</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Experimental" xml:space="preserve">
<source>Experimental</source>
<target>Expérimental</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Export database" xml:space="preserve">
<source>Export database</source>
<target>Exporter la base de données</target>
@@ -1793,9 +1840,13 @@
<target>Échec de la suppression de la phrase secrète</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File transfer will be cancelled. If it's in progress it will be stoppped." xml:space="preserve">
<source>File transfer will be cancelled. If it's in progress it will be stoppped.</source>
<target>Le transfert de fichiers sera annulé. S'il est en cours, il sera interrompu.</target>
<trans-unit id="Fast and no wait until the sender is online!" xml:space="preserve">
<source>Fast and no wait until the sender is online!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be deleted from servers." xml:space="preserve">
<source>File will be deleted from servers.</source>
<target>Le fichier sera supprimé des serveurs.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be received when your contact completes uploading it." xml:space="preserve">
@@ -2220,19 +2271,20 @@
<target>Cela permet d'avoir plusieurs connections anonymes sans aucune données partagées entre elles sur un même profil.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It can happen when:&#10;1. The messages expire on the server if they were not received for 30 days,&#10;2. The server you use to receive the messages from this contact was updated and restarted.&#10;3. The connection is compromised.&#10;Please connect to the developers via Settings to receive the updates about the servers.&#10;We will be adding server redundancy to prevent lost messages." xml:space="preserve">
<trans-unit id="It can happen when you or your connection used the old database backup." xml:space="preserve">
<source>It can happen when you or your connection used the old database backup.</source>
<target>Cela peut se produire lorsque vous ou votre contact avez utilisé une ancienne sauvegarde de base de données.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It can happen when:&#10;1. The messages expired in the sending client after 2 days or on the server after 30 days.&#10;2. Message decryption failed, because you or your contact used old database backup.&#10;3. The connection was compromised." xml:space="preserve">
<source>It can happen when:
1. The messages expire on the server if they were not received for 30 days,
2. The server you use to receive the messages from this contact was updated and restarted.
3. The connection is compromised.
Please connect to the developers via Settings to receive the updates about the servers.
We will be adding server redundancy to prevent lost messages.</source>
<target>C'est possible quand :
1. Les messages expirent du serveur (après 30 jours si ils ne sont pas reçu).
2. Le serveur que vous utilisez pour recevoir les messages de ce contact a été mise à jour ou redémarré.
3. La connection est compromise.
Veuillez vous connecter aux développeurs via les Paramètres pour recevoir les mises à jour concernant les serveurs.
Nous allons ajouter une redondance des serveurs pour éviter la perte de messages.</target>
1. The messages expired in the sending client after 2 days or on the server after 30 days.
2. Message decryption failed, because you or your contact used old database backup.
3. The connection was compromised.</source>
<target>Cela peut arriver quand :
1. Les messages ont expiré dans le client expéditeur après 2 jours ou sur le serveur après 30 jours.
2. Le déchiffrement du message a échoué, car vous ou votre contact avez utilisé une ancienne sauvegarde de base de données.
3. La connexion a été compromise.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It seems like you are already connected via this link. If it is not the case, there was an error (%@)." xml:space="preserve">
@@ -2674,6 +2726,11 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
<target>Vous êtes le seul à pouvoir supprimer des messages de manière irréversible (votre contact peut les marquer comme supprimé).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can make calls." xml:space="preserve">
<source>Only you can make calls.</source>
<target>Vous seul pouvez passer des appels.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can send disappearing messages." xml:space="preserve">
<source>Only you can send disappearing messages.</source>
<target>Seulement vous pouvez envoyer des messages éphémères.</target>
@@ -2689,6 +2746,11 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
<target>Seul votre contact peut supprimer de manière irréversible des messages (vous pouvez les marquer comme supprimé).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can make calls." xml:space="preserve">
<source>Only your contact can make calls.</source>
<target>Seul votre contact peut passer des appels.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can send disappearing messages." xml:space="preserve">
<source>Only your contact can send disappearing messages.</source>
<target>Seulement votre contact peut envoyer des messages éphémères.</target>
@@ -2799,6 +2861,11 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
<target>Périodique</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Permanent decryption error" xml:space="preserve">
<source>Permanent decryption error</source>
<target>Erreur de déchiffrement</target>
<note>message decrypt error item</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable sending voice messages." xml:space="preserve">
<source>Please ask your contact to enable sending voice messages.</source>
<target>Veuillez demander à votre contact de permettre l'envoi de messages vocaux.</target>
@@ -2839,6 +2906,11 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
<target>N'oubliez pas de le mémoriser ou de le conserver en toute sécurité - il n'y a aucun moyen de récupérer un code d'accès perdu !</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please report it to the developers." xml:space="preserve">
<source>Please report it to the developers.</source>
<target>Veuillez le signaler aux développeurs.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please restart the app and migrate the database to enable push notifications." xml:space="preserve">
<source>Please restart the app and migrate the database to enable push notifications.</source>
<target>Veuillez redémarrer l'app et migrer la base de données pour activer les notifications push.</target>
@@ -2854,6 +2926,10 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
<target>Veuillez conserver votre phrase secrète en lieu sûr, vous NE pourrez PAS la changer si vous la perdez.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
<source>Possibly, certificate fingerprint in server address is incorrect</source>
<target>Il est possible que l'empreinte du certificat dans l'adresse du serveur soit incorrecte</target>
@@ -2904,6 +2980,11 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
<target>Mot de passe de profil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit audio/video calls." xml:space="preserve">
<source>Prohibit audio/video calls.</source>
<target>Interdire les appels audio/vidéo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit irreversible message deletion." xml:space="preserve">
<source>Prohibit irreversible message deletion.</source>
<target>Interdire la suppression irréversible des messages.</target>
@@ -2916,7 +2997,7 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
</trans-unit>
<trans-unit id="Prohibit sending disappearing messages." xml:space="preserve">
<source>Prohibit sending disappearing messages.</source>
<target>Interdit lenvoi de messages éphémères.</target>
<target>Interdire lenvoi de messages éphémères.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending voice messages." xml:space="preserve">
@@ -2969,6 +3050,11 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
<target>Événement de fichier reçu</target>
<note>notification</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>La réception du fichier sera interrompue.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving via" xml:space="preserve">
<source>Receiving via</source>
<target>Réception via</target>
@@ -3094,6 +3180,21 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
<target>Revenir en arrière</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<target>Révoquer</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Revoke file" xml:space="preserve">
<source>Revoke file</source>
<target>Révoquer le fichier</target>
<note>cancel file action</note>
</trans-unit>
<trans-unit id="Revoke file?" xml:space="preserve">
<source>Revoke file?</source>
<target>Révoquer le fichier ?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Role" xml:space="preserve">
<source>Role</source>
<target>Rôle</target>
@@ -3269,11 +3370,6 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
<target>Envoyez-les depuis la phototèque ou des claviers personnalisés.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send videos and files via XFTP" xml:space="preserve">
<source>Send videos and files via XFTP</source>
<target>Envoi de fichiers via XFTP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
<source>Sender cancelled file transfer.</source>
<target>L'expéditeur a annulé le transfert de fichiers.</target>
@@ -3284,6 +3380,11 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
<target>L'expéditeur a peut-être supprimé la demande de connexion.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending file will be stopped." xml:space="preserve">
<source>Sending file will be stopped.</source>
<target>L'envoi du fichier sera interrompu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending via" xml:space="preserve">
<source>Sending via</source>
<target>Envoi via</target>
@@ -3334,6 +3435,10 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
<target>Définir les préférences du groupe</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set it instead of system authentication." xml:space="preserve">
<source>Set it instead of system authentication.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set passphrase to export" xml:space="preserve">
<source>Set passphrase to export</source>
<target>Définir la phrase secrète pour l'export</target>
@@ -3504,6 +3609,21 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
<target>Arrêter le chat ?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop file" xml:space="preserve">
<source>Stop file</source>
<target>Arrêter le fichier</target>
<note>cancel file action</note>
</trans-unit>
<trans-unit id="Stop receiving file?" xml:space="preserve">
<source>Stop receiving file?</source>
<target>Arrêter de recevoir le fichier ?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop sending file?" xml:space="preserve">
<source>Stop sending file?</source>
<target>Arrêter l'envoi du fichier ?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
<source>Submit</source>
<target>Soumettre</target>
@@ -3614,6 +3734,13 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
<target>La 1ère plateforme sans aucun identifiant d'utilisateur privée par design.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The ID of the next message is incorrect (less or equal to the previous).&#10;It can happen because of some bug or when the connection is compromised." xml:space="preserve">
<source>The ID of the next message is incorrect (less or equal to the previous).
It can happen because of some bug or when the connection is compromised.</source>
<target>L'ID du message suivant est incorrect (inférieur ou égal au précédent).
Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app can notify you when you receive messages or contact requests - please open settings to enable." xml:space="preserve">
<source>The app can notify you when you receive messages or contact requests - please open settings to enable.</source>
<target>L'application peut vous avertir lorsque vous recevez des messages ou des demandes de contact - veuillez ouvrir les paramètres pour les activer.</target>
@@ -3644,6 +3771,11 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
<target>Le groupe est entièrement décentralisé il n'est visible que par ses membres.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
<source>The hash of the previous message is different.</source>
<target>Le hash du message précédent est différent.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The message will be deleted for all members." xml:space="preserve">
<source>The message will be deleted for all members.</source>
<target>Le message sera supprimé pour tous les membres.</target>
@@ -3709,6 +3841,11 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
<target>Cette action ne peut être annulée - votre profil, vos contacts, vos messages et vos fichiers seront irréversiblement perdus.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This error is permanent for this connection, please re-connect." xml:space="preserve">
<source>This error is permanent for this connection, please re-connect.</source>
<target>Cette erreur est persistante pour cette connexion, veuillez vous reconnecter.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member)." xml:space="preserve">
<source>This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member).</source>
<target>Cette fonctionnalité est expérimentale ! Elle ne fonctionnera que si l'autre client a la version 4.2 installée. Vous devriez voir le message dans la conversation une fois le changement d'adresse effectué. Vérifiez que vous pouvez toujours recevoir des messages de ce contact (ou membre du groupe).</target>
@@ -4003,6 +4140,10 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
<target>La vidéo ne sera reçue que lorsque votre contact sera en ligne. Veuillez patienter ou vérifier plus tard !</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Videos and files up to 1gb" xml:space="preserve">
<source>Videos and files up to 1gb</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="View security code" xml:space="preserve">
<source>View security code</source>
<target>Afficher le code de sécurité</target>
@@ -4960,11 +5101,6 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
<target>v%@ (%@)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="v4.6.1+ is required to receive via XFTP." xml:space="preserve">
<source>v4.6.1+ is required to receive via XFTP.</source>
<target>v4.6.1+ nécessaire pour la réception via XFTP.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="via contact address link" xml:space="preserve">
<source>via contact address link</source>
<target>via le lien d'adresse du contact</target>
@@ -12,6 +12,11 @@
</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="&#10;Available in v5.1" xml:space="preserve">
<source>
Available in v5.1</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id=" " xml:space="preserve">
<source> </source>
<target> </target>
@@ -192,6 +197,14 @@
<target>%lldset</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages failed to decrypt." xml:space="preserve">
<source>%u messages failed to decrypt.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages skipped." xml:space="preserve">
<source>%u messages skipped.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="(" xml:space="preserve">
<source>(</source>
<target>(</target>
@@ -440,6 +453,11 @@
<target>Consenti</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow calls only if your contact allows them." xml:space="preserve">
<source>Allow calls only if your contact allows them.</source>
<target>Consenti le chiamate solo se il contatto le consente.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow disappearing messages only if your contact allows it to you." xml:space="preserve">
<source>Allow disappearing messages only if your contact allows it to you.</source>
<target>Consenti i messaggi a tempo solo se il contatto li consente a te.</target>
@@ -480,6 +498,11 @@
<target>Consentire i messaggi vocali?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to call you." xml:space="preserve">
<source>Allow your contacts to call you.</source>
<target>Consenti ai tuoi contatti di chiamarti.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to irreversibly delete sent messages." xml:space="preserve">
<source>Allow your contacts to irreversibly delete sent messages.</source>
<target>Permetti ai tuoi contatti di eliminare irreversibilmente i messaggi inviati.</target>
@@ -520,6 +543,10 @@
<target>Icona app</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App passcode" xml:space="preserve">
<source>App passcode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>Versione dell'app</target>
@@ -550,6 +577,16 @@
<target>Chiamate audio e video</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Audio/video calls" xml:space="preserve">
<source>Audio/video calls</source>
<target>Chiamate audio/video</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="Audio/video calls are prohibited." xml:space="preserve">
<source>Audio/video calls are prohibited.</source>
<target>Le chiamate audio/video sono vietate.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Authentication cancelled" xml:space="preserve">
<source>Authentication cancelled</source>
<target>Autenticazione annullata</target>
@@ -590,11 +627,26 @@
<target>Indietro</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bad message ID" xml:space="preserve">
<source>Bad message ID</source>
<target>ID del messaggio errato</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bad message hash" xml:space="preserve">
<source>Bad message hash</source>
<target>Hash del messaggio errato</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can irreversibly delete sent messages." xml:space="preserve">
<source>Both you and your contact can irreversibly delete sent messages.</source>
<target>Sia tu che il tuo contatto potete eliminare irreversibilmente i messaggi inviati.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can make calls." xml:space="preserve">
<source>Both you and your contact can make calls.</source>
<target>Sia tu che il tuo contatto potete effettuare chiamate.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can send disappearing messages." xml:space="preserve">
<source>Both you and your contact can send disappearing messages.</source>
<target>Sia tu che il tuo contatto potete inviare messaggi a tempo.</target>
@@ -638,11 +690,6 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Annulla</target>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Cancel file transfer?" xml:space="preserve">
<source>Cancel file transfer?</source>
<target>Annullare il trasferimento di file?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
@@ -1128,6 +1175,11 @@
<target>Decentralizzato</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decryption error" xml:space="preserve">
<source>Decryption error</source>
<target>Errore di decifrazione</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete" xml:space="preserve">
<source>Delete</source>
<target>Elimina</target>
@@ -1763,11 +1815,6 @@
<target>Esci senza salvare</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Experimental" xml:space="preserve">
<source>Experimental</source>
<target>Sperimentale</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Export database" xml:space="preserve">
<source>Export database</source>
<target>Esporta database</target>
@@ -1793,9 +1840,13 @@
<target>Rimozione della password fallita</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File transfer will be cancelled. If it's in progress it will be stoppped." xml:space="preserve">
<source>File transfer will be cancelled. If it's in progress it will be stoppped.</source>
<target>Il trasferimento di file verrà annullato. Se è in corso, verrà interrotto.</target>
<trans-unit id="Fast and no wait until the sender is online!" xml:space="preserve">
<source>Fast and no wait until the sender is online!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be deleted from servers." xml:space="preserve">
<source>File will be deleted from servers.</source>
<target>Il file verrà eliminato dai server.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be received when your contact completes uploading it." xml:space="preserve">
@@ -2220,19 +2271,20 @@
<target>Permette di avere molte connessioni anonime senza dati condivisi tra di loro in un unico profilo di chat.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It can happen when:&#10;1. The messages expire on the server if they were not received for 30 days,&#10;2. The server you use to receive the messages from this contact was updated and restarted.&#10;3. The connection is compromised.&#10;Please connect to the developers via Settings to receive the updates about the servers.&#10;We will be adding server redundancy to prevent lost messages." xml:space="preserve">
<trans-unit id="It can happen when you or your connection used the old database backup." xml:space="preserve">
<source>It can happen when you or your connection used the old database backup.</source>
<target>Può accadere quando tu o il tuo contatto avete usato il backup del database vecchio.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It can happen when:&#10;1. The messages expired in the sending client after 2 days or on the server after 30 days.&#10;2. Message decryption failed, because you or your contact used old database backup.&#10;3. The connection was compromised." xml:space="preserve">
<source>It can happen when:
1. The messages expire on the server if they were not received for 30 days,
2. The server you use to receive the messages from this contact was updated and restarted.
3. The connection is compromised.
Please connect to the developers via Settings to receive the updates about the servers.
We will be adding server redundancy to prevent lost messages.</source>
1. The messages expired in the sending client after 2 days or on the server after 30 days.
2. Message decryption failed, because you or your contact used old database backup.
3. The connection was compromised.</source>
<target>Può accadere quando:
1. I messaggi scadono sul server se non sono stati ricevuti per 30 giorni,
2. Il server usato per ricevere i messaggi da questo contatto è stato aggiornato e riavviato.
3. La connessione è compromessa.
Connettiti agli sviluppatori tramite Impostazioni per ricevere aggiornamenti riguardo i server.
Aggiungeremo la ridondanza del server per prevenire la perdita di messaggi.</target>
1. I messaggi sono scaduti sul client mittente dopo 2 giorni o sul server dopo 30 giorni.
2. La decifrazione del messaggio è fallita, perché tu o il tuo contatto avete usato un backup del database vecchio.
3. La connessione è stata compromessa.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It seems like you are already connected via this link. If it is not the case, there was an error (%@)." xml:space="preserve">
@@ -2674,6 +2726,11 @@ Aggiungeremo la ridondanza del server per prevenire la perdita di messaggi.</tar
<target>Solo tu puoi eliminare irreversibilmente i messaggi (il tuo contatto può contrassegnarli per l'eliminazione).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can make calls." xml:space="preserve">
<source>Only you can make calls.</source>
<target>Solo tu puoi effettuare chiamate.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can send disappearing messages." xml:space="preserve">
<source>Only you can send disappearing messages.</source>
<target>Solo tu puoi inviare messaggi a tempo.</target>
@@ -2689,6 +2746,11 @@ Aggiungeremo la ridondanza del server per prevenire la perdita di messaggi.</tar
<target>Solo il tuo contatto può eliminare irreversibilmente i messaggi (tu puoi contrassegnarli per l'eliminazione).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can make calls." xml:space="preserve">
<source>Only your contact can make calls.</source>
<target>Solo il tuo contatto può effettuare chiamate.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can send disappearing messages." xml:space="preserve">
<source>Only your contact can send disappearing messages.</source>
<target>Solo il tuo contatto può inviare messaggi a tempo.</target>
@@ -2799,6 +2861,11 @@ Aggiungeremo la ridondanza del server per prevenire la perdita di messaggi.</tar
<target>Periodicamente</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Permanent decryption error" xml:space="preserve">
<source>Permanent decryption error</source>
<target>Errore di decifrazione</target>
<note>message decrypt error item</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable sending voice messages." xml:space="preserve">
<source>Please ask your contact to enable sending voice messages.</source>
<target>Chiedi al tuo contatto di attivare l'invio dei messaggi vocali.</target>
@@ -2839,6 +2906,11 @@ Aggiungeremo la ridondanza del server per prevenire la perdita di messaggi.</tar
<target>Ricordalo o conservalo in modo sicuro: non c'è modo di recuperare un codice di accesso perso!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please report it to the developers." xml:space="preserve">
<source>Please report it to the developers.</source>
<target>Si prega di segnalarlo agli sviluppatori.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please restart the app and migrate the database to enable push notifications." xml:space="preserve">
<source>Please restart the app and migrate the database to enable push notifications.</source>
<target>Riavvia l'app ed esegui la migrazione del database per attivare le notifiche push.</target>
@@ -2854,6 +2926,10 @@ Aggiungeremo la ridondanza del server per prevenire la perdita di messaggi.</tar
<target>Conserva la password in modo sicuro, NON potrai cambiarla se la perdi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
<source>Possibly, certificate fingerprint in server address is incorrect</source>
<target>Probabilmente l'impronta del certificato nell'indirizzo del server è sbagliata</target>
@@ -2904,6 +2980,11 @@ Aggiungeremo la ridondanza del server per prevenire la perdita di messaggi.</tar
<target>Password del profilo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit audio/video calls." xml:space="preserve">
<source>Prohibit audio/video calls.</source>
<target>Proibisci le chiamate audio/video.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit irreversible message deletion." xml:space="preserve">
<source>Prohibit irreversible message deletion.</source>
<target>Proibisci l'eliminazione irreversibile dei messaggi.</target>
@@ -2969,6 +3050,11 @@ Aggiungeremo la ridondanza del server per prevenire la perdita di messaggi.</tar
<target>Evento file ricevuto</target>
<note>notification</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>La ricezione del file verrà interrotta.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving via" xml:space="preserve">
<source>Receiving via</source>
<target>Ricezione via</target>
@@ -3094,6 +3180,21 @@ Aggiungeremo la ridondanza del server per prevenire la perdita di messaggi.</tar
<target>Annulla</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<target>Revoca</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Revoke file" xml:space="preserve">
<source>Revoke file</source>
<target>Revoca file</target>
<note>cancel file action</note>
</trans-unit>
<trans-unit id="Revoke file?" xml:space="preserve">
<source>Revoke file?</source>
<target>Revocare il file?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Role" xml:space="preserve">
<source>Role</source>
<target>Ruolo</target>
@@ -3269,11 +3370,6 @@ Aggiungeremo la ridondanza del server per prevenire la perdita di messaggi.</tar
<target>Inviali dalla galleria o dalle tastiere personalizzate.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send videos and files via XFTP" xml:space="preserve">
<source>Send videos and files via XFTP</source>
<target>Invia file tramite XFTP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
<source>Sender cancelled file transfer.</source>
<target>Il mittente ha annullato il trasferimento del file.</target>
@@ -3284,6 +3380,11 @@ Aggiungeremo la ridondanza del server per prevenire la perdita di messaggi.</tar
<target>Il mittente potrebbe aver eliminato la richiesta di connessione.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending file will be stopped." xml:space="preserve">
<source>Sending file will be stopped.</source>
<target>L'invio del file verrà interrotto.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending via" xml:space="preserve">
<source>Sending via</source>
<target>Invio tramite</target>
@@ -3334,6 +3435,10 @@ Aggiungeremo la ridondanza del server per prevenire la perdita di messaggi.</tar
<target>Imposta le preferenze del gruppo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set it instead of system authentication." xml:space="preserve">
<source>Set it instead of system authentication.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set passphrase to export" xml:space="preserve">
<source>Set passphrase to export</source>
<target>Imposta la password per esportare</target>
@@ -3504,6 +3609,21 @@ Aggiungeremo la ridondanza del server per prevenire la perdita di messaggi.</tar
<target>Fermare la chat?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop file" xml:space="preserve">
<source>Stop file</source>
<target>Ferma file</target>
<note>cancel file action</note>
</trans-unit>
<trans-unit id="Stop receiving file?" xml:space="preserve">
<source>Stop receiving file?</source>
<target>Fermare la ricezione del file?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop sending file?" xml:space="preserve">
<source>Stop sending file?</source>
<target>Fermare l'invio del file?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
<source>Submit</source>
<target>Invia</target>
@@ -3614,6 +3734,13 @@ Aggiungeremo la ridondanza del server per prevenire la perdita di messaggi.</tar
<target>La prima piattaforma senza alcun identificatore utente privata by design.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The ID of the next message is incorrect (less or equal to the previous).&#10;It can happen because of some bug or when the connection is compromised." xml:space="preserve">
<source>The ID of the next message is incorrect (less or equal to the previous).
It can happen because of some bug or when the connection is compromised.</source>
<target>L'ID del messaggio successivo non è corretto (inferiore o uguale al precedente).
Può accadere a causa di qualche bug o quando la connessione è compromessa.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app can notify you when you receive messages or contact requests - please open settings to enable." xml:space="preserve">
<source>The app can notify you when you receive messages or contact requests - please open settings to enable.</source>
<target>L'app può avvisarti quando ricevi messaggi o richieste di contatto: apri le impostazioni per attivare.</target>
@@ -3644,6 +3771,11 @@ Aggiungeremo la ridondanza del server per prevenire la perdita di messaggi.</tar
<target>Il gruppo è completamente decentralizzato: è visibile solo ai membri.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
<source>The hash of the previous message is different.</source>
<target>L'hash del messaggio precedente è diverso.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The message will be deleted for all members." xml:space="preserve">
<source>The message will be deleted for all members.</source>
<target>Il messaggio verrà eliminato per tutti i membri.</target>
@@ -3709,6 +3841,11 @@ Aggiungeremo la ridondanza del server per prevenire la perdita di messaggi.</tar
<target>Questa azione non può essere annullata: il tuo profilo, i contatti, i messaggi e i file andranno persi in modo irreversibile.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This error is permanent for this connection, please re-connect." xml:space="preserve">
<source>This error is permanent for this connection, please re-connect.</source>
<target>L'errore è permanente per questa connessione, riconnettiti.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member)." xml:space="preserve">
<source>This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member).</source>
<target>Questa funzionalità è sperimentale! Funzionerà solo se l'altro client ha la versione 4.2 installata. Dovresti vedere il messaggio nella conversazione una volta completato il cambio di indirizzo. Controlla di potere ancora ricevere messaggi da questo contatto (o membro del gruppo).</target>
@@ -4003,6 +4140,10 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
<target>Il video verrà ricevuto quando il tuo contatto sarà in linea, attendi o controlla più tardi!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Videos and files up to 1gb" xml:space="preserve">
<source>Videos and files up to 1gb</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="View security code" xml:space="preserve">
<source>View security code</source>
<target>Vedi codice di sicurezza</target>
@@ -4960,11 +5101,6 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
<target>v%@ (%@)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="v4.6.1+ is required to receive via XFTP." xml:space="preserve">
<source>v4.6.1+ is required to receive via XFTP.</source>
<target>v4.6.1+ necessaria per ricevere via XFTP.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="via contact address link" xml:space="preserve">
<source>via contact address link</source>
<target>via link indirizzo del contatto</target>
@@ -12,6 +12,13 @@
</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="&#10;Available in v5.1" xml:space="preserve">
<source>
Available in v5.1</source>
<target>
Beschikbaar in v5.1</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id=" " xml:space="preserve">
<source> </source>
<target> </target>
@@ -192,6 +199,16 @@
<target>%lldw</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages failed to decrypt." xml:space="preserve">
<source>%u messages failed to decrypt.</source>
<target>%u-berichten kunnen niet worden gedecodeerd.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages skipped." xml:space="preserve">
<source>%u messages skipped.</source>
<target>%u berichten zijn overgeslagen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="(" xml:space="preserve">
<source>(</source>
<target>(</target>
@@ -440,6 +457,11 @@
<target>Toestaan</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow calls only if your contact allows them." xml:space="preserve">
<source>Allow calls only if your contact allows them.</source>
<target>Sta oproepen alleen toe als uw contact persoon dit toestaat.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow disappearing messages only if your contact allows it to you." xml:space="preserve">
<source>Allow disappearing messages only if your contact allows it to you.</source>
<target>Sta verdwijnende berichten alleen toe als uw contactpersoon dit toestaat.</target>
@@ -480,6 +502,11 @@
<target>Spraak berichten toestaan?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to call you." xml:space="preserve">
<source>Allow your contacts to call you.</source>
<target>Sta toe dat uw contacten u bellen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to irreversibly delete sent messages." xml:space="preserve">
<source>Allow your contacts to irreversibly delete sent messages.</source>
<target>Laat uw contacten verzonden berichten onomkeerbaar verwijderen.</target>
@@ -520,6 +547,11 @@
<target>App icon</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App passcode" xml:space="preserve">
<source>App passcode</source>
<target>App toegangscode</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>App versie</target>
@@ -550,6 +582,16 @@
<target>Audio en video oproepen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Audio/video calls" xml:space="preserve">
<source>Audio/video calls</source>
<target>Audio/video oproepen</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="Audio/video calls are prohibited." xml:space="preserve">
<source>Audio/video calls are prohibited.</source>
<target>Audio/video gesprekken zijn verboden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Authentication cancelled" xml:space="preserve">
<source>Authentication cancelled</source>
<target>Verificatie geannuleerd</target>
@@ -590,11 +632,26 @@
<target>Terug</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bad message ID" xml:space="preserve">
<source>Bad message ID</source>
<target>Onjuiste bericht ID</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bad message hash" xml:space="preserve">
<source>Bad message hash</source>
<target>Onjuiste bericht hash</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can irreversibly delete sent messages." xml:space="preserve">
<source>Both you and your contact can irreversibly delete sent messages.</source>
<target>Zowel jij als je contactpersoon kunnen verzonden berichten onherroepelijk verwijderen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can make calls." xml:space="preserve">
<source>Both you and your contact can make calls.</source>
<target>Zowel u als uw contact persoon kunnen bellen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can send disappearing messages." xml:space="preserve">
<source>Both you and your contact can send disappearing messages.</source>
<target>Zowel jij als je contactpersoon kunnen verdwijnende berichten sturen.</target>
@@ -638,11 +695,6 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Annuleren</target>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Cancel file transfer?" xml:space="preserve">
<source>Cancel file transfer?</source>
<target>Bestand overdracht annuleren?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
@@ -1128,6 +1180,11 @@
<target>Gedecentraliseerd</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decryption error" xml:space="preserve">
<source>Decryption error</source>
<target>Decryptie fout</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete" xml:space="preserve">
<source>Delete</source>
<target>Verwijderen</target>
@@ -1763,11 +1820,6 @@
<target>Afsluiten zonder opslaan</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Experimental" xml:space="preserve">
<source>Experimental</source>
<target>Experimenteel</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Export database" xml:space="preserve">
<source>Export database</source>
<target>Database exporteren</target>
@@ -1793,9 +1845,14 @@
<target>Kan wachtwoord niet verwijderen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File transfer will be cancelled. If it's in progress it will be stoppped." xml:space="preserve">
<source>File transfer will be cancelled. If it's in progress it will be stoppped.</source>
<target>Bestand overdracht wordt geannuleerd. Als het bezig is, wordt het gestopt.</target>
<trans-unit id="Fast and no wait until the sender is online!" xml:space="preserve">
<source>Fast and no wait until the sender is online!</source>
<target>Snel en niet wachten tot de afzender online is!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be deleted from servers." xml:space="preserve">
<source>File will be deleted from servers.</source>
<target>Het bestand wordt van de servers verwijderd.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be received when your contact completes uploading it." xml:space="preserve">
@@ -2220,19 +2277,20 @@
<target>Het maakt het mogelijk om veel anonieme verbindingen te hebben zonder enige gedeelde gegevens tussen hen in een enkel chat profiel.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It can happen when:&#10;1. The messages expire on the server if they were not received for 30 days,&#10;2. The server you use to receive the messages from this contact was updated and restarted.&#10;3. The connection is compromised.&#10;Please connect to the developers via Settings to receive the updates about the servers.&#10;We will be adding server redundancy to prevent lost messages." xml:space="preserve">
<trans-unit id="It can happen when you or your connection used the old database backup." xml:space="preserve">
<source>It can happen when you or your connection used the old database backup.</source>
<target>Het kan gebeuren wanneer u of uw verbinding de oude databaseback-up gebruikte.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It can happen when:&#10;1. The messages expired in the sending client after 2 days or on the server after 30 days.&#10;2. Message decryption failed, because you or your contact used old database backup.&#10;3. The connection was compromised." xml:space="preserve">
<source>It can happen when:
1. The messages expire on the server if they were not received for 30 days,
2. The server you use to receive the messages from this contact was updated and restarted.
3. The connection is compromised.
Please connect to the developers via Settings to receive the updates about the servers.
We will be adding server redundancy to prevent lost messages.</source>
1. The messages expired in the sending client after 2 days or on the server after 30 days.
2. Message decryption failed, because you or your contact used old database backup.
3. The connection was compromised.</source>
<target>Het kan gebeuren wanneer:
1. De berichten op de server verlopen als ze 30 dagen niet zijn ontvangen.
2. De server die u gebruikt om de berichten van deze contactpersoon te ontvangen, is bijgewerkt en opnieuw opgestart.
3. De verbinding is verbroken.
Maak verbinding met de ontwikkelaars via Instellingen om de updates over de servers te ontvangen.
We zullen serverredundantie toevoegen om verloren berichten te voorkomen.</target>
1. De berichten zijn na 2 dagen verlopen bij de verzendende client of na 30 dagen op de server.
2. Decodering van het bericht is mislukt, omdat u of uw contactpersoon een oude databaseback-up heeft gebruikt.
3. De verbinding is verbroken.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It seems like you are already connected via this link. If it is not the case, there was an error (%@)." xml:space="preserve">
@@ -2674,6 +2732,11 @@ We zullen serverredundantie toevoegen om verloren berichten te voorkomen.</targe
<target>Alleen jij kunt berichten onomkeerbaar verwijderen (je contactpersoon kan ze markeren voor verwijdering).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can make calls." xml:space="preserve">
<source>Only you can make calls.</source>
<target>Alleen jij kunt bellen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can send disappearing messages." xml:space="preserve">
<source>Only you can send disappearing messages.</source>
<target>Alleen jij kunt verdwijnende berichten verzenden.</target>
@@ -2689,6 +2752,11 @@ We zullen serverredundantie toevoegen om verloren berichten te voorkomen.</targe
<target>Alleen uw contactpersoon kan berichten onherroepelijk verwijderen (u kunt ze markeren voor verwijdering).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can make calls." xml:space="preserve">
<source>Only your contact can make calls.</source>
<target>Alleen je contact kan bellen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can send disappearing messages." xml:space="preserve">
<source>Only your contact can send disappearing messages.</source>
<target>Alleen uw contactpersoon kan verdwijnende berichten verzenden.</target>
@@ -2799,6 +2867,11 @@ We zullen serverredundantie toevoegen om verloren berichten te voorkomen.</targe
<target>Periodiek</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Permanent decryption error" xml:space="preserve">
<source>Permanent decryption error</source>
<target>Decryptie fout</target>
<note>message decrypt error item</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable sending voice messages." xml:space="preserve">
<source>Please ask your contact to enable sending voice messages.</source>
<target>Vraag uw contactpersoon om het verzenden van spraak berichten in te schakelen.</target>
@@ -2836,7 +2909,12 @@ We zullen serverredundantie toevoegen om verloren berichten te voorkomen.</targe
</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>Onthoud het of bewaar het veilig - er is geen manier om een verloren toegangscode te herstellen!</target>
<target>Onthoud of bewaar het veilig - er is geen manier om een verloren toegangscode te herstellen!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please report it to the developers." xml:space="preserve">
<source>Please report it to the developers.</source>
<target>Meld het alsjeblieft aan de ontwikkelaars.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please restart the app and migrate the database to enable push notifications." xml:space="preserve">
@@ -2854,6 +2932,11 @@ We zullen serverredundantie toevoegen om verloren berichten te voorkomen.</targe
<target>Bewaar het wachtwoord veilig, u kunt deze NIET wijzigen als u het kwijtraakt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<target>Poolse interface</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
<source>Possibly, certificate fingerprint in server address is incorrect</source>
<target>Mogelijk is de certificaat vingerafdruk in het server adres onjuist</target>
@@ -2904,6 +2987,11 @@ We zullen serverredundantie toevoegen om verloren berichten te voorkomen.</targe
<target>Profiel wachtwoord</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit audio/video calls." xml:space="preserve">
<source>Prohibit audio/video calls.</source>
<target>Audio/video gesprekken verbieden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit irreversible message deletion." xml:space="preserve">
<source>Prohibit irreversible message deletion.</source>
<target>Verbied het onomkeerbaar verwijderen van berichten.</target>
@@ -2969,6 +3057,11 @@ We zullen serverredundantie toevoegen om verloren berichten te voorkomen.</targe
<target>Ontvangen bestandsgebeurtenis</target>
<note>notification</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Het ontvangen van het bestand wordt gestopt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving via" xml:space="preserve">
<source>Receiving via</source>
<target>Ontvang via</target>
@@ -3094,6 +3187,21 @@ We zullen serverredundantie toevoegen om verloren berichten te voorkomen.</targe
<target>Terugdraaien</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<target>Intrekken</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Revoke file" xml:space="preserve">
<source>Revoke file</source>
<target>Bestand intrekken</target>
<note>cancel file action</note>
</trans-unit>
<trans-unit id="Revoke file?" xml:space="preserve">
<source>Revoke file?</source>
<target>Bestand intrekken?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Role" xml:space="preserve">
<source>Role</source>
<target>Rol</target>
@@ -3269,11 +3377,6 @@ We zullen serverredundantie toevoegen om verloren berichten te voorkomen.</targe
<target>Stuur ze vanuit de galerij of aangepaste toetsenborden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send videos and files via XFTP" xml:space="preserve">
<source>Send videos and files via XFTP</source>
<target>Bestanden verzenden via XFTP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
<source>Sender cancelled file transfer.</source>
<target>Afzender heeft bestandsoverdracht geannuleerd.</target>
@@ -3284,6 +3387,11 @@ We zullen serverredundantie toevoegen om verloren berichten te voorkomen.</targe
<target>De afzender heeft mogelijk het verbindingsverzoek verwijderd.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending file will be stopped." xml:space="preserve">
<source>Sending file will be stopped.</source>
<target>Het verzenden van het bestand wordt gestopt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending via" xml:space="preserve">
<source>Sending via</source>
<target>Verzenden via</target>
@@ -3334,6 +3442,11 @@ We zullen serverredundantie toevoegen om verloren berichten te voorkomen.</targe
<target>Groep voorkeuren instellen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set it instead of system authentication." xml:space="preserve">
<source>Set it instead of system authentication.</source>
<target>Stel het in in plaats van systeemverificatie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set passphrase to export" xml:space="preserve">
<source>Set passphrase to export</source>
<target>Wachtwoord instellen om te exporteren</target>
@@ -3504,6 +3617,21 @@ We zullen serverredundantie toevoegen om verloren berichten te voorkomen.</targe
<target>Stop chat?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop file" xml:space="preserve">
<source>Stop file</source>
<target>Bestand stoppen</target>
<note>cancel file action</note>
</trans-unit>
<trans-unit id="Stop receiving file?" xml:space="preserve">
<source>Stop receiving file?</source>
<target>Stopt met het ontvangen van een bestand?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop sending file?" xml:space="preserve">
<source>Stop sending file?</source>
<target>Bestand verzenden stoppen?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
<source>Submit</source>
<target>Indienen</target>
@@ -3614,6 +3742,13 @@ We zullen serverredundantie toevoegen om verloren berichten te voorkomen.</targe
<target>Het eerste platform zonder gebruikers ID's, privé door ontwerp.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The ID of the next message is incorrect (less or equal to the previous).&#10;It can happen because of some bug or when the connection is compromised." xml:space="preserve">
<source>The ID of the next message is incorrect (less or equal to the previous).
It can happen because of some bug or when the connection is compromised.</source>
<target>De ID van het volgende bericht is onjuist (minder of gelijk aan het vorige).
Het kan gebeuren vanwege een bug of wanneer de verbinding is aangetast.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app can notify you when you receive messages or contact requests - please open settings to enable." xml:space="preserve">
<source>The app can notify you when you receive messages or contact requests - please open settings to enable.</source>
<target>De app kan u op de hoogte stellen wanneer u berichten of contact verzoeken ontvangt - open de instellingen om dit in te schakelen.</target>
@@ -3644,6 +3779,11 @@ We zullen serverredundantie toevoegen om verloren berichten te voorkomen.</targe
<target>De groep is volledig gedecentraliseerd het is alleen zichtbaar voor de leden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
<source>The hash of the previous message is different.</source>
<target>De hash van het vorige bericht is anders.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The message will be deleted for all members." xml:space="preserve">
<source>The message will be deleted for all members.</source>
<target>Het bericht wordt verwijderd voor alle leden.</target>
@@ -3709,6 +3849,11 @@ We zullen serverredundantie toevoegen om verloren berichten te voorkomen.</targe
<target>Deze actie kan niet ongedaan worden gemaakt. Uw profiel, contacten, berichten en bestanden gaan onomkeerbaar verloren.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This error is permanent for this connection, please re-connect." xml:space="preserve">
<source>This error is permanent for this connection, please re-connect.</source>
<target>Deze fout is permanent voor deze verbinding, maak opnieuw verbinding.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member)." xml:space="preserve">
<source>This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member).</source>
<target>Deze functie is experimenteel! Het werkt alleen als op de andere client versie 4.2 is geïnstalleerd. U zou het bericht in het gesprek moeten zien zodra de adreswijziging is voltooid. Controleer of u nog steeds berichten van dit contact (of groepslid) kunt ontvangen.</target>
@@ -4003,6 +4148,11 @@ Om verbinding te maken, vraagt u uw contactpersoon om een andere verbinding link
<target>De video wordt ontvangen wanneer uw contact online is, even geduld a.u.b. of kijk later!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Videos and files up to 1gb" xml:space="preserve">
<source>Videos and files up to 1gb</source>
<target>Video's en bestanden tot 1 GB</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="View security code" xml:space="preserve">
<source>View security code</source>
<target>Beveiligingscode bekijken</target>
@@ -4272,7 +4422,7 @@ SimpleX Lock moet ingeschakeld zijn.</target>
</trans-unit>
<trans-unit id="You will join a group this link refers to and connect to its group members." xml:space="preserve">
<source>You will join a group this link refers to and connect to its group members.</source>
<target>U wordt lid van een groep waarnaar deze link verwijst en maakt verbinding met de groepsleden.</target>
<target>U wordt lid van de groep waar deze link naar verwijst en maakt verbinding met de groepsleden.</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">
@@ -4960,11 +5110,6 @@ SimpleX servers kunnen uw profiel niet zien.</target>
<target>v%@ (%@)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="v4.6.1+ is required to receive via XFTP." xml:space="preserve">
<source>v4.6.1+ is required to receive via XFTP.</source>
<target>v4.6.1+ is vereist om te ontvangen via XFTP.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="via contact address link" xml:space="preserve">
<source>via contact address link</source>
<target>via contact adres link</target>
@@ -12,6 +12,13 @@
</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="&#10;Available in v5.1" xml:space="preserve">
<source>
Available in v5.1</source>
<target>
Dostępny w v5.1</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id=" " xml:space="preserve">
<source> </source>
<target> </target>
@@ -192,6 +199,16 @@
<target>%lldt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages failed to decrypt." xml:space="preserve">
<source>%u messages failed to decrypt.</source>
<target>Nie udało się odszyfrować %u wiadomości.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages skipped." xml:space="preserve">
<source>%u messages skipped.</source>
<target>%u pominiętych wiadomości.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="(" xml:space="preserve">
<source>(</source>
<target>(</target>
@@ -440,6 +457,11 @@
<target>Pozwól</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow calls only if your contact allows them." xml:space="preserve">
<source>Allow calls only if your contact allows them.</source>
<target>Zezwalaj na połączenia tylko wtedy, gdy Twój kontakt na to pozwala.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow disappearing messages only if your contact allows it to you." xml:space="preserve">
<source>Allow disappearing messages only if your contact allows it to you.</source>
<target>Zezwól na znikające wiadomości tylko wtedy, gdy Twój kontakt Ci na to pozwoli.</target>
@@ -480,6 +502,11 @@
<target>Zezwolić na wiadomości głosowe?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to call you." xml:space="preserve">
<source>Allow your contacts to call you.</source>
<target>Zezwól swoim kontaktom na połączenia do Ciebie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to irreversibly delete sent messages." xml:space="preserve">
<source>Allow your contacts to irreversibly delete sent messages.</source>
<target>Zezwól swoim kontaktom na nieodwracalne usuwanie wysłanych wiadomości.</target>
@@ -520,6 +547,11 @@
<target>Ikona aplikacji</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App passcode" xml:space="preserve">
<source>App passcode</source>
<target>Pin aplikacji</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>Wersja aplikacji</target>
@@ -550,6 +582,16 @@
<target>Połączenia audio i wideo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Audio/video calls" xml:space="preserve">
<source>Audio/video calls</source>
<target>Połączenia audio/wideo</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="Audio/video calls are prohibited." xml:space="preserve">
<source>Audio/video calls are prohibited.</source>
<target>Połączenia audio/wideo są zabronione.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Authentication cancelled" xml:space="preserve">
<source>Authentication cancelled</source>
<target>Uwierzytelnianie anulowane</target>
@@ -590,11 +632,26 @@
<target>Wstecz</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bad message ID" xml:space="preserve">
<source>Bad message ID</source>
<target>Zły identyfikator wiadomości</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bad message hash" xml:space="preserve">
<source>Bad message hash</source>
<target>Zły hash wiadomości</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can irreversibly delete sent messages." xml:space="preserve">
<source>Both you and your contact can irreversibly delete sent messages.</source>
<target>Zarówno Ty, jak i Twój kontakt możecie nieodwracalnie usunąć wysłane wiadomości.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can make calls." xml:space="preserve">
<source>Both you and your contact can make calls.</source>
<target>Zarówno Ty, jak i Twój kontakt możecie nawiązywać połączenia.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can send disappearing messages." xml:space="preserve">
<source>Both you and your contact can send disappearing messages.</source>
<target>Zarówno Ty, jak i Twój kontakt możecie wysyłać znikające wiadomości.</target>
@@ -638,11 +695,6 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Anuluj</target>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Cancel file transfer?" xml:space="preserve">
<source>Cancel file transfer?</source>
<target>Anulować transfer plików?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
@@ -1128,6 +1180,11 @@
<target>Zdecentralizowane</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decryption error" xml:space="preserve">
<source>Decryption error</source>
<target>Błąd odszyfrowania</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete" xml:space="preserve">
<source>Delete</source>
<target>Usuń</target>
@@ -1763,11 +1820,6 @@
<target>Wyjdź bez zapisywania</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Experimental" xml:space="preserve">
<source>Experimental</source>
<target>Eksperymentalne</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Export database" xml:space="preserve">
<source>Export database</source>
<target>Eksportuj bazę danych</target>
@@ -1793,9 +1845,14 @@
<target>Nie udało się usunąć hasła</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File transfer will be cancelled. If it's in progress it will be stoppped." xml:space="preserve">
<source>File transfer will be cancelled. If it's in progress it will be stoppped.</source>
<target>Transfer plików zostanie anulowany. Jeśli jest w toku, zostanie zatrzymany.</target>
<trans-unit id="Fast and no wait until the sender is online!" xml:space="preserve">
<source>Fast and no wait until the sender is online!</source>
<target>Szybko i bez czekania aż nadawca będzie online!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be deleted from servers." xml:space="preserve">
<source>File will be deleted from servers.</source>
<target>Plik zostanie usunięty z serwerów.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be received when your contact completes uploading it." xml:space="preserve">
@@ -2217,22 +2274,23 @@
</trans-unit>
<trans-unit id="It allows having many anonymous connections without any shared data between them in a single chat profile." xml:space="preserve">
<source>It allows having many anonymous connections without any shared data between them in a single chat profile.</source>
<target>Pozwala na posiadanie wielu anonimowych połączeń bez żadnych wspólnych danych między nimi w jednym profilu czatu.</target>
<target>To pozwala na posiadanie wielu anonimowych połączeń bez żadnych wspólnych danych między nimi w pojedynczym profilu czatu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It can happen when:&#10;1. The messages expire on the server if they were not received for 30 days,&#10;2. The server you use to receive the messages from this contact was updated and restarted.&#10;3. The connection is compromised.&#10;Please connect to the developers via Settings to receive the updates about the servers.&#10;We will be adding server redundancy to prevent lost messages." xml:space="preserve">
<trans-unit id="It can happen when you or your connection used the old database backup." xml:space="preserve">
<source>It can happen when you or your connection used the old database backup.</source>
<target>Może się to zdarzyć, gdy Ty lub Twoje połączenie użyło starej kopii zapasowej bazy danych.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It can happen when:&#10;1. The messages expired in the sending client after 2 days or on the server after 30 days.&#10;2. Message decryption failed, because you or your contact used old database backup.&#10;3. The connection was compromised." xml:space="preserve">
<source>It can happen when:
1. The messages expire on the server if they were not received for 30 days,
2. The server you use to receive the messages from this contact was updated and restarted.
3. The connection is compromised.
Please connect to the developers via Settings to receive the updates about the servers.
We will be adding server redundancy to prevent lost messages.</source>
1. The messages expired in the sending client after 2 days or on the server after 30 days.
2. Message decryption failed, because you or your contact used old database backup.
3. The connection was compromised.</source>
<target>Może to nastąpić, gdy:
1. Wiadomości wygasają na serwerze, jeśli nie zostały odebrane przez 30 dni,
2. Serwer, którego używasz do odbierania wiadomości od tego kontaktu został zaktualizowany i uruchomiony ponownie.
3. Połączenie jest skompromitowane.
Proszę połączyć się z deweloperami przez Ustawienia, aby otrzymać aktualizacje dotyczące serwerów.
Będziemy dodawać redundancję serwerów, aby zapobiec utracie wiadomości.</target>
1. Wiadomości wygasły w wysyłającym kliencie po 2 dniach lub na serwerze po 30 dniach.
2. Odszyfrowanie wiadomości nie powiodło się, ponieważ Ty lub Twój kontakt użyliście starej kopii zapasowej bazy danych.
3. Połączenie zostało skompromitowane.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It seems like you are already connected via this link. If it is not the case, there was an error (%@)." xml:space="preserve">
@@ -2674,6 +2732,11 @@ Będziemy dodawać redundancję serwerów, aby zapobiec utracie wiadomości.</ta
<target>Tylko Ty możesz nieodwracalnie usunąć wiadomości (Twój kontakt może oznaczyć je do usunięcia).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can make calls." xml:space="preserve">
<source>Only you can make calls.</source>
<target>Tylko Ty możesz wykonywać połączenia.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can send disappearing messages." xml:space="preserve">
<source>Only you can send disappearing messages.</source>
<target>Tylko Ty możesz wysyłać znikające wiadomości.</target>
@@ -2689,6 +2752,11 @@ Będziemy dodawać redundancję serwerów, aby zapobiec utracie wiadomości.</ta
<target>Tylko Twój kontakt może nieodwracalnie usunąć wiadomości (możesz oznaczyć je do usunięcia).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can make calls." xml:space="preserve">
<source>Only your contact can make calls.</source>
<target>Tylko Twój kontakt może wykonywać połączenia.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can send disappearing messages." xml:space="preserve">
<source>Only your contact can send disappearing messages.</source>
<target>Tylko Twój kontakt może wysyłać znikające wiadomości.</target>
@@ -2799,6 +2867,11 @@ Będziemy dodawać redundancję serwerów, aby zapobiec utracie wiadomości.</ta
<target>Okresowo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Permanent decryption error" xml:space="preserve">
<source>Permanent decryption error</source>
<target>Błąd odszyfrowania</target>
<note>message decrypt error item</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable sending voice messages." xml:space="preserve">
<source>Please ask your contact to enable sending voice messages.</source>
<target>Poproś Twój kontakt o włączenie wysyłania wiadomości głosowych.</target>
@@ -2839,6 +2912,11 @@ Będziemy dodawać redundancję serwerów, aby zapobiec utracie wiadomości.</ta
<target>Prosimy o jego zapamiętanie lub bezpieczne przechowywanie - nie ma możliwości odzyskania utraconego pinu!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please report it to the developers." xml:space="preserve">
<source>Please report it to the developers.</source>
<target>Prosimy o zgłaszanie tego do deweloperów.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please restart the app and migrate the database to enable push notifications." xml:space="preserve">
<source>Please restart the app and migrate the database to enable push notifications.</source>
<target>Uruchom ponownie aplikację i przeprowadź migrację bazy danych, aby włączyć powiadomienia push.</target>
@@ -2854,6 +2932,11 @@ Będziemy dodawać redundancję serwerów, aby zapobiec utracie wiadomości.</ta
<target>Prosimy o bezpieczne przechowywanie hasła, w przypadku jego utraty NIE będzie można go zmienić.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<target>Polski interfejs</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
<source>Possibly, certificate fingerprint in server address is incorrect</source>
<target>Możliwe, że odcisk palca certyfikatu w adresie serwera jest nieprawidłowy</target>
@@ -2904,6 +2987,11 @@ Będziemy dodawać redundancję serwerów, aby zapobiec utracie wiadomości.</ta
<target>Hasło profilu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit audio/video calls." xml:space="preserve">
<source>Prohibit audio/video calls.</source>
<target>Zabroń połączeń audio/wideo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit irreversible message deletion." xml:space="preserve">
<source>Prohibit irreversible message deletion.</source>
<target>Zabroń nieodwracalnego usuwania wiadomości.</target>
@@ -2969,6 +3057,11 @@ Będziemy dodawać redundancję serwerów, aby zapobiec utracie wiadomości.</ta
<target>Otrzymano zdarzenie pliku</target>
<note>notification</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Odbieranie pliku zostanie przerwane.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving via" xml:space="preserve">
<source>Receiving via</source>
<target>Odbieranie przez</target>
@@ -3094,6 +3187,21 @@ Będziemy dodawać redundancję serwerów, aby zapobiec utracie wiadomości.</ta
<target>Przywrócić</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<target>Odwołaj</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Revoke file" xml:space="preserve">
<source>Revoke file</source>
<target>Odwołaj plik</target>
<note>cancel file action</note>
</trans-unit>
<trans-unit id="Revoke file?" xml:space="preserve">
<source>Revoke file?</source>
<target>Odwołać plik?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Role" xml:space="preserve">
<source>Role</source>
<target>Rola</target>
@@ -3269,11 +3377,6 @@ Będziemy dodawać redundancję serwerów, aby zapobiec utracie wiadomości.</ta
<target>Wyślij je z galerii lub niestandardowych klawiatur.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send videos and files via XFTP" xml:space="preserve">
<source>Send videos and files via XFTP</source>
<target>Wysyłaj filmy i pliki przez XFTP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
<source>Sender cancelled file transfer.</source>
<target>Nadawca anulował transfer pliku.</target>
@@ -3284,6 +3387,11 @@ Będziemy dodawać redundancję serwerów, aby zapobiec utracie wiadomości.</ta
<target>Nadawca mógł usunąć prośbę o połączenie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending file will be stopped." xml:space="preserve">
<source>Sending file will be stopped.</source>
<target>Wysyłanie pliku zostanie przerwane.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending via" xml:space="preserve">
<source>Sending via</source>
<target>Wysyłanie przez</target>
@@ -3334,6 +3442,11 @@ Będziemy dodawać redundancję serwerów, aby zapobiec utracie wiadomości.</ta
<target>Ustaw preferencje grupy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set it instead of system authentication." xml:space="preserve">
<source>Set it instead of system authentication.</source>
<target>Ustaw go zamiast uwierzytelniania systemowego.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set passphrase to export" xml:space="preserve">
<source>Set passphrase to export</source>
<target>Ustaw hasło do eksportu</target>
@@ -3504,6 +3617,21 @@ Będziemy dodawać redundancję serwerów, aby zapobiec utracie wiadomości.</ta
<target>Zatrzymać czat?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop file" xml:space="preserve">
<source>Stop file</source>
<target>Zatrzymaj plik</target>
<note>cancel file action</note>
</trans-unit>
<trans-unit id="Stop receiving file?" xml:space="preserve">
<source>Stop receiving file?</source>
<target>Przestać odbierać plik?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop sending file?" xml:space="preserve">
<source>Stop sending file?</source>
<target>Przestać wysyłać plik?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
<source>Submit</source>
<target>Zatwierdź</target>
@@ -3614,6 +3742,13 @@ Będziemy dodawać redundancję serwerów, aby zapobiec utracie wiadomości.</ta
<target>Pierwsza platforma bez żadnych identyfikatorów użytkowników z założenia prywatna.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The ID of the next message is incorrect (less or equal to the previous).&#10;It can happen because of some bug or when the connection is compromised." xml:space="preserve">
<source>The ID of the next message is incorrect (less or equal to the previous).
It can happen because of some bug or when the connection is compromised.</source>
<target>Identyfikator następnej wiadomości jest nieprawidłowy (mniejszy lub równy poprzedniej).
Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skompromitowane.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app can notify you when you receive messages or contact requests - please open settings to enable." xml:space="preserve">
<source>The app can notify you when you receive messages or contact requests - please open settings to enable.</source>
<target>Aplikacja może powiadamiać Cię, gdy otrzymujesz wiadomości lub prośby o kontakt — otwórz ustawienia, aby włączyć.</target>
@@ -3644,6 +3779,11 @@ Będziemy dodawać redundancję serwerów, aby zapobiec utracie wiadomości.</ta
<target>Grupa jest w pełni zdecentralizowana jest widoczna tylko dla członków.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
<source>The hash of the previous message is different.</source>
<target>Hash poprzedniej wiadomości jest inny.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The message will be deleted for all members." xml:space="preserve">
<source>The message will be deleted for all members.</source>
<target>Wiadomość zostanie usunięta dla wszystkich członków.</target>
@@ -3709,6 +3849,11 @@ Będziemy dodawać redundancję serwerów, aby zapobiec utracie wiadomości.</ta
<target>Tego działania nie można cofnąć - Twój profil, kontakty, wiadomości i pliki zostaną nieodwracalnie utracone.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This error is permanent for this connection, please re-connect." xml:space="preserve">
<source>This error is permanent for this connection, please re-connect.</source>
<target>Ten błąd jest trwały dla tego połączenia, proszę o ponowne połączenie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member)." xml:space="preserve">
<source>This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member).</source>
<target>Ta funkcja jest eksperymentalna! Będzie działać tylko wtedy, gdy drugi klient ma zainstalowaną wersję 4.2. Po zakończeniu zmiany adresu powinieneś zobaczyć wiadomość w konwersacji - sprawdź, czy nadal możesz otrzymywać wiadomości od tego kontaktu (lub członka grupy).</target>
@@ -3880,7 +4025,7 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
</trans-unit>
<trans-unit id="Unread" xml:space="preserve">
<source>Unread</source>
<target>Oznacz jako nieprzeczytane</target>
<target>Nieprzeczytane</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Update" xml:space="preserve">
@@ -4003,6 +4148,11 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
<target>Film zostanie odebrany, gdy kontakt będzie online, poczekaj lub sprawdź później!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Videos and files up to 1gb" xml:space="preserve">
<source>Videos and files up to 1gb</source>
<target>Filmy i pliki do 1gb</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="View security code" xml:space="preserve">
<source>View security code</source>
<target>Pokaż kod bezpieczeństwa</target>
@@ -4960,11 +5110,6 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
<target>v%@ (%@)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="v4.6.1+ is required to receive via XFTP." xml:space="preserve">
<source>v4.6.1+ is required to receive via XFTP.</source>
<target>v4.6.1+ jest wymagany do odbierania przez XFTP.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="via contact address link" xml:space="preserve">
<source>via contact address link</source>
<target>przez link adresu kontaktu</target>
@@ -12,6 +12,13 @@
</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="&#10;Available in v5.1" xml:space="preserve">
<source>
Available in v5.1</source>
<target>
Доступно в v5.1</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id=" " xml:space="preserve">
<source> </source>
<target> </target>
@@ -144,6 +151,7 @@
</trans-unit>
<trans-unit id="%lld minutes" xml:space="preserve">
<source>%lld minutes</source>
<target>%lld минуты</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lld second(s)" xml:space="preserve">
@@ -153,6 +161,7 @@
</trans-unit>
<trans-unit id="%lld seconds" xml:space="preserve">
<source>%lld seconds</source>
<target>%lld секунд</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lldd" xml:space="preserve">
@@ -190,6 +199,16 @@
<target>%lldнед</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages failed to decrypt." xml:space="preserve">
<source>%u messages failed to decrypt.</source>
<target>%u сообщений не могут быть расшифрованы.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages skipped." xml:space="preserve">
<source>%u messages skipped.</source>
<target>%u сообщений пропущено.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="(" xml:space="preserve">
<source>(</source>
<target>(</target>
@@ -438,6 +457,11 @@
<target>Разрешить</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow calls only if your contact allows them." xml:space="preserve">
<source>Allow calls only if your contact allows them.</source>
<target>Разрешить звонки, только если их разрешает Ваш контакт.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow disappearing messages only if your contact allows it to you." xml:space="preserve">
<source>Allow disappearing messages only if your contact allows it to you.</source>
<target>Разрешить исчезающие сообщения, только если Ваш контакт разрешает их Вам.</target>
@@ -478,6 +502,11 @@
<target>Разрешить голосовые сообщения?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to call you." xml:space="preserve">
<source>Allow your contacts to call you.</source>
<target>Разрешить Вашим контактам звонить Вам.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to irreversibly delete sent messages." xml:space="preserve">
<source>Allow your contacts to irreversibly delete sent messages.</source>
<target>Разрешить Вашим контактам необратимо удалять отправленные сообщения.</target>
@@ -518,6 +547,11 @@
<target>Иконка</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App passcode" xml:space="preserve">
<source>App passcode</source>
<target>Код доступа в приложение</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>Версия приложения</target>
@@ -548,8 +582,19 @@
<target>Аудио и видео звонки</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Audio/video calls" xml:space="preserve">
<source>Audio/video calls</source>
<target>Аудио/видео звонки</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="Audio/video calls are prohibited." xml:space="preserve">
<source>Audio/video calls are prohibited.</source>
<target>Аудио/видео звонки запрещены.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Authentication cancelled" xml:space="preserve">
<source>Authentication cancelled</source>
<target>Аутентификация отменена</target>
<note>PIN entry</note>
</trans-unit>
<trans-unit id="Authentication failed" xml:space="preserve">
@@ -587,11 +632,26 @@
<target>Назад</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bad message ID" xml:space="preserve">
<source>Bad message ID</source>
<target>Ошибка ID сообщения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bad message hash" xml:space="preserve">
<source>Bad message hash</source>
<target>Ошибка хэш сообщения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can irreversibly delete sent messages." xml:space="preserve">
<source>Both you and your contact can irreversibly delete sent messages.</source>
<target>Вы и Ваш контакт можете необратимо удалять отправленные сообщения.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can make calls." xml:space="preserve">
<source>Both you and your contact can make calls.</source>
<target>Вы и Ваш контакт можете совершать звонки.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can send disappearing messages." xml:space="preserve">
<source>Both you and your contact can send disappearing messages.</source>
<target>Вы и Ваш контакт можете отправлять исчезающие сообщения.</target>
@@ -635,11 +695,6 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Отменить</target>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Cancel file transfer?" xml:space="preserve">
<source>Cancel file transfer?</source>
<target>Прекратить передачу файла?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
@@ -659,6 +714,7 @@
</trans-unit>
<trans-unit id="Change Passcode" xml:space="preserve">
<source>Change Passcode</source>
<target>Изменить код доступа</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change database passphrase?" xml:space="preserve">
@@ -668,6 +724,7 @@
</trans-unit>
<trans-unit id="Change lock mode" xml:space="preserve">
<source>Change lock mode</source>
<target>Изменить режим блокировки</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Change member role?" xml:space="preserve">
@@ -677,6 +734,7 @@
</trans-unit>
<trans-unit id="Change passcode" xml:space="preserve">
<source>Change passcode</source>
<target>Изменить код доступа</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Change receiving address" xml:space="preserve">
@@ -786,6 +844,7 @@
</trans-unit>
<trans-unit id="Compare file" xml:space="preserve">
<source>Compare file</source>
<target>Сравнение файла</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Compare security codes with your contacts." xml:space="preserve">
@@ -805,6 +864,7 @@
</trans-unit>
<trans-unit id="Confirm Passcode" xml:space="preserve">
<source>Confirm Passcode</source>
<target>Подтвердить Код</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm database upgrades" xml:space="preserve">
@@ -964,6 +1024,7 @@
</trans-unit>
<trans-unit id="Create file" xml:space="preserve">
<source>Create file</source>
<target>Создание файла</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Create group link" xml:space="preserve">
@@ -1003,6 +1064,7 @@
</trans-unit>
<trans-unit id="Current Passcode" xml:space="preserve">
<source>Current Passcode</source>
<target>Текущий Код</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Current passphrase…" xml:space="preserve">
@@ -1118,6 +1180,11 @@
<target>Децентрализованный</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decryption error" xml:space="preserve">
<source>Decryption error</source>
<target>Ошибка расшифровки</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete" xml:space="preserve">
<source>Delete</source>
<target>Удалить</target>
@@ -1190,6 +1257,7 @@
</trans-unit>
<trans-unit id="Delete file" xml:space="preserve">
<source>Delete file</source>
<target>Удалить файл</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Delete files and media?" xml:space="preserve">
@@ -1394,6 +1462,7 @@
</trans-unit>
<trans-unit id="Download file" xml:space="preserve">
<source>Download file</source>
<target>Загрузка файла</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Duplicate display name!" xml:space="preserve">
@@ -1438,6 +1507,7 @@
</trans-unit>
<trans-unit id="Enable lock" xml:space="preserve">
<source>Enable lock</source>
<target>Включить блокировку</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable notifications" xml:space="preserve">
@@ -1497,6 +1567,7 @@
</trans-unit>
<trans-unit id="Enter Passcode" xml:space="preserve">
<source>Enter Passcode</source>
<target>Введите Код</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enter correct passphrase." xml:space="preserve">
@@ -1641,6 +1712,7 @@
</trans-unit>
<trans-unit id="Error loading %@ servers" xml:space="preserve">
<source>Error loading %@ servers</source>
<target>Ошибка загрузки %@ серверов</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error receiving file" xml:space="preserve">
@@ -1670,6 +1742,7 @@
</trans-unit>
<trans-unit id="Error saving passcode" xml:space="preserve">
<source>Error saving passcode</source>
<target>Ошибка сохранения кода</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error saving passphrase to keychain" xml:space="preserve">
@@ -1747,11 +1820,6 @@
<target>Выйти без сохранения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Experimental" xml:space="preserve">
<source>Experimental</source>
<target>Экспериментальные</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Export database" xml:space="preserve">
<source>Export database</source>
<target>Экспорт архива чата</target>
@@ -1777,9 +1845,14 @@
<target>Ошибка удаления пароля</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File transfer will be cancelled. If it's in progress it will be stoppped." xml:space="preserve">
<source>File transfer will be cancelled. If it's in progress it will be stoppped.</source>
<target>Передача файла будет прекращена. Если она в процессе, она будет остановлена.</target>
<trans-unit id="Fast and no wait until the sender is online!" xml:space="preserve">
<source>Fast and no wait until the sender is online!</source>
<target>Быстрые и не нужно ждать, когда отправитель онлайн!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be deleted from servers." xml:space="preserve">
<source>File will be deleted from servers.</source>
<target>Файл будет удалён с серверов.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be received when your contact completes uploading it." xml:space="preserve">
@@ -2049,6 +2122,7 @@
</trans-unit>
<trans-unit id="Immediately" xml:space="preserve">
<source>Immediately</source>
<target>Сразу</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Immune to spam and abuse" xml:space="preserve">
@@ -2123,6 +2197,7 @@
</trans-unit>
<trans-unit id="Incorrect passcode" xml:space="preserve">
<source>Incorrect passcode</source>
<target>Неправильный код</target>
<note>PIN entry</note>
</trans-unit>
<trans-unit id="Incorrect security code!" xml:space="preserve">
@@ -2202,19 +2277,20 @@
<target>Это позволяет иметь много анонимных соединений без общих данных между ними в одном профиле пользователя.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It can happen when:&#10;1. The messages expire on the server if they were not received for 30 days,&#10;2. The server you use to receive the messages from this contact was updated and restarted.&#10;3. The connection is compromised.&#10;Please connect to the developers via Settings to receive the updates about the servers.&#10;We will be adding server redundancy to prevent lost messages." xml:space="preserve">
<trans-unit id="It can happen when you or your connection used the old database backup." xml:space="preserve">
<source>It can happen when you or your connection used the old database backup.</source>
<target>Это может произойти, когда Вы или Ваш контакт используете старую копию базы данных.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It can happen when:&#10;1. The messages expired in the sending client after 2 days or on the server after 30 days.&#10;2. Message decryption failed, because you or your contact used old database backup.&#10;3. The connection was compromised." xml:space="preserve">
<source>It can happen when:
1. The messages expire on the server if they were not received for 30 days,
2. The server you use to receive the messages from this contact was updated and restarted.
3. The connection is compromised.
Please connect to the developers via Settings to receive the updates about the servers.
We will be adding server redundancy to prevent lost messages.</source>
<target>Это может случится, когда:
1. Сервер удалил сообщения, если они не были доставлены в течение 30 дней.
2. Сервер, через который Вы получаете сообщения от контакта, был обновлён и перезапущен.
3. Соединение компроментировано.
Пожалуйста, соединитесь с девелоперами через Настройки, чтобы получать уведомления о серверах.
Мы планируем добавить избыточную доставку сообщений, чтобы не терять сообщения.</target>
1. The messages expired in the sending client after 2 days or on the server after 30 days.
2. Message decryption failed, because you or your contact used old database backup.
3. The connection was compromised.</source>
<target>Это может произойти, когда:
1. Клиент отправителя удалил неотправленные сообщения через 2 дня, или сервер – через 30 дней.
2. Расшифровка сообщения была невозможна, когда Вы или Ваш контакт использовали старую копию базы данных.
3. Соединение компроментировано.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It seems like you are already connected via this link. If it is not the case, there was an error (%@)." xml:space="preserve">
@@ -2249,6 +2325,7 @@ We will be adding server redundancy to prevent lost messages.</source>
</trans-unit>
<trans-unit id="KeyChain error" xml:space="preserve">
<source>KeyChain error</source>
<target>Ошибка KeyChain</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Keychain error" xml:space="preserve">
@@ -2313,10 +2390,12 @@ We will be adding server redundancy to prevent lost messages.</source>
</trans-unit>
<trans-unit id="Lock after" xml:space="preserve">
<source>Lock after</source>
<target>Заблокировать через</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Lock mode" xml:space="preserve">
<source>Lock mode</source>
<target>Режим блокировки</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make a private connection" xml:space="preserve">
@@ -2491,6 +2570,7 @@ We will be adding server redundancy to prevent lost messages.</source>
</trans-unit>
<trans-unit id="New Passcode" xml:space="preserve">
<source>New Passcode</source>
<target>Новый Код</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New contact request" xml:space="preserve">
@@ -2535,6 +2615,7 @@ We will be adding server redundancy to prevent lost messages.</source>
</trans-unit>
<trans-unit id="No app password" xml:space="preserve">
<source>No app password</source>
<target>Нет кода доступа</target>
<note>Authentication unavailable</note>
</trans-unit>
<trans-unit id="No contacts selected" xml:space="preserve">
@@ -2588,6 +2669,7 @@ We will be adding server redundancy to prevent lost messages.</source>
</trans-unit>
<trans-unit id="Off" xml:space="preserve">
<source>Off</source>
<target>Выключено</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Off (Local)" xml:space="preserve">
@@ -2650,6 +2732,11 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>Только Вы можете необратимо удалять сообщения (Ваш контакт может помечать их на удаление).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can make calls." xml:space="preserve">
<source>Only you can make calls.</source>
<target>Только Вы можете совершать звонки.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can send disappearing messages." xml:space="preserve">
<source>Only you can send disappearing messages.</source>
<target>Только Вы можете отправлять исчезающие сообщения.</target>
@@ -2665,6 +2752,11 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>Только Ваш контакт может необратимо удалять сообщения (Вы можете помечать их на удаление).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can make calls." xml:space="preserve">
<source>Only your contact can make calls.</source>
<target>Только Ваш контакт может совершать звонки.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can send disappearing messages." xml:space="preserve">
<source>Only your contact can send disappearing messages.</source>
<target>Только Ваш контакт может отправлять исчезающие сообщения.</target>
@@ -2717,22 +2809,27 @@ We will be adding server redundancy to prevent lost messages.</source>
</trans-unit>
<trans-unit id="Passcode" xml:space="preserve">
<source>Passcode</source>
<target>Код доступа</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Passcode changed!" xml:space="preserve">
<source>Passcode changed!</source>
<target>Код доступа изменён!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Passcode entry" xml:space="preserve">
<source>Passcode entry</source>
<target>Ввод кода доступа</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Passcode not changed!" xml:space="preserve">
<source>Passcode not changed!</source>
<target>Код доступа не изменён!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Passcode set!" xml:space="preserve">
<source>Passcode set!</source>
<target>Код доступа установлен!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Password to show" xml:space="preserve">
@@ -2770,6 +2867,11 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>Периодически</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Permanent decryption error" xml:space="preserve">
<source>Permanent decryption error</source>
<target>Ошибка расшифровки</target>
<note>message decrypt error item</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable sending voice messages." xml:space="preserve">
<source>Please ask your contact to enable sending voice messages.</source>
<target>Попросите у Вашего контакта разрешить отправку голосовых сообщений.</target>
@@ -2807,6 +2909,12 @@ We will be adding server redundancy to prevent lost messages.</source>
</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>Пожалуйста, запомните или сохраните его - восстановить потерянный пароль невозможно!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please report it to the developers." xml:space="preserve">
<source>Please report it to the developers.</source>
<target>Пожалуйста, сообщите об этой ошибке девелоперам.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please restart the app and migrate the database to enable push notifications." xml:space="preserve">
@@ -2824,6 +2932,11 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>Пожалуйста, надежно сохраните пароль, Вы НЕ сможете его поменять, если потеряете.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<target>Польский интерфейс</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
<source>Possibly, certificate fingerprint in server address is incorrect</source>
<target>Возможно, хэш сертификата в адресе сервера неверный</target>
@@ -2874,6 +2987,11 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>Пароль профиля</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit audio/video calls." xml:space="preserve">
<source>Prohibit audio/video calls.</source>
<target>Запретить аудио/видео звонки.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit irreversible message deletion." xml:space="preserve">
<source>Prohibit irreversible message deletion.</source>
<target>Запретить необратимое удаление сообщений.</target>
@@ -2939,6 +3057,11 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>Загрузка файла</target>
<note>notification</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Приём файла будет прекращён.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving via" xml:space="preserve">
<source>Receiving via</source>
<target>Получение через</target>
@@ -3064,6 +3187,21 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>Отменить изменения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<target>Отозвать</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Revoke file" xml:space="preserve">
<source>Revoke file</source>
<target>Отозвать файл</target>
<note>cancel file action</note>
</trans-unit>
<trans-unit id="Revoke file?" xml:space="preserve">
<source>Revoke file?</source>
<target>Отозвать файл?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Role" xml:space="preserve">
<source>Role</source>
<target>Роль</target>
@@ -3239,11 +3377,6 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>Отправьте из галереи или из дополнительных клавиатур.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send videos and files via XFTP" xml:space="preserve">
<source>Send videos and files via XFTP</source>
<target>Отправлять видео и файлы через XFTP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
<source>Sender cancelled file transfer.</source>
<target>Отправитель отменил передачу файла.</target>
@@ -3254,6 +3387,11 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>Отправитель мог удалить запрос на соединение.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending file will be stopped." xml:space="preserve">
<source>Sending file will be stopped.</source>
<target>Отправка файла будет остановлена.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending via" xml:space="preserve">
<source>Sending via</source>
<target>Отправка через</target>
@@ -3276,6 +3414,7 @@ We will be adding server redundancy to prevent lost messages.</source>
</trans-unit>
<trans-unit id="Server requires authorization to upload, check password" xml:space="preserve">
<source>Server requires authorization to upload, check password</source>
<target>Сервер требует авторизации для загрузки, проверьте пароль</target>
<note>server test error</note>
</trans-unit>
<trans-unit id="Server test failed!" xml:space="preserve">
@@ -3303,6 +3442,11 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>Предпочтения группы</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set it instead of system authentication." xml:space="preserve">
<source>Set it instead of system authentication.</source>
<target>Установите код вместо системной аутентификации.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set passphrase to export" xml:space="preserve">
<source>Set passphrase to export</source>
<target>Установите пароль</target>
@@ -3380,10 +3524,12 @@ We will be adding server redundancy to prevent lost messages.</source>
</trans-unit>
<trans-unit id="SimpleX Lock mode" xml:space="preserve">
<source>SimpleX Lock mode</source>
<target>Режим Блокировки SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Lock not enabled!" xml:space="preserve">
<source>SimpleX Lock not enabled!</source>
<target>Блокировка SimpleX не включена!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Lock turned on" xml:space="preserve">
@@ -3471,8 +3617,24 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>Остановить чат?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop file" xml:space="preserve">
<source>Stop file</source>
<target>Остановить файл</target>
<note>cancel file action</note>
</trans-unit>
<trans-unit id="Stop receiving file?" xml:space="preserve">
<source>Stop receiving file?</source>
<target>Остановить приём файла?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop sending file?" xml:space="preserve">
<source>Stop sending file?</source>
<target>Остановить отправку файла?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
<source>Submit</source>
<target>Продолжить</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Support SimpleX Chat" xml:space="preserve">
@@ -3487,6 +3649,7 @@ We will be adding server redundancy to prevent lost messages.</source>
</trans-unit>
<trans-unit id="System authentication" xml:space="preserve">
<source>System authentication</source>
<target>Системная аутентификация</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="TCP connection timeout" xml:space="preserve">
@@ -3579,6 +3742,13 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>Первая в мире платформа без идентификаторов пользователей.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The ID of the next message is incorrect (less or equal to the previous).&#10;It can happen because of some bug or when the connection is compromised." xml:space="preserve">
<source>The ID of the next message is incorrect (less or equal to the previous).
It can happen because of some bug or when the connection is compromised.</source>
<target>Неправильный ID предыдущего сообщения (меньше или равен предыдущему).
Это может произойти из-за ошибки программы, или когда соединение компроментировано.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app can notify you when you receive messages or contact requests - please open settings to enable." xml:space="preserve">
<source>The app can notify you when you receive messages or contact requests - please open settings to enable.</source>
<target>Приложение может посылать Вам уведомления о сообщениях и запросах на соединение - уведомления можно включить в Настройках.</target>
@@ -3609,6 +3779,11 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>Группа полностью децентрализована — она видна только членам.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
<source>The hash of the previous message is different.</source>
<target>Хэш предыдущего сообщения отличается.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The message will be deleted for all members." xml:space="preserve">
<source>The message will be deleted for all members.</source>
<target>Сообщение будет удалено для всех членов группы.</target>
@@ -3674,6 +3849,11 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>Это действие нельзя отменить — Ваш профиль, контакты, сообщения и файлы будут безвозвратно утеряны.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This error is permanent for this connection, please re-connect." xml:space="preserve">
<source>This error is permanent for this connection, please re-connect.</source>
<target>Эта ошибка постоянная для этого соединения, пожалуйста, соединитесь снова.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member)." xml:space="preserve">
<source>This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member).</source>
<target>Это экспериментальная функция! Она будет работать, только если на другом клиенте установлена версия 4.2. После завершения смены адреса Вы увидите сообщение — убедитесь, что Вы все еще можете получать сообщения от этого контакта (или члена группы).</target>
@@ -3835,6 +4015,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Unlock app" xml:space="preserve">
<source>Unlock app</source>
<target>Разблокировать</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Unmute" xml:space="preserve">
@@ -3889,6 +4070,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Upload file" xml:space="preserve">
<source>Upload file</source>
<target>Загрузка файла</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Use .onion hosts" xml:space="preserve">
@@ -3958,10 +4140,17 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Video will be received when your contact completes uploading it." xml:space="preserve">
<source>Video will be received when your contact completes uploading it.</source>
<target>Видео будет получено когда Ваш контакт загрузит его.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Video will be received when your contact is online, please wait or check later!" xml:space="preserve">
<source>Video will be received when your contact is online, please wait or check later!</source>
<target>Видео будет получено, когда Ваш контакт будет онлайн, пожалуйста, подождите или проверьте позже!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Videos and files up to 1gb" xml:space="preserve">
<source>Videos and files up to 1gb</source>
<target>Видео и файлы до 1гб</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="View security code" xml:space="preserve">
@@ -4006,6 +4195,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Waiting for video" xml:space="preserve">
<source>Waiting for video</source>
<target>Ожидание видео</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
@@ -4142,6 +4332,7 @@ SimpleX Lock must be enabled.</source>
</trans-unit>
<trans-unit id="You can turn on SimpleX Lock via Settings." xml:space="preserve">
<source>You can turn on SimpleX Lock via Settings.</source>
<target>Вы можете включить Блокировку SimpleX через Настройки.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can use markdown to format messages:" xml:space="preserve">
@@ -4919,11 +5110,6 @@ SimpleX серверы не могут получить доступ к Ваше
<target>v%@ (%@)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="v4.6.1+ is required to receive via XFTP." xml:space="preserve">
<source>v4.6.1+ is required to receive via XFTP.</source>
<target>v4.6.1+ необходима для приема файлов через XFTP.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="via contact address link" xml:space="preserve">
<source>via contact address link</source>
<target>через ссылку-контакт</target>
@@ -12,6 +12,11 @@
</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="&#10;Available in v5.1" xml:space="preserve">
<source>
Available in v5.1</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id=" " xml:space="preserve">
<source> </source>
<target> </target>
@@ -192,6 +197,14 @@
<target>%lldw</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages failed to decrypt." xml:space="preserve">
<source>%u messages failed to decrypt.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages skipped." xml:space="preserve">
<source>%u messages skipped.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="(" xml:space="preserve">
<source>(</source>
<target>(</target>
@@ -440,6 +453,10 @@
<target>允许</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow calls only if your contact allows them." xml:space="preserve">
<source>Allow calls only if your contact allows them.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow disappearing messages only if your contact allows it to you." xml:space="preserve">
<source>Allow disappearing messages only if your contact allows it to you.</source>
<target>仅当您的联系人允许时才允许限时消息。</target>
@@ -480,6 +497,10 @@
<target>允许语音消息?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to call you." xml:space="preserve">
<source>Allow your contacts to call you.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to irreversibly delete sent messages." xml:space="preserve">
<source>Allow your contacts to irreversibly delete sent messages.</source>
<target>允许您的联系人不可撤回地删除已发送消息。</target>
@@ -520,6 +541,10 @@
<target>应用程序图标</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App passcode" xml:space="preserve">
<source>App passcode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>应用程序版本</target>
@@ -550,6 +575,14 @@
<target>音视频通话</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Audio/video calls" xml:space="preserve">
<source>Audio/video calls</source>
<note>chat feature</note>
</trans-unit>
<trans-unit id="Audio/video calls are prohibited." xml:space="preserve">
<source>Audio/video calls are prohibited.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Authentication cancelled" xml:space="preserve">
<source>Authentication cancelled</source>
<target>身份验证已取消</target>
@@ -557,7 +590,7 @@
</trans-unit>
<trans-unit id="Authentication failed" xml:space="preserve">
<source>Authentication failed</source>
<target>身份证失败</target>
<target>身份证失败</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Authentication is required before the call is connected, but you may miss calls." xml:space="preserve">
@@ -567,7 +600,7 @@
</trans-unit>
<trans-unit id="Authentication unavailable" xml:space="preserve">
<source>Authentication unavailable</source>
<target>身份证不可用</target>
<target>身份证不可用</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept contact requests" xml:space="preserve">
@@ -590,11 +623,25 @@
<target>返回</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bad message ID" xml:space="preserve">
<source>Bad message ID</source>
<target>错误消息 ID</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bad message hash" xml:space="preserve">
<source>Bad message hash</source>
<target>错误消息散列</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can irreversibly delete sent messages." xml:space="preserve">
<source>Both you and your contact can irreversibly delete sent messages.</source>
<target>您和您的联系人都可以不可逆转地删除已发送的消息。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can make calls." xml:space="preserve">
<source>Both you and your contact can make calls.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can send disappearing messages." xml:space="preserve">
<source>Both you and your contact can send disappearing messages.</source>
<target>您和您的联系人都可以发送限时消息。</target>
@@ -638,11 +685,6 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>取消</target>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Cancel file transfer?" xml:space="preserve">
<source>Cancel file transfer?</source>
<target>取消文件传输?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
@@ -1128,6 +1170,11 @@
<target>分散式</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decryption error" xml:space="preserve">
<source>Decryption error</source>
<target>解密错误</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete" xml:space="preserve">
<source>Delete</source>
<target>删除</target>
@@ -1325,12 +1372,12 @@
</trans-unit>
<trans-unit id="Device authentication is disabled. Turning off SimpleX Lock." xml:space="preserve">
<source>Device authentication is disabled. Turning off SimpleX Lock.</source>
<target>设备证被禁用。关闭 SimpleX 锁定。</target>
<target>设备证被禁用。关闭 SimpleX 锁定。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Device authentication is not enabled. You can turn on SimpleX Lock via Settings, once you enable device authentication." xml:space="preserve">
<source>Device authentication is not enabled. You can turn on SimpleX Lock via Settings, once you enable device authentication.</source>
<target>没有启用设备证。一旦启用设备证,您可以通过设置打开 SimpleX 锁定。</target>
<target>没有启用设备证。一旦启用设备证,您可以通过设置打开 SimpleX 锁定。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Different names, avatars and transport isolation." xml:space="preserve">
@@ -1763,11 +1810,6 @@
<target>退出而不保存</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Experimental" xml:space="preserve">
<source>Experimental</source>
<target>实验性</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Export database" xml:space="preserve">
<source>Export database</source>
<target>导出数据库</target>
@@ -1793,9 +1835,12 @@
<target>移除密码失败</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File transfer will be cancelled. If it's in progress it will be stoppped." xml:space="preserve">
<source>File transfer will be cancelled. If it's in progress it will be stoppped.</source>
<target>文件传输将被取消。文件传输将被终止如果它正在进行中。</target>
<trans-unit id="Fast and no wait until the sender is online!" xml:space="preserve">
<source>Fast and no wait until the sender is online!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be deleted from servers." xml:space="preserve">
<source>File will be deleted from servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be received when your contact completes uploading it." xml:space="preserve">
@@ -2220,19 +2265,20 @@
<target>它允许在一个聊天资料中有多个匿名连接,而它们之间没有任何共享数据。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It can happen when:&#10;1. The messages expire on the server if they were not received for 30 days,&#10;2. The server you use to receive the messages from this contact was updated and restarted.&#10;3. The connection is compromised.&#10;Please connect to the developers via Settings to receive the updates about the servers.&#10;We will be adding server redundancy to prevent lost messages." xml:space="preserve">
<trans-unit id="It can happen when you or your connection used the old database backup." xml:space="preserve">
<source>It can happen when you or your connection used the old database backup.</source>
<target>当您或您的连接使用旧数据库备份时,可能会发生这种情况。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It can happen when:&#10;1. The messages expired in the sending client after 2 days or on the server after 30 days.&#10;2. Message decryption failed, because you or your contact used old database backup.&#10;3. The connection was compromised." xml:space="preserve">
<source>It can happen when:
1. The messages expire on the server if they were not received for 30 days,
2. The server you use to receive the messages from this contact was updated and restarted.
3. The connection is compromised.
Please connect to the developers via Settings to receive the updates about the servers.
We will be adding server redundancy to prevent lost messages.</source>
<target>它可以在以下情况下发生:
1. 如果消息在30天内没有被收到,就会在服务器上过期。
2. 您用于接收来自此联系人的消息的服务器已更新并重新启动。
3. 连接受损。
请通过设置与开发者联系,以接收有关服务器的更新。
我们将添加服务器冗余以防止丢失消息。</target>
1. The messages expired in the sending client after 2 days or on the server after 30 days.
2. Message decryption failed, because you or your contact used old database backup.
3. The connection was compromised.</source>
<target>它可能在以下情况发生:
1. 消息在发送客户端 2 天后或在服务器上 30 天后过期。
2. 消息解密失败,因为您或您的联系人使用了旧的数据库备份。
3.连接被破坏。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It seems like you are already connected via this link. If it is not the case, there was an error (%@)." xml:space="preserve">
@@ -2674,6 +2720,10 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>只有您可以不可撤回地删除消息(您的联系人可以将它们标记为删除)。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can make calls." xml:space="preserve">
<source>Only you can make calls.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can send disappearing messages." xml:space="preserve">
<source>Only you can send disappearing messages.</source>
<target>只有您可以发送限时消息。</target>
@@ -2689,6 +2739,10 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>只有您的联系人才能不可撤回地删除消息(您可以将它们标记为删除)。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can make calls." xml:space="preserve">
<source>Only your contact can make calls.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can send disappearing messages." xml:space="preserve">
<source>Only your contact can send disappearing messages.</source>
<target>只有您的联系人才可以发送限时消息。</target>
@@ -2799,6 +2853,11 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>定期</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Permanent decryption error" xml:space="preserve">
<source>Permanent decryption error</source>
<target>解密错误</target>
<note>message decrypt error item</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable sending voice messages." xml:space="preserve">
<source>Please ask your contact to enable sending voice messages.</source>
<target>请让您的联系人启用发送语音消息。</target>
@@ -2839,6 +2898,11 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>请牢记或妥善保管——丢失的密码将无法恢复!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please report it to the developers." xml:space="preserve">
<source>Please report it to the developers.</source>
<target>请向开发者报告。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please restart the app and migrate the database to enable push notifications." xml:space="preserve">
<source>Please restart the app and migrate the database to enable push notifications.</source>
<target>请重新启动应用程序并迁移数据库以启用推送通知。</target>
@@ -2854,6 +2918,10 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>请安全地保存密码,如果您丢失了密码,您将无法更改它。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
<source>Possibly, certificate fingerprint in server address is incorrect</source>
<target>服务器地址中的证书指纹可能不正确</target>
@@ -2904,6 +2972,10 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>个人资料密码</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit audio/video calls." xml:space="preserve">
<source>Prohibit audio/video calls.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit irreversible message deletion." xml:space="preserve">
<source>Prohibit irreversible message deletion.</source>
<target>禁止不可撤回消息删除。</target>
@@ -2969,6 +3041,10 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>收到文件项目</target>
<note>notification</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving via" xml:space="preserve">
<source>Receiving via</source>
<target>接收通过</target>
@@ -3094,6 +3170,18 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>恢复</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Revoke file" xml:space="preserve">
<source>Revoke file</source>
<note>cancel file action</note>
</trans-unit>
<trans-unit id="Revoke file?" xml:space="preserve">
<source>Revoke file?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Role" xml:space="preserve">
<source>Role</source>
<target>角色</target>
@@ -3269,11 +3357,6 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>发送它们来自图库或自定义键盘。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send videos and files via XFTP" xml:space="preserve">
<source>Send videos and files via XFTP</source>
<target>通过 XFTP 发送文件</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
<source>Sender cancelled file transfer.</source>
<target>发送人已取消文件传输。</target>
@@ -3284,6 +3367,10 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>发送人可能已删除连接请求。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending file will be stopped." xml:space="preserve">
<source>Sending file will be stopped.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending via" xml:space="preserve">
<source>Sending via</source>
<target>发送通过</target>
@@ -3334,6 +3421,10 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>设置群组偏好设置</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set it instead of system authentication." xml:space="preserve">
<source>Set it instead of system authentication.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set passphrase to export" xml:space="preserve">
<source>Set passphrase to export</source>
<target>设置密码来导出</target>
@@ -3504,6 +3595,18 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>停止聊天程序?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop file" xml:space="preserve">
<source>Stop file</source>
<note>cancel file action</note>
</trans-unit>
<trans-unit id="Stop receiving file?" xml:space="preserve">
<source>Stop receiving file?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop sending file?" xml:space="preserve">
<source>Stop sending file?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
<source>Submit</source>
<target>提交</target>
@@ -3521,7 +3624,7 @@ We will be adding server redundancy to prevent lost messages.</source>
</trans-unit>
<trans-unit id="System authentication" xml:space="preserve">
<source>System authentication</source>
<target>系统证</target>
<target>系统证</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="TCP connection timeout" xml:space="preserve">
@@ -3614,6 +3717,13 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>第一个没有任何用户标识符的平台 - 隐私设计.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The ID of the next message is incorrect (less or equal to the previous).&#10;It can happen because of some bug or when the connection is compromised." xml:space="preserve">
<source>The ID of the next message is incorrect (less or equal to the previous).
It can happen because of some bug or when the connection is compromised.</source>
<target>下一条消息的 ID 不正确(小于或等于上一条)。
它可能是由于某些错误或连接被破坏才发生。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app can notify you when you receive messages or contact requests - please open settings to enable." xml:space="preserve">
<source>The app can notify you when you receive messages or contact requests - please open settings to enable.</source>
<target>该应用可以在您收到消息或联系人请求时通知您——请打开设置以启用通知。</target>
@@ -3644,6 +3754,11 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>该小组是完全分散式的——它只对成员可见。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
<source>The hash of the previous message is different.</source>
<target>上一条消息的散列不同。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The message will be deleted for all members." xml:space="preserve">
<source>The message will be deleted for all members.</source>
<target>将为所有成员删除该消息。</target>
@@ -3709,6 +3824,11 @@ We will be adding server redundancy to prevent lost messages.</source>
<target>此操作无法撤消——您的个人资料、联系人、消息和文件将不可撤回地丢失。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This error is permanent for this connection, please re-connect." xml:space="preserve">
<source>This error is permanent for this connection, please re-connect.</source>
<target>此错误对于此连接是永久性的,请重新连接。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member)." xml:space="preserve">
<source>This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member).</source>
<target>此功能是实验性的! 它仅在其他客户端安装了 4.2 版时才有效。 地址更改完成后,您应该会在对话中看到该消息——请检查您是否仍能收到来自该联系人(或群组成员)的消息。</target>
@@ -4003,6 +4123,10 @@ To connect, please ask your contact to create another connection link and check
<target>视频将在您的联系人在线时收到,请稍等或稍后查看!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Videos and files up to 1gb" xml:space="preserve">
<source>Videos and files up to 1gb</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="View security code" xml:space="preserve">
<source>View security code</source>
<target>查看安全码</target>
@@ -4960,11 +5084,6 @@ SimpleX 服务器无法看到您的资料。</target>
<target>v%@ (%@)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="v4.6.1+ is required to receive via XFTP." xml:space="preserve">
<source>v4.6.1+ is required to receive via XFTP.</source>
<target>通过 XFTP 接收需要 v4.6.1 以上版本。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="via contact address link" xml:space="preserve">
<source>via contact address link</source>
<target>通过联系地址链接</target>
@@ -273,25 +273,29 @@ func receivedMsgNtf(_ res: ChatResponse) async -> (String, NSENotification)? {
}
if case .image = cItem.content.msgContent {
if let file = cItem.file,
file.fileProtocol == .smp,
file.fileSize <= MAX_IMAGE_SIZE_AUTO_RCV,
privacyAcceptImagesGroupDefault.get() {
cItem = apiReceiveFile(fileId: file.fileId)?.chatItem ?? cItem
}
} else if case .video = cItem.content.msgContent {
if let file = cItem.file,
file.fileProtocol == .smp,
file.fileSize <= MAX_VIDEO_SIZE_AUTO_RCV,
privacyAcceptImagesGroupDefault.get() {
cItem = apiReceiveFile(fileId: file.fileId)?.chatItem ?? cItem
}
} else if case .voice = cItem.content.msgContent { // TODO check inlineFileMode != IFMSent
if let file = cItem.file,
file.fileProtocol == .smp,
file.fileSize <= MAX_IMAGE_SIZE,
file.fileSize > MAX_VOICE_MESSAGE_SIZE_INLINE_SEND,
privacyAcceptImagesGroupDefault.get() {
cItem = apiReceiveFile(fileId: file.fileId)?.chatItem ?? cItem
}
}
return cItem.showMutableNotification ? (aChatItem.chatId, .nse(notification: createMessageReceivedNtf(user, cInfo, cItem))) : nil
let ntf: NSENotification = cInfo.ntfsEnabled ? .nse(notification: createMessageReceivedNtf(user, cInfo, cItem)) : .empty
return cItem.showMutableNotification ? (aChatItem.chatId, ntf) : nil
case let .rcvFileSndCancelled(_, aChatItem, _):
cleanupFile(aChatItem)
return nil
@@ -342,7 +346,7 @@ func apiGetActiveUser() -> User? {
}
func apiStartChat() throws -> Bool {
let r = sendSimpleXCmd(.startChat(subscribe: false, expire: false))
let r = sendSimpleXCmd(.startChat(subscribe: false, expire: false, xftp: false))
switch r {
case .chatStarted: return true
case .chatRunning: return false
+28 -28
View File
@@ -42,7 +42,6 @@
5C3A88D127DF57800060F1C2 /* FramedItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3A88D027DF57800060F1C2 /* FramedItemView.swift */; };
5C3F1D562842B68D00EC8A82 /* IntegrityErrorItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3F1D552842B68D00EC8A82 /* IntegrityErrorItemView.swift */; };
5C3F1D58284363C400EC8A82 /* PrivacySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3F1D57284363C400EC8A82 /* PrivacySettings.swift */; };
5C3F1D5A2844B4DE00EC8A82 /* ExperimentalFeaturesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3F1D592844B4DE00EC8A82 /* ExperimentalFeaturesView.swift */; };
5C4B3B0A285FB130003915F2 /* DatabaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C4B3B09285FB130003915F2 /* DatabaseView.swift */; };
5C5346A827B59A6A004DF848 /* ChatHelp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5346A727B59A6A004DF848 /* ChatHelp.swift */; };
5C55A91F283AD0E400C4E99E /* CallManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C55A91E283AD0E400C4E99E /* CallManager.swift */; };
@@ -116,6 +115,12 @@
5CC1C99527A6CF7F000D9FF6 /* ShareSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC1C99427A6CF7F000D9FF6 /* ShareSheet.swift */; };
5CC2C0FC2809BF11000C35E3 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5CC2C0FA2809BF11000C35E3 /* Localizable.strings */; };
5CC2C0FF2809BF11000C35E3 /* SimpleX--iOS--InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5CC2C0FD2809BF11000C35E3 /* SimpleX--iOS--InfoPlist.strings */; };
5CC868F329EB540C0017BBFD /* CIRcvDecryptionError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC868F229EB540C0017BBFD /* CIRcvDecryptionError.swift */; };
5CC868FB29EF5DCA0017BBFD /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CC868F629EF5DCA0017BBFD /* libgmpxx.a */; };
5CC868FC29EF5DCA0017BBFD /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CC868F729EF5DCA0017BBFD /* libgmp.a */; };
5CC868FD29EF5DCA0017BBFD /* libHSsimplex-chat-5.0.0.1-LqPiC7i8QLW2SE97F6Xmrk-ghc8.10.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CC868F829EF5DCA0017BBFD /* libHSsimplex-chat-5.0.0.1-LqPiC7i8QLW2SE97F6Xmrk-ghc8.10.7.a */; };
5CC868FE29EF5DCA0017BBFD /* libHSsimplex-chat-5.0.0.1-LqPiC7i8QLW2SE97F6Xmrk.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CC868F929EF5DCA0017BBFD /* libHSsimplex-chat-5.0.0.1-LqPiC7i8QLW2SE97F6Xmrk.a */; };
5CC868FF29EF5DCA0017BBFD /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CC868FA29EF5DCA0017BBFD /* libffi.a */; };
5CCA7DF32905735700C8FEBA /* AcceptRequestsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCA7DF22905735700C8FEBA /* AcceptRequestsView.swift */; };
5CCB939C297EFCB100399E78 /* NavStackCompat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCB939B297EFCB100399E78 /* NavStackCompat.swift */; };
5CCD403427A5F6DF00368C90 /* AddContactView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD403327A5F6DF00368C90 /* AddContactView.swift */; };
@@ -154,11 +159,6 @@
6442E0BA287F169300CEC0F9 /* AddGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6442E0B9287F169300CEC0F9 /* AddGroupView.swift */; };
6442E0BE2880182D00CEC0F9 /* GroupChatInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6442E0BD2880182D00CEC0F9 /* GroupChatInfoView.swift */; };
6448BBB628FA9D56000D2AB9 /* GroupLinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6448BBB528FA9D56000D2AB9 /* GroupLinkView.swift */; };
644E729C29E9B497003534BE /* libHSsimplex-chat-5.0.0.0-HDKKvfAWZqx9YjijiAKu4h-ghc8.10.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 644E729729E9B496003534BE /* libHSsimplex-chat-5.0.0.0-HDKKvfAWZqx9YjijiAKu4h-ghc8.10.7.a */; };
644E729D29E9B497003534BE /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 644E729829E9B497003534BE /* libffi.a */; };
644E729E29E9B497003534BE /* libHSsimplex-chat-5.0.0.0-HDKKvfAWZqx9YjijiAKu4h.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 644E729929E9B497003534BE /* libHSsimplex-chat-5.0.0.0-HDKKvfAWZqx9YjijiAKu4h.a */; };
644E729F29E9B497003534BE /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 644E729A29E9B497003534BE /* libgmpxx.a */; };
644E72A029E9B497003534BE /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 644E729B29E9B497003534BE /* libgmp.a */; };
644EFFDE292BCD9D00525D5B /* ComposeVoiceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 644EFFDD292BCD9D00525D5B /* ComposeVoiceView.swift */; };
644EFFE0292CFD7F00525D5B /* CIVoiceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 644EFFDF292CFD7F00525D5B /* CIVoiceView.swift */; };
644EFFE2292D089800525D5B /* FramedCIVoiceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 644EFFE1292D089800525D5B /* FramedCIVoiceView.swift */; };
@@ -275,7 +275,6 @@
5C3A88D027DF57800060F1C2 /* FramedItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FramedItemView.swift; sourceTree = "<group>"; };
5C3F1D552842B68D00EC8A82 /* IntegrityErrorItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntegrityErrorItemView.swift; sourceTree = "<group>"; };
5C3F1D57284363C400EC8A82 /* PrivacySettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacySettings.swift; sourceTree = "<group>"; };
5C3F1D592844B4DE00EC8A82 /* ExperimentalFeaturesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExperimentalFeaturesView.swift; sourceTree = "<group>"; };
5C422A7C27A9A6FA0097A1E1 /* SimpleX (iOS).entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "SimpleX (iOS).entitlements"; sourceTree = "<group>"; };
5C4B3B09285FB130003915F2 /* DatabaseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseView.swift; sourceTree = "<group>"; };
5C5346A727B59A6A004DF848 /* ChatHelp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatHelp.swift; sourceTree = "<group>"; };
@@ -384,6 +383,12 @@
5CC1C99427A6CF7F000D9FF6 /* ShareSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareSheet.swift; sourceTree = "<group>"; };
5CC2C0FB2809BF11000C35E3 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = "<group>"; };
5CC2C0FE2809BF11000C35E3 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = "ru.lproj/SimpleX--iOS--InfoPlist.strings"; sourceTree = "<group>"; };
5CC868F229EB540C0017BBFD /* CIRcvDecryptionError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIRcvDecryptionError.swift; sourceTree = "<group>"; };
5CC868F629EF5DCA0017BBFD /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
5CC868F729EF5DCA0017BBFD /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
5CC868F829EF5DCA0017BBFD /* libHSsimplex-chat-5.0.0.1-LqPiC7i8QLW2SE97F6Xmrk-ghc8.10.7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.0.0.1-LqPiC7i8QLW2SE97F6Xmrk-ghc8.10.7.a"; sourceTree = "<group>"; };
5CC868F929EF5DCA0017BBFD /* libHSsimplex-chat-5.0.0.1-LqPiC7i8QLW2SE97F6Xmrk.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.0.0.1-LqPiC7i8QLW2SE97F6Xmrk.a"; sourceTree = "<group>"; };
5CC868FA29EF5DCA0017BBFD /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
5CCA7DF22905735700C8FEBA /* AcceptRequestsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcceptRequestsView.swift; sourceTree = "<group>"; };
5CCB939B297EFCB100399E78 /* NavStackCompat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavStackCompat.swift; sourceTree = "<group>"; };
5CCD403327A5F6DF00368C90 /* AddContactView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddContactView.swift; sourceTree = "<group>"; };
@@ -420,11 +425,6 @@
6442E0B9287F169300CEC0F9 /* AddGroupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddGroupView.swift; sourceTree = "<group>"; };
6442E0BD2880182D00CEC0F9 /* GroupChatInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupChatInfoView.swift; sourceTree = "<group>"; };
6448BBB528FA9D56000D2AB9 /* GroupLinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupLinkView.swift; sourceTree = "<group>"; };
644E729729E9B496003534BE /* libHSsimplex-chat-5.0.0.0-HDKKvfAWZqx9YjijiAKu4h-ghc8.10.7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.0.0.0-HDKKvfAWZqx9YjijiAKu4h-ghc8.10.7.a"; sourceTree = "<group>"; };
644E729829E9B497003534BE /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
644E729929E9B497003534BE /* libHSsimplex-chat-5.0.0.0-HDKKvfAWZqx9YjijiAKu4h.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.0.0.0-HDKKvfAWZqx9YjijiAKu4h.a"; sourceTree = "<group>"; };
644E729A29E9B497003534BE /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
644E729B29E9B497003534BE /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
644EFFDD292BCD9D00525D5B /* ComposeVoiceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeVoiceView.swift; sourceTree = "<group>"; };
644EFFDF292CFD7F00525D5B /* CIVoiceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIVoiceView.swift; sourceTree = "<group>"; };
644EFFE1292D089800525D5B /* FramedCIVoiceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FramedCIVoiceView.swift; sourceTree = "<group>"; };
@@ -483,13 +483,13 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
644E729F29E9B497003534BE /* libgmpxx.a in Frameworks */,
644E72A029E9B497003534BE /* libgmp.a in Frameworks */,
644E729E29E9B497003534BE /* libHSsimplex-chat-5.0.0.0-HDKKvfAWZqx9YjijiAKu4h.a in Frameworks */,
5CC868FB29EF5DCA0017BBFD /* libgmpxx.a in Frameworks */,
5CC868FD29EF5DCA0017BBFD /* libHSsimplex-chat-5.0.0.1-LqPiC7i8QLW2SE97F6Xmrk-ghc8.10.7.a in Frameworks */,
5CE2BA93284534B000EC33A6 /* libiconv.tbd in Frameworks */,
644E729C29E9B497003534BE /* libHSsimplex-chat-5.0.0.0-HDKKvfAWZqx9YjijiAKu4h-ghc8.10.7.a in Frameworks */,
5CC868FE29EF5DCA0017BBFD /* libHSsimplex-chat-5.0.0.1-LqPiC7i8QLW2SE97F6Xmrk.a in Frameworks */,
5CC868FF29EF5DCA0017BBFD /* libffi.a in Frameworks */,
5CC868FC29EF5DCA0017BBFD /* libgmp.a in Frameworks */,
5CE2BA94284534BB00EC33A6 /* libz.tbd in Frameworks */,
644E729D29E9B497003534BE /* libffi.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -549,11 +549,11 @@
5C764E5C279C70B7000C6508 /* Libraries */ = {
isa = PBXGroup;
children = (
644E729829E9B497003534BE /* libffi.a */,
644E729B29E9B497003534BE /* libgmp.a */,
644E729A29E9B497003534BE /* libgmpxx.a */,
644E729729E9B496003534BE /* libHSsimplex-chat-5.0.0.0-HDKKvfAWZqx9YjijiAKu4h-ghc8.10.7.a */,
644E729929E9B497003534BE /* libHSsimplex-chat-5.0.0.0-HDKKvfAWZqx9YjijiAKu4h.a */,
5CC868FA29EF5DCA0017BBFD /* libffi.a */,
5CC868F729EF5DCA0017BBFD /* libgmp.a */,
5CC868F629EF5DCA0017BBFD /* libgmpxx.a */,
5CC868F829EF5DCA0017BBFD /* libHSsimplex-chat-5.0.0.1-LqPiC7i8QLW2SE97F6Xmrk-ghc8.10.7.a */,
5CC868F929EF5DCA0017BBFD /* libHSsimplex-chat-5.0.0.1-LqPiC7i8QLW2SE97F6Xmrk.a */,
);
path = Libraries;
sourceTree = "<group>";
@@ -718,7 +718,6 @@
5C93293029239BED0090FFF9 /* ProtocolServerView.swift */,
5C9329402929248A0090FFF9 /* ScanProtocolServer.swift */,
5CB2084E28DA4B4800D024EC /* RTCServers.swift */,
5C3F1D592844B4DE00EC8A82 /* ExperimentalFeaturesView.swift */,
64F1CC3A28B39D8600CD1FB1 /* IncognitoHelp.swift */,
18415845648CA4F5A8BCA272 /* UserProfilesView.swift */,
5C65F341297D3F3600B67AF3 /* VersionView.swift */,
@@ -798,6 +797,7 @@
1841511920742C6E152E469F /* AnimatedImageView.swift */,
6407BA82295DA85D0082BA18 /* CIInvalidJSONView.swift */,
18415FD2E36F13F596A45BB4 /* CIVideoView.swift */,
5CC868F229EB540C0017BBFD /* CIRcvDecryptionError.swift */,
);
path = ChatItem;
sourceTree = "<group>";
@@ -1094,6 +1094,7 @@
64F1CC3B28B39D8600CD1FB1 /* IncognitoHelp.swift in Sources */,
5CB0BA90282713D900B3292C /* SimpleXInfo.swift in Sources */,
5C063D2727A4564100AEC577 /* ChatPreviewView.swift in Sources */,
5CC868F329EB540C0017BBFD /* CIRcvDecryptionError.swift in Sources */,
5C35CFCB27B2E91D00FB6C6D /* NtfManager.swift in Sources */,
3C8C548928133C84000A3EC7 /* PasteToConnectView.swift in Sources */,
5C9D13A3282187BB00AB8B43 /* WebRTC.swift in Sources */,
@@ -1161,7 +1162,6 @@
5C93293F2928E0FD0090FFF9 /* AudioRecPlay.swift in Sources */,
5C029EA82837DBB3004A9677 /* CICallItemView.swift in Sources */,
5CE4407227ADB1D0007B033A /* Emoji.swift in Sources */,
5C3F1D5A2844B4DE00EC8A82 /* ExperimentalFeaturesView.swift in Sources */,
5CB2085328DB7CAF00D024EC /* ConnectViaLinkView.swift in Sources */,
5C9CC7A928C532AB00BEF955 /* DatabaseErrorView.swift in Sources */,
5C1A4C1E27A715B700EAD5AD /* ChatItemView.swift in Sources */,
@@ -1441,7 +1441,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 141;
CURRENT_PROJECT_VERSION = 143;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
ENABLE_PREVIEWS = YES;
@@ -1483,7 +1483,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 141;
CURRENT_PROJECT_VERSION = 143;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
ENABLE_PREVIEWS = YES;
@@ -1563,7 +1563,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 141;
CURRENT_PROJECT_VERSION = 143;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
GENERATE_INFOPLIST_FILE = YES;
@@ -1595,7 +1595,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 141;
CURRENT_PROJECT_VERSION = 143;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
GENERATE_INFOPLIST_FILE = YES;
+12 -1
View File
@@ -174,7 +174,11 @@ func parseChatData(_ jChat: Any) throws -> ChatData {
if let ci: ChatItem = try? decodeObject(jCI) {
return ci
}
return ChatItem.invalidJSON(prettyJSON(jCI) ?? "")
return ChatItem.invalidJSON(
chatDir: decodeProperty(jCI, "chatDir"),
meta: decodeProperty(jCI, "meta"),
json: prettyJSON(jCI) ?? ""
)
}
return ChatData(chatInfo: chatInfo, chatItems: chatItems, chatStats: chatStats)
}
@@ -183,6 +187,13 @@ func decodeObject<T: Decodable>(_ obj: Any) throws -> T {
try jsonDecoder.decode(T.self, from: JSONSerialization.data(withJSONObject: obj))
}
func decodeProperty<T: Decodable>(_ obj: Any, _ prop: NSString) -> T? {
if let jProp = (obj as? NSDictionary)?[prop] {
return try? decodeObject(jProp)
}
return nil
}
func prettyJSON(_ obj: Any) -> String? {
if let d = try? JSONSerialization.data(withJSONObject: obj, options: .prettyPrinted) {
return String(decoding: d, as: UTF8.self)
+9 -2
View File
@@ -22,7 +22,7 @@ public enum ChatCommand {
case apiMuteUser(userId: Int64)
case apiUnmuteUser(userId: Int64)
case apiDeleteUser(userId: Int64, delSMPQueues: Bool, viewPwd: String?)
case startChat(subscribe: Bool, expire: Bool)
case startChat(subscribe: Bool, expire: Bool, xftp: Bool)
case apiStopChat
case apiActivateChat
case apiSuspendChat(timeoutMicroseconds: Int)
@@ -116,7 +116,7 @@ public enum ChatCommand {
case let .apiMuteUser(userId): return "/_mute user \(userId)"
case let .apiUnmuteUser(userId): return "/_unmute user \(userId)"
case let .apiDeleteUser(userId, delSMPQueues, viewPwd): return "/_delete user \(userId) del_smp=\(onOff(delSMPQueues))\(maybePwd(viewPwd))"
case let .startChat(subscribe, expire): return "/_start subscribe=\(onOff(subscribe)) expire=\(onOff(expire))"
case let .startChat(subscribe, expire, xftp): return "/_start subscribe=\(onOff(subscribe)) expire=\(onOff(expire)) xftp=\(onOff(xftp))"
case .apiStopChat: return "/_stop"
case .apiActivateChat: return "/_app activate"
case let .apiSuspendChat(timeoutMicroseconds): return "/_app suspend \(timeoutMicroseconds)"
@@ -453,6 +453,7 @@ public enum ChatResponse: Decodable, Error {
case rcvFileComplete(user: User, chatItem: AChatItem)
case rcvFileCancelled(user: User, chatItem: AChatItem, rcvFileTransfer: RcvFileTransfer)
case rcvFileSndCancelled(user: User, chatItem: AChatItem, rcvFileTransfer: RcvFileTransfer)
case rcvFileError(user: User, chatItem: AChatItem)
// sending file events
case sndFileStart(user: User, chatItem: AChatItem, sndFileTransfer: SndFileTransfer)
case sndFileComplete(user: User, chatItem: AChatItem, sndFileTransfer: SndFileTransfer)
@@ -460,6 +461,8 @@ public enum ChatResponse: Decodable, Error {
case sndFileRcvCancelled(user: User, chatItem: AChatItem, sndFileTransfer: SndFileTransfer)
case sndFileProgressXFTP(user: User, chatItem: AChatItem, fileTransferMeta: FileTransferMeta, sentSize: Int64, totalSize: Int64)
case sndFileCompleteXFTP(user: User, chatItem: AChatItem, fileTransferMeta: FileTransferMeta)
case sndFileError(user: User, chatItem: AChatItem)
// call events
case callInvitation(callInvitation: RcvCallInvitation)
case callOffer(user: User, contact: Contact, callType: CallType, offer: WebRTCSession, sharedKey: String?, askConfirmation: Bool)
case callAnswer(user: User, contact: Contact, answer: WebRTCSession)
@@ -564,12 +567,14 @@ public enum ChatResponse: Decodable, Error {
case .rcvFileComplete: return "rcvFileComplete"
case .rcvFileCancelled: return "rcvFileCancelled"
case .rcvFileSndCancelled: return "rcvFileSndCancelled"
case .rcvFileError: return "rcvFileError"
case .sndFileStart: return "sndFileStart"
case .sndFileComplete: return "sndFileComplete"
case .sndFileCancelled: return "sndFileCancelled"
case .sndFileRcvCancelled: return "sndFileRcvCancelled"
case .sndFileProgressXFTP: return "sndFileProgressXFTP"
case .sndFileCompleteXFTP: return "sndFileCompleteXFTP"
case .sndFileError: return "sndFileError"
case .callInvitation: return "callInvitation"
case .callOffer: return "callOffer"
case .callAnswer: return "callAnswer"
@@ -677,12 +682,14 @@ public enum ChatResponse: Decodable, Error {
case let .rcvFileComplete(u, chatItem): return withUser(u, String(describing: chatItem))
case let .rcvFileCancelled(u, chatItem, _): return withUser(u, String(describing: chatItem))
case let .rcvFileSndCancelled(u, chatItem, _): return withUser(u, String(describing: chatItem))
case let .rcvFileError(u, chatItem): return withUser(u, String(describing: chatItem))
case let .sndFileStart(u, chatItem, _): return withUser(u, String(describing: chatItem))
case let .sndFileComplete(u, chatItem, _): return withUser(u, String(describing: chatItem))
case let .sndFileCancelled(u, chatItem, _, _): return withUser(u, String(describing: chatItem))
case let .sndFileRcvCancelled(u, chatItem, _): return withUser(u, String(describing: chatItem))
case let .sndFileProgressXFTP(u, chatItem, _, sentSize, totalSize): return withUser(u, "chatItem: \(String(describing: chatItem))\nsentSize: \(sentSize)\ntotalSize: \(totalSize)")
case let .sndFileCompleteXFTP(u, chatItem, _): return withUser(u, String(describing: chatItem))
case let .sndFileError(u, chatItem): return withUser(u, String(describing: chatItem))
case let .callInvitation(inv): return String(describing: inv)
case let .callOffer(u, contact, callType, offer, sharedKey, askConfirmation): return withUser(u, "contact: \(contact.id)\ncallType: \(String(describing: callType))\nsharedKey: \(sharedKey ?? "")\naskConfirmation: \(askConfirmation)\noffer: \(String(describing: offer))")
case let .callAnswer(u, contact, answer): return withUser(u, "contact: \(contact.id)\nanswer: \(String(describing: answer))")
+2 -7
View File
@@ -31,7 +31,6 @@ let GROUP_DEFAULT_STORE_DB_PASSPHRASE = "storeDBPassphrase"
let GROUP_DEFAULT_INITIAL_RANDOM_DB_PASSPHRASE = "initialRandomDBPassphrase"
public let GROUP_DEFAULT_CONFIRM_DB_UPGRADES = "confirmDBUpgrades"
public let GROUP_DEFAULT_CALL_KIT_ENABLED = "callKitEnabled"
public let GROUP_DEFAULT_XFTP_SEND_ENABLED = "xftpSendEnabled"
public let APP_GROUP_NAME = "group.chat.simplex.app"
@@ -56,7 +55,6 @@ public func registerGroupDefaults() {
GROUP_DEFAULT_PRIVACY_TRANSFER_IMAGES_INLINE: false,
GROUP_DEFAULT_CONFIRM_DB_UPGRADES: false,
GROUP_DEFAULT_CALL_KIT_ENABLED: true,
GROUP_DEFAULT_XFTP_SEND_ENABLED: false,
])
}
@@ -129,8 +127,6 @@ public let confirmDBUpgradesGroupDefault = BoolDefault(defaults: groupDefaults,
public let callKitEnabledGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_CALL_KIT_ENABLED)
public let xftpSendEnabledGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_XFTP_SEND_ENABLED)
public class DateDefault {
var defaults: UserDefaults
var key: String
@@ -203,9 +199,8 @@ public class Default<T> {
}
}
public func getXFTPCfg() -> XFTPFileConfig? {
let xftpSendEnabled = xftpSendEnabledGroupDefault.get()
return xftpSendEnabled ? XFTPFileConfig(minFileSize: 0) : nil
public func getXFTPCfg() -> XFTPFileConfig {
return XFTPFileConfig(minFileSize: 0)
}
public func getNetCfg() -> NetCfg {
+139 -35
View File
@@ -162,17 +162,20 @@ public struct FullPreferences: Decodable, Equatable {
public var timedMessages: TimedMessagesPreference
public var fullDelete: SimplePreference
public var voice: SimplePreference
public var calls: SimplePreference
public init(timedMessages: TimedMessagesPreference, fullDelete: SimplePreference, voice: SimplePreference) {
public init(timedMessages: TimedMessagesPreference, fullDelete: SimplePreference, voice: SimplePreference, calls: SimplePreference) {
self.timedMessages = timedMessages
self.fullDelete = fullDelete
self.voice = voice
self.calls = calls
}
public static let sampleData = FullPreferences(
timedMessages: TimedMessagesPreference(allow: .no),
fullDelete: SimplePreference(allow: .no),
voice: SimplePreference(allow: .yes)
voice: SimplePreference(allow: .yes),
calls: SimplePreference(allow: .yes)
)
}
@@ -180,18 +183,21 @@ public struct Preferences: Codable {
public var timedMessages: TimedMessagesPreference?
public var fullDelete: SimplePreference?
public var voice: SimplePreference?
public var calls: SimplePreference?
public init(timedMessages: TimedMessagesPreference?, fullDelete: SimplePreference?, voice: SimplePreference?) {
public init(timedMessages: TimedMessagesPreference?, fullDelete: SimplePreference?, voice: SimplePreference?, calls: SimplePreference?) {
self.timedMessages = timedMessages
self.fullDelete = fullDelete
self.voice = voice
self.calls = calls
}
func copy(timedMessages: TimedMessagesPreference? = nil, fullDelete: SimplePreference? = nil, voice: SimplePreference? = nil) -> Preferences {
func copy(timedMessages: TimedMessagesPreference? = nil, fullDelete: SimplePreference? = nil, voice: SimplePreference? = nil, calls: SimplePreference? = nil) -> Preferences {
Preferences(
timedMessages: timedMessages ?? self.timedMessages,
fullDelete: fullDelete ?? self.fullDelete,
voice: voice ?? self.voice
voice: voice ?? self.voice,
calls: calls ?? self.calls
)
}
@@ -200,13 +206,15 @@ public struct Preferences: Codable {
case .timedMessages: return copy(timedMessages: TimedMessagesPreference(allow: allowed, ttl: param ?? timedMessages?.ttl))
case .fullDelete: return copy(fullDelete: SimplePreference(allow: allowed))
case .voice: return copy(voice: SimplePreference(allow: allowed))
case .calls: return copy(calls: SimplePreference(allow: allowed))
}
}
public static let sampleData = Preferences(
timedMessages: TimedMessagesPreference(allow: .no),
fullDelete: SimplePreference(allow: .no),
voice: SimplePreference(allow: .yes)
voice: SimplePreference(allow: .yes),
calls: SimplePreference(allow: .yes)
)
}
@@ -214,7 +222,8 @@ public func fullPreferencesToPreferences(_ fullPreferences: FullPreferences) ->
Preferences(
timedMessages: fullPreferences.timedMessages,
fullDelete: fullPreferences.fullDelete,
voice: fullPreferences.voice
voice: fullPreferences.voice,
calls: fullPreferences.calls
)
}
@@ -222,7 +231,8 @@ public func contactUserPreferencesToPreferences(_ contactUserPreferences: Contac
Preferences(
timedMessages: contactUserPreferences.timedMessages.userPreference.preference,
fullDelete: contactUserPreferences.fullDelete.userPreference.preference,
voice: contactUserPreferences.voice.userPreference.preference
voice: contactUserPreferences.voice.userPreference.preference,
calls: contactUserPreferences.calls.userPreference.preference
)
}
@@ -248,7 +258,7 @@ public struct TimedMessagesPreference: Preference {
}
public static var ttlValues: [Int?] {
[30, 300, 3600, 8 * 3600, 86400, 7 * 86400, 30 * 86400]
[30, 300, 3600, 8 * 3600, 86400, 7 * 86400, 30 * 86400, nil]
}
public static func ttlText(_ ttl: Int?) -> String {
@@ -308,15 +318,18 @@ public struct ContactUserPreferences: Decodable {
public var timedMessages: ContactUserPreference<TimedMessagesPreference>
public var fullDelete: ContactUserPreference<SimplePreference>
public var voice: ContactUserPreference<SimplePreference>
public var calls: ContactUserPreference<SimplePreference>
public init(
timedMessages: ContactUserPreference<TimedMessagesPreference>,
fullDelete: ContactUserPreference<SimplePreference>,
voice: ContactUserPreference<SimplePreference>
voice: ContactUserPreference<SimplePreference>,
calls: ContactUserPreference<SimplePreference>
) {
self.timedMessages = timedMessages
self.fullDelete = fullDelete
self.voice = voice
self.calls = calls
}
public static let sampleData = ContactUserPreferences(
@@ -334,6 +347,11 @@ public struct ContactUserPreferences: Decodable {
enabled: FeatureEnabled(forUser: true, forContact: true),
userPreference: ContactUserPref<SimplePreference>.user(preference: SimplePreference(allow: .yes)),
contactPreference: SimplePreference(allow: .yes)
),
calls: ContactUserPreference<SimplePreference>(
enabled: FeatureEnabled(forUser: true, forContact: true),
userPreference: ContactUserPref<SimplePreference>.user(preference: SimplePreference(allow: .yes)),
contactPreference: SimplePreference(allow: .yes)
)
)
}
@@ -391,13 +409,6 @@ public enum ContactUserPref<P: Preference>: Decodable {
case let .user(preference): return preference
}
}
var contactOverride: P? {
switch self {
case let .contact(preference): return preference
case .user: return nil
}
}
}
public protocol Feature {
@@ -412,6 +423,7 @@ public enum ChatFeature: String, Decodable, Feature {
case timedMessages
case fullDelete
case voice
case calls
public var values: [ChatFeature] { [.fullDelete, .voice] }
@@ -436,6 +448,7 @@ public enum ChatFeature: String, Decodable, Feature {
case .timedMessages: return NSLocalizedString("Disappearing messages", comment: "chat feature")
case .fullDelete: return NSLocalizedString("Delete for everyone", comment: "chat feature")
case .voice: return NSLocalizedString("Voice messages", comment: "chat feature")
case .calls: return NSLocalizedString("Audio/video calls", comment: "chat feature")
}
}
@@ -444,6 +457,7 @@ public enum ChatFeature: String, Decodable, Feature {
case .timedMessages: return "stopwatch"
case .fullDelete: return "trash.slash"
case .voice: return "mic"
case .calls: return "phone"
}
}
@@ -452,6 +466,7 @@ public enum ChatFeature: String, Decodable, Feature {
case .timedMessages: return "stopwatch.fill"
case .fullDelete: return "trash.slash.fill"
case .voice: return "mic.fill"
case .calls: return "phone.fill"
}
}
@@ -482,6 +497,12 @@ public enum ChatFeature: String, Decodable, Feature {
case .yes: return "Allow voice messages only if your contact allows them."
case .no: return "Prohibit sending voice messages."
}
case .calls:
switch allowed {
case .always: return "Allow your contacts to call you."
case .yes: return "Allow calls only if your contact allows them."
case .no: return "Prohibit audio/video calls."
}
}
}
@@ -511,6 +532,14 @@ public enum ChatFeature: String, Decodable, Feature {
: enabled.forContact
? "Only your contact can send voice messages."
: "Voice messages are prohibited in this chat."
case .calls:
return enabled.forUser && enabled.forContact
? "Both you and your contact can make calls."
: enabled.forUser
? "Only you can make calls."
: enabled.forContact
? "Only your contact can make calls."
: "Audio/video calls are prohibited."
}
}
}
@@ -653,30 +682,34 @@ public struct ContactFeaturesAllowed: Equatable {
public var timedMessagesTTL: Int?
public var fullDelete: ContactFeatureAllowed
public var voice: ContactFeatureAllowed
public var calls: ContactFeatureAllowed
public init(timedMessagesAllowed: Bool, timedMessagesTTL: Int?, fullDelete: ContactFeatureAllowed, voice: ContactFeatureAllowed) {
public init(timedMessagesAllowed: Bool, timedMessagesTTL: Int?, fullDelete: ContactFeatureAllowed, voice: ContactFeatureAllowed, calls: ContactFeatureAllowed) {
self.timedMessagesAllowed = timedMessagesAllowed
self.timedMessagesTTL = timedMessagesTTL
self.fullDelete = fullDelete
self.voice = voice
self.calls = calls
}
public static let sampleData = ContactFeaturesAllowed(
timedMessagesAllowed: false,
timedMessagesTTL: nil,
fullDelete: ContactFeatureAllowed.userDefault(.no),
voice: ContactFeatureAllowed.userDefault(.yes)
voice: ContactFeatureAllowed.userDefault(.yes),
calls: ContactFeatureAllowed.userDefault(.yes)
)
}
public func contactUserPrefsToFeaturesAllowed(_ contactUserPreferences: ContactUserPreferences) -> ContactFeaturesAllowed {
let pref = contactUserPreferences.timedMessages.userPreference
let allow = pref.contactOverride?.allow
let allow = pref.preference.allow
return ContactFeaturesAllowed(
timedMessagesAllowed: allow == .yes || allow == .always,
timedMessagesTTL: pref.preference.ttl,
fullDelete: contactUserPrefToFeatureAllowed(contactUserPreferences.fullDelete),
voice: contactUserPrefToFeatureAllowed(contactUserPreferences.voice)
voice: contactUserPrefToFeatureAllowed(contactUserPreferences.voice),
calls: contactUserPrefToFeatureAllowed(contactUserPreferences.calls)
)
}
@@ -696,7 +729,8 @@ public func contactFeaturesAllowedToPrefs(_ contactFeaturesAllowed: ContactFeatu
Preferences(
timedMessages: TimedMessagesPreference(allow: contactFeaturesAllowed.timedMessagesAllowed ? .yes : .no, ttl: contactFeaturesAllowed.timedMessagesTTL),
fullDelete: contactFeatureAllowedToPref(contactFeaturesAllowed.fullDelete),
voice: contactFeatureAllowedToPref(contactFeaturesAllowed.voice)
voice: contactFeatureAllowedToPref(contactFeaturesAllowed.voice),
calls: contactFeatureAllowedToPref(contactFeaturesAllowed.calls)
)
}
@@ -984,6 +1018,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat {
case .timedMessages: return cups.timedMessages.enabled.forUser
case .fullDelete: return cups.fullDelete.enabled.forUser
case .voice: return cups.voice.enabled.forUser
case .calls: return cups.calls.enabled.forUser
}
case let .group(groupInfo):
let prefs = groupInfo.fullGroupPreferences
@@ -991,6 +1026,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat {
case .timedMessages: return prefs.timedMessages.on
case .fullDelete: return prefs.fullDelete.on
case .voice: return prefs.voice.on
case .calls: return false
}
default: return false
}
@@ -1144,6 +1180,7 @@ public struct Contact: Identifiable, Decodable, NamedChat {
case .timedMessages: return mergedPreferences.timedMessages.contactPreference.allow != .no
case .fullDelete: return mergedPreferences.fullDelete.contactPreference.allow != .no
case .voice: return mergedPreferences.voice.contactPreference.allow != .no
case .calls: return mergedPreferences.calls.contactPreference.allow != .no
}
}
@@ -1152,6 +1189,7 @@ public struct Contact: Identifiable, Decodable, NamedChat {
case .timedMessages: return mergedPreferences.timedMessages.userPreference.preference.allow != .no
case .fullDelete: return mergedPreferences.fullDelete.userPreference.preference.allow != .no
case .voice: return mergedPreferences.voice.userPreference.preference.allow != .no
case .calls: return mergedPreferences.calls.userPreference.preference.allow != .no
}
}
@@ -1756,6 +1794,7 @@ public struct ChatItem: Identifiable, Decodable {
case .sndCall: return showNtfDir
case .rcvCall: return false // notification is shown on .callInvitation instead
case .rcvIntegrityError: return showNtfDir
case .rcvDecryptionError: return showNtfDir
case .rcvGroupInvitation: return showNtfDir
case .sndGroupInvitation: return showNtfDir
case .rcvGroupEvent(rcvGroupEvent: let rcvGroupEvent):
@@ -1942,10 +1981,10 @@ public struct ChatItem: Identifiable, Decodable {
return item
}
public static func invalidJSON(_ json: String) -> ChatItem {
public static func invalidJSON(chatDir: CIDirection?, meta: CIMeta?, json: String) -> ChatItem {
ChatItem(
chatDir: CIDirection.directSnd,
meta: CIMeta.invalidJSON,
chatDir: chatDir ?? .directSnd,
meta: meta ?? .invalidJSON,
content: .invalidJSON(json: json),
quotedItem: nil,
file: nil
@@ -2099,6 +2138,7 @@ public enum CIContent: Decodable, ItemContent {
case sndCall(status: CICallStatus, duration: Int)
case rcvCall(status: CICallStatus, duration: Int)
case rcvIntegrityError(msgError: MsgErrorType)
case rcvDecryptionError(msgDecryptError: MsgDecryptError, msgCount: UInt32)
case rcvGroupInvitation(groupInvitation: CIGroupInvitation, memberRole: GroupMemberRole)
case sndGroupInvitation(groupInvitation: CIGroupInvitation, memberRole: GroupMemberRole)
case rcvGroupEvent(rcvGroupEvent: RcvGroupEvent)
@@ -2127,6 +2167,7 @@ public enum CIContent: Decodable, ItemContent {
case let .sndCall(status, duration): return status.text(duration)
case let .rcvCall(status, duration): return status.text(duration)
case let .rcvIntegrityError(msgError): return msgError.text
case let .rcvDecryptionError(msgDecryptError, _): return msgDecryptError.text
case let .rcvGroupInvitation(groupInvitation, _): return groupInvitation.text
case let .sndGroupInvitation(groupInvitation, _): return groupInvitation.text
case let .rcvGroupEvent(rcvGroupEvent): return rcvGroupEvent.text
@@ -2173,6 +2214,18 @@ public enum CIContent: Decodable, ItemContent {
}
}
public enum MsgDecryptError: String, Decodable {
case ratchetHeader
case tooManySkipped
var text: String {
switch self {
case .ratchetHeader: return NSLocalizedString("Permanent decryption error", comment: "message decrypt error item")
case .tooManySkipped: return NSLocalizedString("Permanent decryption error", comment: "message decrypt error item")
}
}
}
public struct CIQuote: Decodable, ItemContent {
var chatDir: CIDirection?
public var itemId: Int64?
@@ -2228,32 +2281,79 @@ public struct CIFile: Decodable {
case .sndTransfer: return true
case .sndComplete: return true
case .sndCancelled: return true
case .sndError: return true
case .rcvInvitation: return false
case .rcvAccepted: return false
case .rcvTransfer: return false
case .rcvCancelled: return false
case .rcvComplete: return true
case .rcvError: return false
}
}
}
public var cancellable: Bool {
public var cancelAction: CancelAction? {
get {
switch self.fileStatus {
case .sndStored: return self.fileProtocol != .xftp // TODO true - enable when XFTP send supports cancel
case .sndTransfer: return self.fileProtocol != .xftp // TODO true
case .sndComplete: return false
case .sndCancelled: return false
case .rcvInvitation: return false
case .rcvAccepted: return true
case .rcvTransfer: return true
case .rcvCancelled: return false
case .rcvComplete: return false
case .sndStored: return sndCancelAction
case .sndTransfer: return sndCancelAction
case .sndComplete:
if self.fileProtocol == .xftp {
return revokeCancelAction
} else {
return nil
}
case .sndCancelled: return nil
case .sndError: return nil
case .rcvInvitation: return nil
case .rcvAccepted: return rcvCancelAction
case .rcvTransfer: return rcvCancelAction
case .rcvCancelled: return nil
case .rcvComplete: return nil
case .rcvError: return nil
}
}
}
}
public struct CancelAction {
public var uiAction: String
public var alert: AlertInfo
}
public struct AlertInfo {
public var title: LocalizedStringKey
public var message: LocalizedStringKey
public var confirm: LocalizedStringKey
}
private var sndCancelAction = CancelAction(
uiAction: NSLocalizedString("Stop file", comment: "cancel file action"),
alert: AlertInfo(
title: "Stop sending file?",
message: "Sending file will be stopped.",
confirm: "Stop"
)
)
private var revokeCancelAction = CancelAction(
uiAction: NSLocalizedString("Revoke file", comment: "cancel file action"),
alert: AlertInfo(
title: "Revoke file?",
message: "File will be deleted from servers.",
confirm: "Revoke"
)
)
private var rcvCancelAction = CancelAction(
uiAction: NSLocalizedString("Stop file", comment: "cancel file action"),
alert: AlertInfo(
title: "Stop receiving file?",
message: "Receiving file will be stopped.",
confirm: "Stop"
)
)
public enum FileProtocol: String, Decodable {
case smp = "smp"
case xftp = "xftp"
@@ -2264,11 +2364,13 @@ public enum CIFileStatus: Decodable {
case sndTransfer(sndProgress: Int64, sndTotal: Int64)
case sndComplete
case sndCancelled
case sndError
case rcvInvitation
case rcvAccepted
case rcvTransfer(rcvProgress: Int64, rcvTotal: Int64)
case rcvComplete
case rcvCancelled
case rcvError
var id: String {
switch self {
@@ -2276,11 +2378,13 @@ public enum CIFileStatus: Decodable {
case let .sndTransfer(sndProgress, sndTotal): return "sndTransfer \(sndProgress) \(sndTotal)"
case .sndComplete: return "sndComplete"
case .sndCancelled: return "sndCancelled"
case .sndError: return "sndError"
case .rcvInvitation: return "rcvInvitation"
case .rcvAccepted: return "rcvAccepted"
case let .rcvTransfer(rcvProgress, rcvTotal): return "rcvTransfer \(rcvProgress) \(rcvTotal)"
case .rcvComplete: return "rcvComplete"
case .rcvCancelled: return "rcvCancelled"
case .rcvError: return "rcvError"
}
}
}
+155 -17
View File
@@ -142,9 +142,15 @@
/* No comment provided by engineer. */
"%lld members" = "%lld členové";
/* No comment provided by engineer. */
"%lld minutes" = "%lld minut";
/* No comment provided by engineer. */
"%lld second(s)" = "%lld vteřin";
/* No comment provided by engineer. */
"%lld seconds" = "%lld vteřin";
/* No comment provided by engineer. */
"%lldd" = "%lldd";
@@ -350,6 +356,9 @@
/* No comment provided by engineer. */
"audio call (not e2e encrypted)" = "zvukový hovor (nešifrovaný e2e)";
/* PIN entry */
"Authentication cancelled" = "Ověření zrušeno";
/* No comment provided by engineer. */
"Authentication failed" = "Ověření selhalo";
@@ -374,9 +383,15 @@
/* integrity error chat item */
"bad message hash" = "špatný hash zprávy";
/* No comment provided by engineer. */
"Bad message hash" = "Špatný hash zprávy";
/* integrity error chat item */
"bad message ID" = "špatné ID zprávy";
/* No comment provided by engineer. */
"Bad message ID" = "Špatné ID zprávy";
/* No comment provided by engineer. */
"bold" = "tučně";
@@ -416,11 +431,8 @@
/* No comment provided by engineer. */
"Can't invite contacts!" = "Nelze pozvat kontakty!";
/* chat item action */
"Cancel" = "Zrušit";
/* No comment provided by engineer. */
"Cancel file transfer?" = "Zrušit přenos souboru?";
"Cancel" = "Zrušit";
/* feature offered item */
"cancelled %@" = "zrušeno %@";
@@ -437,9 +449,18 @@
/* No comment provided by engineer. */
"Change database passphrase?" = "Změnit přístupovou frázi databáze?";
/* authentication reason */
"Change lock mode" = "Změnit zamykání";
/* No comment provided by engineer. */
"Change member role?" = "Změnit roli člena?";
/* authentication reason */
"Change passcode" = "Změnit heslo";
/* No comment provided by engineer. */
"Change Passcode" = "Změna hesla";
/* No comment provided by engineer. */
"Change receiving address" = "Změna adresy příjemce";
@@ -521,6 +542,9 @@
/* No comment provided by engineer. */
"Colors" = "Barvy";
/* server test step */
"Compare file" = "Porovnat soubor";
/* No comment provided by engineer. */
"Compare security codes with your contacts." = "Porovnejte bezpečnostní kódy se svými kontakty.";
@@ -539,6 +563,9 @@
/* No comment provided by engineer. */
"Confirm new passphrase…" = "Potvrdit novou heslovou frázi…";
/* No comment provided by engineer. */
"Confirm Passcode" = "Potvrdit heslo";
/* No comment provided by engineer. */
"Confirm password" = "Potvrdit heslo";
@@ -665,6 +692,9 @@
/* No comment provided by engineer. */
"Create address" = "Vytvořit adresu";
/* server test step */
"Create file" = "Vytvořit soubor";
/* No comment provided by engineer. */
"Create group link" = "Vytvořit odkaz na skupinu";
@@ -689,6 +719,9 @@
/* No comment provided by engineer. */
"creator" = "tvůrce";
/* No comment provided by engineer. */
"Current Passcode" = "Aktuální heslo";
/* No comment provided by engineer. */
"Current passphrase…" = "Aktuální přístupová fráze…";
@@ -755,6 +788,9 @@
/* No comment provided by engineer. */
"Decentralized" = "Decentralizované";
/* No comment provided by engineer. */
"Decryption error" = "Chyba dešifrování";
/* pref value */
"default (%@)" = "výchozí (%@)";
@@ -800,6 +836,9 @@
/* No comment provided by engineer. */
"Delete database" = "Odstranění databáze";
/* server test step */
"Delete file" = "Smazat soubor";
/* No comment provided by engineer. */
"Delete files and media?" = "Smazat soubory a média?";
@@ -932,6 +971,9 @@
/* No comment provided by engineer. */
"Downgrade and open chat" = "Snížit a otevřít chat";
/* server test step */
"Download file" = "Stáhnout soubor";
/* No comment provided by engineer. */
"Duplicate display name!" = "Duplicitní zobrazované jméno!";
@@ -956,6 +998,9 @@
/* No comment provided by engineer. */
"Enable instant notifications?" = "Povolit okamžitá oznámení?";
/* No comment provided by engineer. */
"Enable lock" = "Povolit zámek";
/* No comment provided by engineer. */
"Enable notifications" = "Povolit upozornění";
@@ -1013,6 +1058,9 @@
/* No comment provided by engineer. */
"Enter correct passphrase." = "Zadejte správnou přístupovou frázi.";
/* No comment provided by engineer. */
"Enter Passcode" = "Zadat heslo";
/* No comment provided by engineer. */
"Enter passphrase…" = "Zadejte přístupovou frázi…";
@@ -1097,6 +1145,9 @@
/* No comment provided by engineer. */
"Error joining group" = "Chyba při připojování ke skupině";
/* No comment provided by engineer. */
"Error loading %@ servers" = "Chyba načítání %@ serverů";
/* No comment provided by engineer. */
"Error receiving file" = "Chyba při příjmu souboru";
@@ -1112,6 +1163,9 @@
/* No comment provided by engineer. */
"Error saving ICE servers" = "Chyba při ukládání serverů ICE";
/* No comment provided by engineer. */
"Error saving passcode" = "Chyba uložení hesla";
/* No comment provided by engineer. */
"Error saving passphrase to keychain" = "Při ukládání přístupové fráze do klíčenky došlo k chybě";
@@ -1157,9 +1211,6 @@
/* No comment provided by engineer. */
"Exit without saving" = "Ukončit bez uložení";
/* No comment provided by engineer. */
"Experimental" = "Pokusný";
/* No comment provided by engineer. */
"Export database" = "Export databáze";
@@ -1175,9 +1226,6 @@
/* No comment provided by engineer. */
"Failed to remove passphrase" = "Přístupovou frázi se nepodařilo odstranit";
/* No comment provided by engineer. */
"File transfer will be cancelled. If it's in progress it will be stoppped." = "Přenos souboru bude zrušen. Pokud probíhá, bude zastaven.";
/* No comment provided by engineer. */
"File will be received when your contact completes uploading it." = "Soubor bude přijat, jakmile váš kontakt dokončí nahrávání.";
@@ -1343,6 +1391,9 @@
/* No comment provided by engineer. */
"Image will be received when your contact is online, please wait or check later!" = "Obrázek bude přijat, až bude váš kontakt online, vyčkejte prosím nebo se podívejte později!";
/* No comment provided by engineer. */
"Immediately" = "Ihned";
/* No comment provided by engineer. */
"Immune to spam and abuse" = "Odolná vůči spamu a zneužití";
@@ -1394,6 +1445,9 @@
/* No comment provided by engineer. */
"Incompatible database version" = "Nekompatibilní verze databáze";
/* PIN entry */
"Incorrect passcode" = "Nesprávné heslo";
/* No comment provided by engineer. */
"Incorrect security code!" = "Nesprávný bezpečnostní kód!";
@@ -1473,7 +1527,10 @@
"It allows having many anonymous connections without any shared data between them in a single chat profile." = "Umožňuje mít v jednom profilu chatu mnoho anonymních spojení bez jakýchkoli sdílených údajů mezi nimi.";
/* No comment provided by engineer. */
"It can happen when:\n1. The messages expire on the server if they were not received for 30 days,\n2. The server you use to receive the messages from this contact was updated and restarted.\n3. The connection is compromised.\nPlease connect to the developers via Settings to receive the updates about the servers.\nWe will be adding server redundancy to prevent lost messages." = "Může se to stát, když:\n1. Zprávy na serveru vyprší, pokud nebyly přijaty po dobu 30 dnů,\n2. Server, který používáte pro příjem zpráv od tohoto kontaktu, byl aktualizován a restartován.\n3. Spojení je narušeno.\nPřipojte se k vývojářům prostřednictvím Nastavení, abyste mohli dostávat aktualizace o serverech.\nBudeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.";
"It can happen when you or your connection used the old database backup." = "Může se to stát, když vy nebo vaše připojení použijete starou zálohu databáze.";
/* 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." = "Může se to stát, když:\n1. Zprávy vypršely v odesílajícím klientovi po 2 dnech nebo na serveru po 30 dnech.\n2. Dešifrování zprávy se nezdařilo, protože vy nebo váš kontakt jste použili starou zálohu databáze.\n3. Spojení je kompromitováno.";
/* No comment provided by engineer. */
"It seems like you are already connected via this link. If it is not the case, there was an error (%@)." = "Zdá se, že jste již připojeni prostřednictvím tohoto odkazu. Pokud tomu tak není, došlo k chybě (%@).";
@@ -1502,6 +1559,9 @@
/* No comment provided by engineer. */
"Keychain error" = "Chyba klíčenky";
/* No comment provided by engineer. */
"KeyChain error" = "Chyba klíčenky";
/* No comment provided by engineer. */
"Large file!" = "Velký soubor!";
@@ -1538,6 +1598,12 @@
/* No comment provided by engineer. */
"Local profile data only" = "Pouze lokální profilová data";
/* No comment provided by engineer. */
"Lock after" = "Zamknout po";
/* No comment provided by engineer. */
"Lock mode" = "Režim zámku";
/* No comment provided by engineer. */
"Make a private connection" = "Vytvořte si soukromé připojení";
@@ -1685,6 +1751,9 @@
/* notification */
"New message" = "Nová zpráva";
/* No comment provided by engineer. */
"New Passcode" = "Nové heslo";
/* No comment provided by engineer. */
"New passphrase…" = "Nová přístupová fráze…";
@@ -1694,6 +1763,9 @@
/* No comment provided by engineer. */
"No" = "Ne";
/* Authentication unavailable */
"No app password" = "Žádné heslo aplikace";
/* No comment provided by engineer. */
"No contacts selected" = "Nebyl vybrán žádný kontakt";
@@ -1731,6 +1803,9 @@
group pref value */
"off" = "vypnuto";
/* No comment provided by engineer. */
"Off" = "Vypnout";
/* No comment provided by engineer. */
"Off (Local)" = "Vypnuto (místní)";
@@ -1815,6 +1890,21 @@
/* member role */
"owner" = "vlastník";
/* No comment provided by engineer. */
"Passcode" = "Heslo";
/* No comment provided by engineer. */
"Passcode changed!" = "Heslo změněno!";
/* No comment provided by engineer. */
"Passcode entry" = "Zadat heslo";
/* No comment provided by engineer. */
"Passcode not changed!" = "Heslo nezměněno!";
/* No comment provided by engineer. */
"Passcode set!" = "Heslo nastaveno!";
/* No comment provided by engineer. */
"Password to show" = "Heslo k zobrazení";
@@ -1839,6 +1929,9 @@
/* No comment provided by engineer. */
"Periodically" = "Pravidelně";
/* message decrypt error item */
"Permanent decryption error" = "Chyba dešifrování";
/* No comment provided by engineer. */
"PING count" = "Počet PING";
@@ -1866,6 +1959,12 @@
/* No comment provided by engineer. */
"Please enter the previous password after restoring database backup. This action can not be undone." = "Po obnovení zálohy databáze zadejte předchozí heslo. Tuto akci nelze vrátit zpět.";
/* No comment provided by engineer. */
"Please remember or store it securely - there is no way to recover a lost passcode!" = "Zapamatujte si ho nebo bezpečně uložte - neexistuje žádný způsob, jak obnovit ztracený heslo!";
/* No comment provided by engineer. */
"Please report it to the developers." = "Nahlaste to prosím vývojářům.";
/* No comment provided by engineer. */
"Please restart the app and migrate the database to enable push notifications." = "Restartujte aplikaci a přeneste databázi, abyste povolili doručování oznámení.";
@@ -2145,9 +2244,6 @@
/* No comment provided by engineer. */
"Send them from gallery or custom keyboards." = "Odeslat je z galerie nebo vlastní klávesnice.";
/* No comment provided by engineer. */
"Send videos and files via XFTP" = "Odeslat soubory přes XFTP";
/* No comment provided by engineer. */
"Sender cancelled file transfer." = "Odesílatel zrušil přenos souboru.";
@@ -2166,6 +2262,9 @@
/* server test error */
"Server requires authorization to create queues, check password" = "Server vyžaduje autorizaci pro vytváření front, zkontrolujte heslo";
/* server test error */
"Server requires authorization to upload, check password" = "Server vyžaduje autorizaci pro nahrávání, zkontrolujte heslo";
/* No comment provided by engineer. */
"Server test failed!" = "Test serveru se nezdařil!";
@@ -2238,6 +2337,12 @@
/* No comment provided by engineer. */
"SimpleX Lock" = "Zámek SimpleX";
/* No comment provided by engineer. */
"SimpleX Lock mode" = "SimpleX zámek";
/* No comment provided by engineer. */
"SimpleX Lock not enabled!" = "Zámek SimpleX není povolen!";
/* No comment provided by engineer. */
"SimpleX Lock turned on" = "Zapnutý zámek SimpleX Lock";
@@ -2286,12 +2391,18 @@
/* No comment provided by engineer. */
"strike" = "stávka";
/* No comment provided by engineer. */
"Submit" = "Odeslat";
/* No comment provided by engineer. */
"Support SimpleX Chat" = "Podpořte SimpleX Chat";
/* No comment provided by engineer. */
"System" = "Systém";
/* No comment provided by engineer. */
"System authentication" = "Ověření systému";
/* No comment provided by engineer. */
"Take picture" = "Vyfotit";
@@ -2364,6 +2475,12 @@
/* No comment provided by engineer. */
"The group is fully decentralized it is visible only to the members." = "Skupina je plně decentralizovaná - je viditelná pouze pro členy.";
/* No comment provided by engineer. */
"The hash of the previous message is different." = "Hash předchozí zprávy se liší.";
/* No comment provided by engineer. */
"The ID of the next message is incorrect (less or equal to the previous).\nIt can happen because of some bug or when the connection is compromised." = "ID další zprávy je nesprávné (menší nebo rovno předchozí).\nMůže se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitováno.";
/* No comment provided by engineer. */
"The message will be deleted for all members." = "Zpráva bude smazána pro všechny členy.";
@@ -2406,6 +2523,9 @@
/* notification title */
"this contact" = "tento kontakt";
/* No comment provided by engineer. */
"This error is permanent for this connection, please re-connect." = "Tato chyba je pro toto připojení trvalá, připojte se znovu.";
/* No comment provided by engineer. */
"This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member)." = "Tato funkce je experimentální! Bude fungovat pouze v případě, že druhý klient má nainstalovanou verzi 4.2. Po dokončení změny adresy by se měla v konverzaci zobrazit zpráva - zkontrolujte, zda můžete od tohoto kontaktu (nebo člena skupiny) stále přijímat zprávy.";
@@ -2502,6 +2622,9 @@
/* No comment provided by engineer. */
"Unlock" = "Odemknout";
/* authentication reason */
"Unlock app" = "Odemknout aplikaci";
/* No comment provided by engineer. */
"Unmute" = "Zrušit ztlumení";
@@ -2535,6 +2658,9 @@
/* No comment provided by engineer. */
"Upgrade and open chat" = "Zvýšit a otevřít chat";
/* server test step */
"Upload file" = "Nahrát soubor";
/* No comment provided by engineer. */
"Use .onion hosts" = "Použít hostitele .onion";
@@ -2565,9 +2691,6 @@
/* No comment provided by engineer. */
"v%@ (%@)" = "v%@ (%@)";
/* No comment provided by engineer. */
"v4.6.1+ is required to receive via XFTP." = "Pro příjem přes XFTP je vyžadována verze 4.6.1+.";
/* No comment provided by engineer. */
"Verify connection security" = "Ověření zabezpečení připojení";
@@ -2595,6 +2718,12 @@
/* No comment provided by engineer. */
"video call (not e2e encrypted)" = "videohovoru (nešifrovaného e2e)";
/* No comment provided by engineer. */
"Video will be received when your contact completes uploading it." = "Video bude přijato, až kontakt dokončí jeho nahrávání.";
/* No comment provided by engineer. */
"Video will be received when your contact is online, please wait or check later!" = "Video obdržíte, až bude váš kontakt online, vyčkejte prosím nebo zkontrolujte později!";
/* No comment provided by engineer. */
"View security code" = "Zobrazení bezpečnostního kódu";
@@ -2625,6 +2754,9 @@
/* No comment provided by engineer. */
"Waiting for image" = "Čekání na obrázek";
/* No comment provided by engineer. */
"Waiting for video" = "Čekám na video";
/* No comment provided by engineer. */
"wants to connect to you!" = "chce se s vámi spojit!";
@@ -2715,6 +2847,9 @@
/* No comment provided by engineer. */
"You can start chat via app Settings / Database or by restarting the app" = "Chat můžete zahájit prostřednictvím aplikace Nastavení / Databáze nebo restartováním aplikace";
/* No comment provided by engineer. */
"You can turn on SimpleX Lock via Settings." = "Zámek SimpleX můžete zapnout v Nastavení.";
/* No comment provided by engineer. */
"You can use markdown to format messages:" = "K formátování zpráv můžete použít markdown:";
@@ -2889,3 +3024,6 @@
/* No comment provided by engineer. */
"Your SMP servers" = "Vaše servery SMP";
/* No comment provided by engineer. */
"Your XFTP servers" = "Vaše XFTP servery";
+152 -17
View File
@@ -142,9 +142,15 @@
/* No comment provided by engineer. */
"%lld members" = "%lld Mitglieder";
/* No comment provided by engineer. */
"%lld minutes" = "%lld Minuten";
/* No comment provided by engineer. */
"%lld second(s)" = "%lld Sekunde(n)";
/* No comment provided by engineer. */
"%lld seconds" = "%lld Sekunden";
/* No comment provided by engineer. */
"%lldd" = "%lldT";
@@ -350,6 +356,9 @@
/* No comment provided by engineer. */
"audio call (not e2e encrypted)" = "Audioanruf (nicht E2E verschlüsselt)";
/* PIN entry */
"Authentication cancelled" = "Authentifizierung abgebrochen";
/* No comment provided by engineer. */
"Authentication failed" = "Authentifizierung fehlgeschlagen";
@@ -374,9 +383,15 @@
/* integrity error chat item */
"bad message hash" = "Ungültiger Nachrichten-Hash";
/* No comment provided by engineer. */
"Bad message hash" = "Ungültiger Nachrichten-Hash";
/* integrity error chat item */
"bad message ID" = "Ungültige Nachrichten-ID";
/* No comment provided by engineer. */
"Bad message ID" = "Falsche Nachrichten-ID";
/* No comment provided by engineer. */
"bold" = "fett";
@@ -416,11 +431,8 @@
/* No comment provided by engineer. */
"Can't invite contacts!" = "Kontakte können nicht eingeladen werden!";
/* chat item action */
"Cancel" = "Abbrechen";
/* No comment provided by engineer. */
"Cancel file transfer?" = "Dateitransfer abbrechen?";
"Cancel" = "Abbrechen";
/* feature offered item */
"cancelled %@" = "abgebrochen %@";
@@ -437,9 +449,18 @@
/* No comment provided by engineer. */
"Change database passphrase?" = "Datenbank-Passwort ändern?";
/* authentication reason */
"Change lock mode" = "Sperr-Modus ändern";
/* No comment provided by engineer. */
"Change member role?" = "Die Mitgliederrolle ändern?";
/* authentication reason */
"Change passcode" = "Passwort ändern";
/* No comment provided by engineer. */
"Change Passcode" = "Passwort ändern";
/* No comment provided by engineer. */
"Change receiving address" = "Wechseln der Empfängeradresse";
@@ -521,6 +542,9 @@
/* No comment provided by engineer. */
"Colors" = "Farben";
/* server test step */
"Compare file" = "Datei vergleichen";
/* No comment provided by engineer. */
"Compare security codes with your contacts." = "Vergleichen Sie die Sicherheitscodes mit Ihren Kontakten.";
@@ -539,6 +563,9 @@
/* No comment provided by engineer. */
"Confirm new passphrase…" = "Neues Passwort bestätigen…";
/* No comment provided by engineer. */
"Confirm Passcode" = "Passwort bestätigen";
/* No comment provided by engineer. */
"Confirm password" = "Passwort bestätigen";
@@ -665,6 +692,9 @@
/* No comment provided by engineer. */
"Create address" = "Adresse erstellen";
/* server test step */
"Create file" = "Datei erstellen";
/* No comment provided by engineer. */
"Create group link" = "Gruppenlink erstellen";
@@ -689,6 +719,9 @@
/* No comment provided by engineer. */
"creator" = "Ersteller";
/* No comment provided by engineer. */
"Current Passcode" = "Aktuelles Passwort";
/* No comment provided by engineer. */
"Current passphrase…" = "Aktuelles Passwort…";
@@ -755,6 +788,9 @@
/* No comment provided by engineer. */
"Decentralized" = "Dezentral";
/* No comment provided by engineer. */
"Decryption error" = "Entschlüsselungsfehler";
/* pref value */
"default (%@)" = "Voreinstellung (%@)";
@@ -800,6 +836,9 @@
/* No comment provided by engineer. */
"Delete database" = "Datenbank löschen";
/* server test step */
"Delete file" = "Datei löschen";
/* No comment provided by engineer. */
"Delete files and media?" = "Dateien und Medien löschen?";
@@ -932,6 +971,9 @@
/* No comment provided by engineer. */
"Downgrade and open chat" = "Datenbank herabstufen und den Chat öffnen";
/* server test step */
"Download file" = "Datei herunterladen";
/* No comment provided by engineer. */
"Duplicate display name!" = "Doppelter Anzeigename!";
@@ -956,6 +998,9 @@
/* No comment provided by engineer. */
"Enable instant notifications?" = "Sofortige Benachrichtigungen aktivieren?";
/* No comment provided by engineer. */
"Enable lock" = "Sperre aktivieren";
/* No comment provided by engineer. */
"Enable notifications" = "Benachrichtigungen aktivieren";
@@ -1013,6 +1058,9 @@
/* No comment provided by engineer. */
"Enter correct passphrase." = "Geben Sie das korrekte Passwort ein.";
/* No comment provided by engineer. */
"Enter Passcode" = "Passwort eingeben";
/* No comment provided by engineer. */
"Enter passphrase…" = "Passwort eingeben…";
@@ -1097,6 +1145,9 @@
/* No comment provided by engineer. */
"Error joining group" = "Fehler beim Beitritt zur Gruppe";
/* No comment provided by engineer. */
"Error loading %@ servers" = "Fehler beim Laden von %@ Servern";
/* No comment provided by engineer. */
"Error receiving file" = "Fehler beim Empfangen der Datei";
@@ -1112,6 +1163,9 @@
/* No comment provided by engineer. */
"Error saving ICE servers" = "Fehler beim Speichern der ICE-Server";
/* No comment provided by engineer. */
"Error saving passcode" = "Fehler beim Speichern des Passworts";
/* No comment provided by engineer. */
"Error saving passphrase to keychain" = "Fehler beim Speichern des Passworts in den Schlüsselbund";
@@ -1157,9 +1211,6 @@
/* No comment provided by engineer. */
"Exit without saving" = "Beenden ohne Speichern";
/* No comment provided by engineer. */
"Experimental" = "Experimentell";
/* No comment provided by engineer. */
"Export database" = "Datenbank exportieren";
@@ -1175,9 +1226,6 @@
/* No comment provided by engineer. */
"Failed to remove passphrase" = "Das Entfernen des Passworts ist fehlgeschlagen";
/* No comment provided by engineer. */
"File transfer will be cancelled. If it's in progress it will be stoppped." = "Der Dateitransfer wird abgebrochen. Falls er gerade abläuft, wird er angehalten.";
/* No comment provided by engineer. */
"File will be received when your contact completes uploading it." = "Die Datei wird empfangen, sobald das Hochladen durch ihren Kontakt abgeschlossen ist.";
@@ -1343,6 +1391,9 @@
/* No comment provided by engineer. */
"Image will be received when your contact is online, please wait or check later!" = "Das Bild wird empfangen, sobald Ihr Kontakt online ist. Bitte warten oder schauen Sie später nochmal nach!";
/* No comment provided by engineer. */
"Immediately" = "Sofort";
/* No comment provided by engineer. */
"Immune to spam and abuse" = "Immun gegen Spam und Missbrauch";
@@ -1394,6 +1445,9 @@
/* No comment provided by engineer. */
"Incompatible database version" = "Inkompatible Datenbank-Version";
/* PIN entry */
"Incorrect passcode" = "Passwort falsch";
/* No comment provided by engineer. */
"Incorrect security code!" = "Falscher Sicherheitscode!";
@@ -1473,7 +1527,10 @@
"It allows having many anonymous connections without any shared data between them in a single chat profile." = "Er ermöglicht mehrere anonyme Verbindungen in einem einzigen Chat-Profil ohne Daten zwischen diesen zu teilen.";
/* No comment provided by engineer. */
"It can happen when:\n1. The messages expire on the server if they were not received for 30 days,\n2. The server you use to receive the messages from this contact was updated and restarted.\n3. The connection is compromised.\nPlease connect to the developers via Settings to receive the updates about the servers.\nWe will be adding server redundancy to prevent lost messages." = "Dies kann unter folgenden Umständen passieren:\n1. Die Nachrichten verfallen auf dem Server, wenn sie 30 Tage lang nicht empfangen wurden.\n2. Der Server, den Sie zum Empfang der Nachrichten von diesem Kontakt verwenden, wurde aktualisiert und neu gestartet.\n3. Die Verbindung ist kompromittiert.\nBitte nehmen Sie über die Einstellungen Verbindung mit den Entwicklern auf, um Updates zu den Servern zu erhalten.\nWir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu verhindern.";
"It can happen when you or your connection used the old database backup." = "Dies kann passieren, falls Sie oder Ihre Verbindung ein altes Datenbank-Backup genutzt haben.";
/* No comment provided by engineer. */
"It can happen when:\n1. The messages expired in the sending client after 2 days or on the server after 30 days.\n2. Message decryption failed, because you or your contact used old database backup.\n3. The connection was compromised." = "Dies kann unter folgenden Umständen passieren:\n1. Die Nachrichten verfallen auf dem sendenden Client-System nach 2 Tagen oder auf dem Server nach 30 Tagen.\n2. Die Nachrichten-Entschlüsselung ist fehlgeschlagen, da von Ihnen oder Ihrem Kontakt ein altes Datenbank-Backup genutzt wurde.\n3. Die Verbindung wurde kompromittiert.";
/* No comment provided by engineer. */
"It seems like you are already connected via this link. If it is not the case, there was an error (%@)." = "Es sieht so aus, dass Sie bereits über diesen Link verbunden sind. Wenn das nicht der Fall, gab es einen Fehler (%@).";
@@ -1502,6 +1559,9 @@
/* No comment provided by engineer. */
"Keychain error" = "Schlüsselbundfehler";
/* No comment provided by engineer. */
"KeyChain error" = "Keystore Fehler";
/* No comment provided by engineer. */
"Large file!" = "Große Datei!";
@@ -1538,6 +1598,12 @@
/* No comment provided by engineer. */
"Local profile data only" = "Nur lokale Profildaten";
/* No comment provided by engineer. */
"Lock after" = "Sperre nach";
/* No comment provided by engineer. */
"Lock mode" = "Sperr-Modus";
/* No comment provided by engineer. */
"Make a private connection" = "Stellen Sie eine private Verbindung her";
@@ -1685,6 +1751,9 @@
/* notification */
"New message" = "Neue Nachricht";
/* No comment provided by engineer. */
"New Passcode" = "Neues Passwort";
/* No comment provided by engineer. */
"New passphrase…" = "Neues Passwort…";
@@ -1694,6 +1763,9 @@
/* No comment provided by engineer. */
"No" = "Nein";
/* Authentication unavailable */
"No app password" = "Kein App-Passwort";
/* No comment provided by engineer. */
"No contacts selected" = "Keine Kontakte ausgewählt";
@@ -1731,6 +1803,9 @@
group pref value */
"off" = "Aus";
/* No comment provided by engineer. */
"Off" = "Aus";
/* No comment provided by engineer. */
"Off (Local)" = "Aus (Lokal)";
@@ -1815,6 +1890,21 @@
/* member role */
"owner" = "Eigentümer";
/* No comment provided by engineer. */
"Passcode" = "Passwort";
/* No comment provided by engineer. */
"Passcode changed!" = "Passwort geändert!";
/* No comment provided by engineer. */
"Passcode entry" = "Passworteingabe";
/* No comment provided by engineer. */
"Passcode not changed!" = "Passwort wurde nicht geändert!";
/* No comment provided by engineer. */
"Passcode set!" = "Passwort wurde geändert!";
/* No comment provided by engineer. */
"Password to show" = "Passwort anzeigen";
@@ -1839,6 +1929,9 @@
/* No comment provided by engineer. */
"Periodically" = "Periodisch";
/* message decrypt error item */
"Permanent decryption error" = "Entschlüsselungsfehler";
/* No comment provided by engineer. */
"PING count" = "PING Zähler";
@@ -1866,6 +1959,12 @@
/* No comment provided by engineer. */
"Please enter the previous password after restoring database backup. This action can not be undone." = "Bitte geben Sie das vorherige Passwort ein, nachdem Sie die Datenbanksicherung wiederhergestellt haben. Diese Aktion kann nicht rückgängig gemacht werden.";
/* No comment provided by engineer. */
"Please remember or store it securely - there is no way to recover a lost passcode!" = "Es gibt keine Möglichkeit ein vergessenes Passwort wiederherzustellen - bitte erinnern Sie sich gut daran oder speichern Sie es sicher ab!";
/* No comment provided by engineer. */
"Please report it to the developers." = "Bitte melden Sie es den Entwicklern.";
/* No comment provided by engineer. */
"Please restart the app and migrate the database to enable push notifications." = "Bitte führen Sie einen Neustart der App durch und migrieren Sie die Datenbank, um Benachrichtigungen zu aktivieren.";
@@ -2145,9 +2244,6 @@
/* No comment provided by engineer. */
"Send them from gallery or custom keyboards." = "Senden Sie diese aus dem Fotoalbum oder von individuellen Tastaturen.";
/* No comment provided by engineer. */
"Send videos and files via XFTP" = "Dateien per XFTP versenden";
/* No comment provided by engineer. */
"Sender cancelled file transfer." = "Der Absender hat die Dateiübertragung abgebrochen.";
@@ -2166,6 +2262,9 @@
/* server test error */
"Server requires authorization to create queues, check password" = "Um Warteschlangen zu erzeugen benötigt der Server eine Authentifizierung. Bitte überprüfen Sie das Passwort";
/* server test error */
"Server requires authorization to upload, check password" = "Bitte das Passwort überprüfen - für den Upload benötigt der Server eine Berechtigung";
/* No comment provided by engineer. */
"Server test failed!" = "Server Test ist fehlgeschlagen!";
@@ -2238,6 +2337,12 @@
/* No comment provided by engineer. */
"SimpleX Lock" = "SimpleX Sperre";
/* No comment provided by engineer. */
"SimpleX Lock mode" = "SimpleX Sperr-Modus";
/* No comment provided by engineer. */
"SimpleX Lock not enabled!" = "SimpleX Sperre ist nicht aktiviert!";
/* No comment provided by engineer. */
"SimpleX Lock turned on" = "SimpleX Sperre aktiviert";
@@ -2286,12 +2391,18 @@
/* No comment provided by engineer. */
"strike" = "durchstreichen";
/* No comment provided by engineer. */
"Submit" = "Übermitteln";
/* No comment provided by engineer. */
"Support SimpleX Chat" = "Unterstützung von SimpleX Chat";
/* No comment provided by engineer. */
"System" = "System";
/* No comment provided by engineer. */
"System authentication" = "System-Authentifizierung";
/* No comment provided by engineer. */
"Take picture" = "Machen Sie ein Foto";
@@ -2364,6 +2475,12 @@
/* No comment provided by engineer. */
"The group is fully decentralized it is visible only to the members." = "Die Gruppe ist vollständig dezentralisiert sie ist nur für Mitglieder sichtbar.";
/* No comment provided by engineer. */
"The hash of the previous message is different." = "Der Hash der vorherigen Nachricht ist unterschiedlich.";
/* No comment provided by engineer. */
"The ID of the next message is incorrect (less or equal to the previous).\nIt can happen because of some bug or when the connection is compromised." = "Die ID der nächsten Nachricht ist falsch (kleiner oder gleich der Vorherigen).\nDies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompromittiert wurde.";
/* No comment provided by engineer. */
"The message will be deleted for all members." = "Diese Nachricht wird für alle Gruppenmitglieder gelöscht.";
@@ -2406,6 +2523,9 @@
/* notification title */
"this contact" = "Dieser Kontakt";
/* No comment provided by engineer. */
"This error is permanent for this connection, please re-connect." = "Es handelt sich um einen permanenten Fehler für diese Verbindung - bitte verbinden Sie sich neu.";
/* No comment provided by engineer. */
"This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member)." = "Diese Funktion ist experimentell! Sie wird nur funktionieren, wenn der Kontakt ebenfalls eine SimpleX-Version ab v4.2 installiert hat. Sobald der Adress-Wechsel abgeschlossen ist, sollten Sie die Nachricht im Chat-Verlauf sehen. Bitte prüfen Sie, ob Sie weiterhin Nachrichten von diesem Kontakt (oder Gruppenmitglied) empfangen können.";
@@ -2502,6 +2622,9 @@
/* No comment provided by engineer. */
"Unlock" = "Entsperren";
/* authentication reason */
"Unlock app" = "App entsperren";
/* No comment provided by engineer. */
"Unmute" = "Stummschaltung aufheben";
@@ -2535,6 +2658,9 @@
/* No comment provided by engineer. */
"Upgrade and open chat" = "Aktualisieren und den Chat öffnen";
/* server test step */
"Upload file" = "Datei hochladen";
/* No comment provided by engineer. */
"Use .onion hosts" = "Verwende .onion-Hosts";
@@ -2565,9 +2691,6 @@
/* No comment provided by engineer. */
"v%@ (%@)" = "v%@ (%@)";
/* No comment provided by engineer. */
"v4.6.1+ is required to receive via XFTP." = "Für den Empfang per XFTP wird v4.6.1 oder neuer benötigt.";
/* No comment provided by engineer. */
"Verify connection security" = "Sicherheit der Verbindung überprüfen";
@@ -2595,6 +2718,12 @@
/* No comment provided by engineer. */
"video call (not e2e encrypted)" = "Videoanruf (nicht E2E verschlüsselt)";
/* No comment provided by engineer. */
"Video will be received when your contact completes uploading it." = "Das Video wird empfangen, sobald Ihr Kontakt das Hochladen beendet hat.";
/* No comment provided by engineer. */
"Video will be received when your contact is online, please wait or check later!" = "Das Video wird empfangen, wenn Ihr Kontakt online ist. Bitte warten oder überprüfen Sie es später!";
/* No comment provided by engineer. */
"View security code" = "Schauen Sie sich den Sicherheitscode an";
@@ -2625,6 +2754,9 @@
/* No comment provided by engineer. */
"Waiting for image" = "Warten auf ein Bild";
/* No comment provided by engineer. */
"Waiting for video" = "Auf das Video warten";
/* No comment provided by engineer. */
"wants to connect to you!" = "möchte sich mit Ihnen verbinden!";
@@ -2715,6 +2847,9 @@
/* No comment provided by engineer. */
"You can start chat via app Settings / Database or by restarting the app" = "Sie können den Chat über die App-Einstellungen / Datenbank oder durch Neustart der App starten";
/* No comment provided by engineer. */
"You can turn on SimpleX Lock via Settings." = "Sie können die SimpleX Sperre über die Einstellungen aktivieren.";
/* No comment provided by engineer. */
"You can use markdown to format messages:" = "Um Nachrichteninhalte zu formatieren, können Sie Markdowns verwenden:";
+84 -72
View File
@@ -221,7 +221,7 @@
"above, then choose:" = "arriba, luego elige:";
/* No comment provided by engineer. */
"Accent color" = "Acentuar el color";
"Accent color" = "Color";
/* accept contact request via notification
accept incoming call via notification */
@@ -285,37 +285,37 @@
"Allow" = "Permitir";
/* No comment provided by engineer. */
"Allow disappearing messages only if your contact allows it to you." = "Permitir mensajes temporales sólo si tu contacto también los permite.";
"Allow disappearing messages only if your contact allows it to you." = "Se permiten mensajes temporales sólo si tu contacto también los permite para tí.";
/* No comment provided by engineer. */
"Allow irreversible message deletion only if your contact allows it to you." = "Permitir la eliminación irreversible de mensajes sólo si tu contacto también lo permite para tí.";
"Allow irreversible message deletion only if your contact allows it to you." = "Se permite la eliminación irreversible de mensajes sólo si tu contacto también la permite para tí.";
/* No comment provided by engineer. */
"Allow sending direct messages to members." = "Permitir el envío de mensajes directos a los miembros.";
/* No comment provided by engineer. */
"Allow sending disappearing messages." = "Permitir el envío de mensajes temporales.";
"Allow sending disappearing messages." = "Permites el envío de mensajes temporales.";
/* No comment provided by engineer. */
"Allow to irreversibly delete sent messages." = "Permitir la eliminación irreversible de los mensajes enviados.";
"Allow to irreversibly delete sent messages." = "Permites la eliminación irreversible de los mensajes enviados.";
/* No comment provided by engineer. */
"Allow to send voice messages." = "Permitir enviar mensajes de voz.";
"Allow to send voice messages." = "Permites enviar mensajes de voz.";
/* No comment provided by engineer. */
"Allow voice messages only if your contact allows them." = "Permitir mensajes de voz sólo si tu contacto los permite.";
"Allow voice messages only if your contact allows them." = "Se permiten mensajes de voz sólo si tu contacto también los permite.";
/* No comment provided by engineer. */
"Allow voice messages?" = "¿Permitir mensajes de voz?";
"Allow voice messages?" = "¿Permites los mensajes de voz?";
/* No comment provided by engineer. */
"Allow your contacts to irreversibly delete sent messages." = "Permitir a tus contactos eliminar irreversiblemente los mensajes enviados.";
"Allow your contacts to irreversibly delete sent messages." = "Permites a tus contactos eliminar irreversiblemente los mensajes enviados.";
/* No comment provided by engineer. */
"Allow your contacts to send disappearing messages." = "Permitir a tus contactos enviar mensajes temporales.";
"Allow your contacts to send disappearing messages." = "Permites a tus contactos enviar mensajes temporales.";
/* No comment provided by engineer. */
"Allow your contacts to send voice messages." = "Permitir a tus contactos enviar mensajes de voz.";
"Allow your contacts to send voice messages." = "Permites a tus contactos enviar mensajes de voz.";
/* No comment provided by engineer. */
"Already connected?" = "¿Ya está conectado?";
@@ -383,9 +383,15 @@
/* integrity error chat item */
"bad message hash" = "hash de mensaje erróneo";
/* No comment provided by engineer. */
"Bad message hash" = "Hash de mensaje incorrecto";
/* integrity error chat item */
"bad message ID" = "ID de mensaje erróneo";
/* No comment provided by engineer. */
"Bad message ID" = "ID de mensaje incorrecto";
/* No comment provided by engineer. */
"bold" = "negrita";
@@ -425,11 +431,8 @@
/* No comment provided by engineer. */
"Can't invite contacts!" = "¡No se puede invitar a los contactos!";
/* chat item action */
"Cancel" = "Cancelar";
/* No comment provided by engineer. */
"Cancel file transfer?" = "¿Cancelar el envío de archivos?";
"Cancel" = "Cancelar";
/* feature offered item */
"cancelled %@" = "cancelado %@";
@@ -453,10 +456,10 @@
"Change member role?" = "¿Cambiar el rol del miembro?";
/* authentication reason */
"Change passcode" = "Cambiar contraseña";
"Change passcode" = "Cambiar el código de acceso";
/* No comment provided by engineer. */
"Change Passcode" = "Cambiar contraseña";
"Change Passcode" = "Cambiar el código de acceso";
/* No comment provided by engineer. */
"Change receiving address" = "Cambiar la dirección de recepción";
@@ -561,7 +564,7 @@
"Confirm new passphrase…" = "Confirme nueva contraseña…";
/* No comment provided by engineer. */
"Confirm Passcode" = "Confirmar contraseña";
"Confirm Passcode" = "Confirmar el código de acceso";
/* No comment provided by engineer. */
"Confirm password" = "Confirmar contraseña";
@@ -675,7 +678,7 @@
"Contact requests" = "Solicitud del contacto";
/* No comment provided by engineer. */
"Contacts can mark messages for deletion; you will be able to view them." = "El contacto puede marcar los mensajes para eliminar; tu podrás verlos.";
"Contacts can mark messages for deletion; you will be able to view them." = "El contacto solo puede marcar los mensajes para eliminar. Tu podrás verlos.";
/* chat item action */
"Copy" = "Copiar";
@@ -699,7 +702,7 @@
"Create link" = "Crear enlace";
/* No comment provided by engineer. */
"Create one-time invitation link" = "Crear enlace de invitación de un uso";
"Create one-time invitation link" = "Crear enlace de invitación de un solo uso";
/* server test step */
"Create queue" = "Crear cola";
@@ -717,7 +720,7 @@
"creator" = "creador";
/* No comment provided by engineer. */
"Current Passcode" = "Contraseña actual";
"Current Passcode" = "Código de acceso actual";
/* No comment provided by engineer. */
"Current passphrase…" = "Contraseña actual…";
@@ -785,6 +788,9 @@
/* No comment provided by engineer. */
"Decentralized" = "Descentralizado";
/* No comment provided by engineer. */
"Decryption error" = "Error de descifrado";
/* pref value */
"default (%@)" = "por defecto (%@)";
@@ -876,7 +882,7 @@
"Delete old database" = "Eliminar base de datos antigua";
/* No comment provided by engineer. */
"Delete old database?" = "¿Eliminar base de datos antígua?";
"Delete old database?" = "¿Eliminar base de datos antigua?";
/* No comment provided by engineer. */
"Delete pending connection" = "Eliminar conexión pendiente";
@@ -912,10 +918,10 @@
"Device" = "Dispositivo";
/* No comment provided by engineer. */
"Device authentication is disabled. Turning off SimpleX Lock." = "Autenticación de dispositivo desactivada. SimpleX Lock deshabilitado.";
"Device authentication is disabled. Turning off SimpleX Lock." = "Autenticación de dispositivo desactivada. Bloqueo SimpleX deshabilitado.";
/* No comment provided by engineer. */
"Device authentication is not enabled. You can turn on SimpleX Lock via Settings, once you enable device authentication." = "Autenticación de dispositivo desactivada. Puedes habilitar SimpleX Lock en Configuración, después de activar la autenticación de dispositivo.";
"Device authentication is not enabled. You can turn on SimpleX Lock via Settings, once you enable device authentication." = "Autenticación de dispositivo desactivada. Puedes habilitar Bloqueo SimpleX en Configuración, después de activar la autenticación de dispositivo.";
/* No comment provided by engineer. */
"different migration in the app/database: %@ / %@" = "migración diferente en la aplicación/base de datos: %@ / %@";
@@ -933,7 +939,7 @@
"Direct messages between members are prohibited in this group." = "Los mensajes directos entre miembros del grupo no están permitidos.";
/* authentication reason */
"Disable SimpleX Lock" = "Desactivar SimpleX Lock";
"Disable SimpleX Lock" = "Desactivar Bloqueo SimpleX";
/* chat feature */
"Disappearing messages" = "Mensajes temporales";
@@ -1002,7 +1008,7 @@
"Enable periodic notifications?" = "¿Activar notificaciones periódicas?";
/* authentication reason */
"Enable SimpleX Lock" = "Activar SimpleX Lock";
"Enable SimpleX Lock" = "Activar Bloqueo SimpleX";
/* No comment provided by engineer. */
"Enable TCP keep-alive" = "Activar TCP keep-alive";
@@ -1053,7 +1059,7 @@
"Enter correct passphrase." = "Introduce la contraseña correcta.";
/* No comment provided by engineer. */
"Enter Passcode" = "Introducir contraseña";
"Enter Passcode" = "Introducir código de acceso";
/* No comment provided by engineer. */
"Enter passphrase…" = "Introduce la contraseña…";
@@ -1116,7 +1122,7 @@
"Error deleting database" = "Error eliminando base de datos";
/* No comment provided by engineer. */
"Error deleting old database" = "Error eliminando base de datos antígua";
"Error deleting old database" = "Error eliminando base de datos antigua";
/* No comment provided by engineer. */
"Error deleting token" = "Error eliminando token";
@@ -1158,7 +1164,7 @@
"Error saving ICE servers" = "Error guardando servidores ICE";
/* No comment provided by engineer. */
"Error saving passcode" = "Error al guardar contraseña";
"Error saving passcode" = "Error al guardar el código de acceso";
/* No comment provided by engineer. */
"Error saving passphrase to keychain" = "Error guardando contraseña en Keychain";
@@ -1205,9 +1211,6 @@
/* No comment provided by engineer. */
"Exit without saving" = "Salir sin guardar";
/* No comment provided by engineer. */
"Experimental" = "Experimental";
/* No comment provided by engineer. */
"Export database" = "Exportar base de datos";
@@ -1223,9 +1226,6 @@
/* No comment provided by engineer. */
"Failed to remove passphrase" = "Error eliminando la contraseña";
/* No comment provided by engineer. */
"File transfer will be cancelled. If it's in progress it will be stoppped." = "El envío de archivos será cancelado. Si está en progreso se detendrá.";
/* No comment provided by engineer. */
"File will be received when your contact completes uploading it." = "El archivo se recibirá cuando tu contacto termine de subirlo.";
@@ -1422,7 +1422,7 @@
"Incognito mode is not supported here - your main profile will be sent to group members" = "El modo incógnito no se admite aquí, tu perfil principal aparecerá en miembros del grupo";
/* No comment provided by engineer. */
"Incognito mode protects the privacy of your main profile name and image — for each new contact a new random profile is created." = "El modo incógnito protege la identidad del perfil principal, por cada contacto nuevo se genera un perfil nuevo aleatorio.";
"Incognito mode protects the privacy of your main profile name and image — for each new contact a new random profile is created." = "La función del modo incógnito es proteger la identidad del perfil principal: por cada contacto nuevo se genera un perfil aleatorio.";
/* chat list item description */
"incognito via contact address link" = "Incógnito mediante enlace de dirección del contacto";
@@ -1446,7 +1446,7 @@
"Incompatible database version" = "Versión de base de datos incompatible";
/* PIN entry */
"Incorrect passcode" = "Contraseña incorrecta";
"Incorrect passcode" = "Código de acceso incorrecto";
/* No comment provided by engineer. */
"Incorrect security code!" = "¡Código de seguridad incorrecto!";
@@ -1524,10 +1524,13 @@
"Irreversible message deletion is prohibited in this group." = "La eliminación irreversible de mensajes no está permitida en este grupo.";
/* No comment provided by engineer. */
"It allows having many anonymous connections without any shared data between them in a single chat profile." = "Permite tener varias conexiones anónimas sin datos compartidos entre estas en un único perfil de chat.";
"It allows having many anonymous connections without any shared data between them in a single chat profile." = "Permite tener varias conexiones anónimas sin datos compartidos entre estas dentro del mismo perfil.";
/* No comment provided by engineer. */
"It can happen when:\n1. The messages expire on the server if they were not received for 30 days,\n2. The server you use to receive the messages from this contact was updated and restarted.\n3. The connection is compromised.\nPlease connect to the developers via Settings to receive the updates about the servers.\nWe will be adding server redundancy to prevent lost messages." = "Esto puede suceder cuando:\n1. Los mensajes caducan en el servidor si no se han recibido durante 30 días.\n2. El servidor que utiliza para recibir los mensajes de este contacto fue actualizado y reiniciado.\n3. La conexión está comprometida.\nPor favor, contacta con los desarrolladores a través del menú Configuración para recibir actualizaciones sobre los servidores.\nAñadiremos redundancia de servidores para evitar la pérdida de mensajes.";
"It can happen when you or your connection used the old database backup." = "Puede ocurrir cuando tu o tu contacto estáis usando una copia de seguridad antigua de la base de datos.";
/* No comment provided by engineer. */
"It can happen when:\n1. The messages expired in the sending client after 2 days or on the server after 30 days.\n2. Message decryption failed, because you or your contact used old database backup.\n3. The connection was compromised." = "Esto puede suceder cuando:\n1. Los mensajes caducan en el cliente saliente tras 2 días o en el servidor tras 30 días.\n2. El descifrado ha fallado porque tu o tu contacto estáis usando una copia de seguridad antigua de la base de datos.\n3. La conexión ha sido comprometida.";
/* No comment provided by engineer. */
"It seems like you are already connected via this link. If it is not the case, there was an error (%@)." = "Parece que ya está conectado mediante este enlace. Si no es así ha habido un error (%@).";
@@ -1749,7 +1752,7 @@
"New message" = "mensaje nuevo";
/* No comment provided by engineer. */
"New Passcode" = "Nueva contraseña";
"New Passcode" = "Código de acceso nuevo";
/* No comment provided by engineer. */
"New passphrase…" = "Contraseña nueva…";
@@ -1816,7 +1819,7 @@
"Ok" = "Ok";
/* No comment provided by engineer. */
"Old database" = "Base de datos antígua";
"Old database" = "Base de datos antigua";
/* No comment provided by engineer. */
"Old database archive" = "Archivo de base de datos antiguo";
@@ -1846,7 +1849,7 @@
"Only group owners can enable voice messages." = "Sólo los propietarios del grupo pueden activar los mensajes de voz.";
/* No comment provided by engineer. */
"Only you can irreversibly delete messages (your contact can mark them for deletion)." = "Sólo tú puedes eliminar mensajes de forma irreversible (tu contacto puede marcar para eliminar).";
"Only you can irreversibly delete messages (your contact can mark them for deletion)." = "Sólo tú puedes eliminar mensajes de forma irreversible (tu contacto puede marcarlos para eliminar).";
/* No comment provided by engineer. */
"Only you can send disappearing messages." = "Sólo tú puedes enviar mensajes temporales.";
@@ -1855,7 +1858,7 @@
"Only you can send voice messages." = "Sólo tú puedes enviar mensajes de voz.";
/* No comment provided by engineer. */
"Only your contact can irreversibly delete messages (you can mark them for deletion)." = "Sólo tu contacto puede eliminar mensajes de forma irreversible (tu puedes marcar para eliminar).";
"Only your contact can irreversibly delete messages (you can mark them for deletion)." = "Sólo tu contacto puede eliminar mensajes de forma irreversible (tu puedes marcarlos para eliminar).";
/* No comment provided by engineer. */
"Only your contact can send disappearing messages." = "Sólo tu contacto puede enviar mensajes temporales.";
@@ -1888,19 +1891,19 @@
"owner" = "propietario";
/* No comment provided by engineer. */
"Passcode" = "Contraseña";
"Passcode" = "Código de acceso";
/* No comment provided by engineer. */
"Passcode changed!" = "¡Contraseña cambiada!";
"Passcode changed!" = "¡Código de acceso cambiado!";
/* No comment provided by engineer. */
"Passcode entry" = "Entrada de contraseña";
"Passcode entry" = "Campo de código de acceso";
/* No comment provided by engineer. */
"Passcode not changed!" = "¡Contraseña no cambiada!";
"Passcode not changed!" = "¡Código de acceso no cambiado!";
/* No comment provided by engineer. */
"Passcode set!" = "¡Contraseña guardada!";
"Passcode set!" = "¡Código de acceso guardado!";
/* No comment provided by engineer. */
"Password to show" = "Contraseña para hacerlo visible";
@@ -1926,6 +1929,9 @@
/* No comment provided by engineer. */
"Periodically" = "Periódico";
/* message decrypt error item */
"Permanent decryption error" = "Error de descifrado";
/* No comment provided by engineer. */
"PING count" = "Contador PING";
@@ -1954,7 +1960,10 @@
"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 la contraseña en un lugar seguro. ¡No hay manera de recuperar una contraseña perdida!";
"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 ninguna manera de recuperar un código de acceso perdido!";
/* No comment provided by engineer. */
"Please report it to the developers." = "Por favor, informa a los desarrolladores.";
/* No comment provided by engineer. */
"Please restart the app and migrate the database to enable push notifications." = "Reinicia la aplicación y migra la base de datos para activar las notificaciones automáticas.";
@@ -2002,16 +2011,16 @@
"Prohibit sending direct messages to members." = "Prohibir el envío de mensajes directos a los miembros.";
/* No comment provided by engineer. */
"Prohibit sending disappearing messages." = "Prohibir el envío de mensajes temporales.";
"Prohibit sending disappearing messages." = "Prohibes el envío de mensajes temporales.";
/* No comment provided by engineer. */
"Prohibit sending voice messages." = "Prohibir el envío de mensajes de voz.";
"Prohibit sending voice messages." = "Prohibes el envío de mensajes de voz.";
/* No comment provided by engineer. */
"Protect app screen" = "Proteger la pantalla de la aplicación";
/* No comment provided by engineer. */
"Protect your chat profiles with a password!" = "¡Protege tus perfiles Chat con contraseña!";
"Protect your chat profiles with a password!" = "¡Protege tus perfiles con contraseña!";
/* No comment provided by engineer. */
"Protocol timeout" = "Tiempo de espera del protocolo";
@@ -2235,9 +2244,6 @@
/* No comment provided by engineer. */
"Send them from gallery or custom keyboards." = "Envíalos desde la galería o desde teclados personalizados.";
/* No comment provided by engineer. */
"Send videos and files via XFTP" = "Enviar archivos vía XFTP";
/* No comment provided by engineer. */
"Sender cancelled file transfer." = "El remitente ha cancelado la transferencia de archivos.";
@@ -2404,7 +2410,7 @@
"Tap button " = "Pulsa el botón ";
/* No comment provided by engineer. */
"Tap to activate profile." = "Pulsa para activar el perfil.";
"Tap to activate profile." = "Pulsa sobre un perfil para activarlo.";
/* No comment provided by engineer. */
"Tap to join" = "Pulsa para unirse";
@@ -2469,6 +2475,12 @@
/* No comment provided by engineer. */
"The group is fully decentralized it is visible only to the members." = "El grupo está totalmente descentralizado y sólo es visible para los miembros.";
/* No comment provided by engineer. */
"The hash of the previous message is different." = "El hash del mensaje anterior es diferente.";
/* No comment provided by engineer. */
"The ID of the next message is incorrect (less or equal to the previous).\nIt can happen because of some bug or when the connection is compromised." = "El ID del siguiente mensaje es incorrecto (menor o igual que el anterior).\nPuede ocurrir por algún bug o cuando la conexión está comprometida.";
/* No comment provided by engineer. */
"The message will be deleted for all members." = "El mensaje se eliminará para todos los miembros.";
@@ -2511,6 +2523,9 @@
/* notification title */
"this contact" = "este contacto";
/* No comment provided by engineer. */
"This error is permanent for this connection, please re-connect." = "El error es permanente para esta conexión, por favor vuelve a conectarte.";
/* No comment provided by engineer. */
"This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member)." = "¡Experimental! Sólo funcionará si el otro cliente tiene instalada la versión 4.2. Deberías ver el mensaje en la conversación una vez completado el cambio de dirección. Comprueba que puedes seguir recibiendo mensajes de este contacto (o miembro del grupo).";
@@ -2524,7 +2539,7 @@
"To ask any questions and to receive updates:" = "Para consultar cualquier duda y recibir actualizaciones:";
/* No comment provided by engineer. */
"To find the profile used for an incognito connection, tap the contact or group name on top of the chat." = "Para encontrar el perfil usado en una conexión en modo incógnito, pulsa el nombre del contacto o del grupo en la parte superior del chat.";
"To find the profile used for an incognito connection, tap the contact or group name on top of the chat." = "Para conocer el perfil usado en una conexión en modo incógnito, pulsa el nombre del contacto o del grupo en la parte superior del chat.";
/* No comment provided by engineer. */
"To make a new connection" = "Para hacer una conexión nueva";
@@ -2536,7 +2551,7 @@
"To protect timezone, image/voice files use UTC." = "Para proteger la zona horaria, los archivos de imagen/voz usan la hora UTC.";
/* No comment provided by engineer. */
"To protect your information, turn on SimpleX Lock.\nYou will be prompted to complete authentication before this feature is enabled." = "Para proteger tu información, activa SimpleX Lock.\nSe te pedirá que completes la autenticación antes de activar esta función.";
"To protect your information, turn on SimpleX Lock.\nYou will be prompted to complete authentication before this feature is enabled." = "Para proteger tu información, activa Bloqueo SimpleX.\nSe te pedirá que completes la autenticación antes de activar esta función.";
/* No comment provided by engineer. */
"To record voice message please grant permission to use Microphone." = "Para grabar el mensaje de voz concede permiso para usar el micrófono.";
@@ -2676,9 +2691,6 @@
/* No comment provided by engineer. */
"v%@ (%@)" = "v%@ (%@)";
/* No comment provided by engineer. */
"v4.6.1+ is required to receive via XFTP." = "Se requiere v4.6.1+ para recibir vía XFTP.";
/* No comment provided by engineer. */
"Verify connection security" = "Comprobar la seguridad de la conexión";
@@ -2767,7 +2779,7 @@
"When available" = "Cuando esté disponible";
/* No comment provided by engineer. */
"When you share an incognito profile with somebody, this profile will be used for the groups they invite you to." = "Cuando compartes un perfil incógnito con alguien, este perfil se usará para los grupos a los que te inviten.";
"When you share an incognito profile with somebody, this profile will be used for the groups they invite you to." = "Cuando compartes un perfil incógnito con alguien, este perfil también se usará para los grupos a los que te inviten.";
/* No comment provided by engineer. */
"With optional welcome message." = "Con mensaje de bienvenida opcional.";
@@ -2818,7 +2830,7 @@
"You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button." = "También puedes conectarte haciendo clic en el enlace. Si se abre en el navegador, haz clic en el botón **Abrir en aplicación móvil**.";
/* No comment provided by engineer. */
"You can hide or mute a user profile - swipe it to the right.\nSimpleX Lock must be enabled." = "Puedes ocultar o silenciar un perfil de usuario: deslízalo hacia la derecha.\nSimpleX Lock debe estar activado.";
"You can hide or mute a user profile - swipe it to the right.\nSimpleX Lock must be enabled." = "Puedes ocultar o silenciar un perfil de usuario: deslízalo hacia la derecha.\nBloqueo SimpleX debe estar activado.";
/* notification body */
"You can now send messages to %@" = "Ya puedes enviar mensajes a %@";
@@ -2836,7 +2848,7 @@
"You can start chat via app Settings / Database or by restarting the app" = "Puede iniciar Chat a través de la Configuración / Base de datos de la aplicación o reiniciando la aplicación";
/* No comment provided by engineer. */
"You can turn on SimpleX Lock via Settings." = "Puedes activar el bloqueo de SimpleX a través de Configuración.";
"You can turn on SimpleX Lock via Settings." = "Puedes activar el Bloqueo SimpleX a través de Configuración.";
/* No comment provided by engineer. */
"You can use markdown to format messages:" = "Puedes usar sintaxis markdown para dar formato a los mensajes:";
@@ -2884,7 +2896,7 @@
"You must use the most recent version of your chat database on one device ONLY, otherwise you may stop receiving the messages from some contacts." = "Debes usar la versión más reciente de tu base de datos ÚNICAMENTE en un dispositivo, de lo contrario podrías dejar de recibir mensajes de algunos contactos.";
/* No comment provided by engineer. */
"You need to allow your contact to send voice messages to be able to send them." = "Para poder enviar mensajes de voz debes permitir que tu contacto pueda enviarlos.";
"You need to allow your contact to send voice messages to be able to send them." = "Para poder enviar mensajes de voz antes debes permitir que tu contacto pueda enviarlos.";
/* No comment provided by engineer. */
"You rejected group invitation" = "Has rechazado la invitación del grupo";
@@ -2926,10 +2938,10 @@
"you: " = "tú: ";
/* No comment provided by engineer. */
"You're trying to invite contact with whom you've shared an incognito profile to the group in which you're using your main profile" = "Estás intentando invitar a un contacto con el que has compartido un perfil incógnito, al grupo en el que utilizas tu perfil principal";
"You're trying to invite contact with whom you've shared an incognito profile to the group in which you're using your main profile" = "Estás intentando invitar a un contacto con el que compartes un perfil incógnito a un grupo en el que usas tu perfil principal";
/* No comment provided by engineer. */
"You're using an incognito profile for this group - to prevent sharing your main profile inviting contacts is not allowed" = "Estás utilizando un perfil incógnito para este grupo. Para evitar compartir tu perfil principal, invitar contactos no está permitido";
"You're using an incognito profile for this group - to prevent sharing your main profile inviting contacts is not allowed" = "Estás usando un perfil incógnito para este grupo, por tanto para evitar compartir tu perfil principal no se permite invitar contactos";
/* No comment provided by engineer. */
"Your %@ servers" = "Tus servidores %@";
@@ -2950,13 +2962,13 @@
"Your chat profile will be sent to your contact" = "Tu perfil Chat será enviado a tu contacto";
/* No comment provided by engineer. */
"Your chat profiles" = "Tus perfiles Chat";
"Your chat profiles" = "Mis perfiles";
/* No comment provided by engineer. */
"Your chats" = "Tus chats";
/* No comment provided by engineer. */
"Your contact address" = "Tu dirección de contacto";
"Your contact address" = "Mi dirección de contacto";
/* No comment provided by engineer. */
"Your contact can scan it from the app." = "Tu contacto puede escanearlo desde la aplicación.";
@@ -2983,7 +2995,7 @@
"Your preferences" = "Tus preferencias";
/* No comment provided by engineer. */
"Your privacy" = "Tu privacidad";
"Your privacy" = "Privacidad";
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts.\nSimpleX servers cannot see your profile." = "Tu perfil se almacena en tu dispositivo y sólo se comparte con tus contactos.\nLos servidores de SimpleX no pueden ver tu perfil.";
@@ -3004,10 +3016,10 @@
"Your server address" = "Dirección de tu servidor";
/* No comment provided by engineer. */
"Your settings" = "Tu configuración";
"Your settings" = "Mi configuración";
/* No comment provided by engineer. */
"Your SimpleX contact address" = "Tu dirección de contacto SimpleX";
"Your SimpleX contact address" = "Mi dirección de contacto SimpleX";
/* No comment provided by engineer. */
"Your SMP servers" = "Tus servidores SMP";
+79 -16
View File
@@ -284,6 +284,9 @@
/* No comment provided by engineer. */
"Allow" = "Autoriser";
/* No comment provided by engineer. */
"Allow calls only if your contact allows them." = "Autoriser les appels que si votre contact les autorise.";
/* No comment provided by engineer. */
"Allow disappearing messages only if your contact allows it to you." = "Autorise les messages éphémères seulement si votre contact vous lautorise.";
@@ -308,6 +311,9 @@
/* No comment provided by engineer. */
"Allow voice messages?" = "Autoriser les messages vocaux ?";
/* No comment provided by engineer. */
"Allow your contacts to call you." = "Autorise vos contacts à vous appeler.";
/* No comment provided by engineer. */
"Allow your contacts to irreversibly delete sent messages." = "Autorise vos contacts à supprimer de manière irréversible les messages envoyés.";
@@ -356,6 +362,12 @@
/* No comment provided by engineer. */
"audio call (not e2e encrypted)" = "appel audio (sans chiffrement)";
/* chat feature */
"Audio/video calls" = "Appels audio/vidéo";
/* No comment provided by engineer. */
"Audio/video calls are prohibited." = "Interdire les appels audio/vidéo.";
/* PIN entry */
"Authentication cancelled" = "Authentification interrompue";
@@ -383,15 +395,24 @@
/* integrity error chat item */
"bad message hash" = "hash de message incorrect";
/* No comment provided by engineer. */
"Bad message hash" = "Mauvais hash de message";
/* integrity error chat item */
"bad message ID" = "ID de message incorrecte";
/* No comment provided by engineer. */
"Bad message ID" = "Mauvais ID de message";
/* No comment provided by engineer. */
"bold" = "gras";
/* No comment provided by engineer. */
"Both you and your contact can irreversibly delete sent messages." = "Vous et votre contact êtes tous deux en mesure de supprimer de manière irréversible les messages envoyés.";
/* No comment provided by engineer. */
"Both you and your contact can make calls." = "Vous et votre contact pouvez tous deux passer des appels.";
/* No comment provided by engineer. */
"Both you and your contact can send disappearing messages." = "Vous et votre contact êtes tous deux en mesure d'envoyer des messages éphémères.";
@@ -425,11 +446,8 @@
/* No comment provided by engineer. */
"Can't invite contacts!" = "Impossible d'inviter les contacts !";
/* chat item action */
"Cancel" = "Annuler";
/* No comment provided by engineer. */
"Cancel file transfer?" = "Annuler le transfert de fichiers ?";
"Cancel" = "Annuler";
/* feature offered item */
"cancelled %@" = "annulé %@";
@@ -785,6 +803,9 @@
/* No comment provided by engineer. */
"Decentralized" = "Décentralisé";
/* No comment provided by engineer. */
"Decryption error" = "Erreur de déchiffrement";
/* pref value */
"default (%@)" = "défaut (%@)";
@@ -1205,9 +1226,6 @@
/* No comment provided by engineer. */
"Exit without saving" = "Quitter sans sauvegarder";
/* No comment provided by engineer. */
"Experimental" = "Expérimental";
/* No comment provided by engineer. */
"Export database" = "Exporter la base de données";
@@ -1224,7 +1242,7 @@
"Failed to remove passphrase" = "Échec de la suppression de la phrase secrète";
/* No comment provided by engineer. */
"File transfer will be cancelled. If it's in progress it will be stoppped." = "Le transfert de fichiers sera annulé. S'il est en cours, il sera interrompu.";
"File will be deleted from servers." = "Le fichier sera supprimé des serveurs.";
/* No comment provided by engineer. */
"File will be received when your contact completes uploading it." = "Le fichier sera reçu lorsque votre contact aura terminé de le mettre en ligne.";
@@ -1527,7 +1545,10 @@
"It allows having many anonymous connections without any shared data between them in a single chat profile." = "Cela permet d'avoir plusieurs connections anonymes sans aucune données partagées entre elles sur un même profil.";
/* No comment provided by engineer. */
"It can happen when:\n1. The messages expire on the server if they were not received for 30 days,\n2. The server you use to receive the messages from this contact was updated and restarted.\n3. The connection is compromised.\nPlease connect to the developers via Settings to receive the updates about the servers.\nWe will be adding server redundancy to prevent lost messages." = "C'est possible quand :\n1. Les messages expirent du serveur (après 30 jours si ils ne sont pas reçu).\n2. Le serveur que vous utilisez pour recevoir les messages de ce contact a été mise à jour ou redémarré.\n3. La connection est compromise.\nVeuillez vous connecter aux développeurs via les Paramètres pour recevoir les mises à jour concernant les serveurs.\nNous allons ajouter une redondance des serveurs pour éviter la perte de messages.";
"It can happen when you or your connection used the old database backup." = "Cela peut se produire lorsque vous ou votre contact avez utilisé une ancienne sauvegarde de base de données.";
/* No comment provided by engineer. */
"It can happen when:\n1. The messages expired in the sending client after 2 days or on the server after 30 days.\n2. Message decryption failed, because you or your contact used old database backup.\n3. The connection was compromised." = "Cela peut arriver quand :\n1. Les messages ont expiré dans le client expéditeur après 2 jours ou sur le serveur après 30 jours.\n2. Le déchiffrement du message a échoué, car vous ou votre contact avez utilisé une ancienne sauvegarde de base de données.\n3. La connexion a été compromise.";
/* No comment provided by engineer. */
"It seems like you are already connected via this link. If it is not the case, there was an error (%@)." = "Il semblerait que vous êtes déjà connecté via ce lien. Si ce n'est pas le cas, il y a eu une erreur (%@).";
@@ -1848,6 +1869,9 @@
/* No comment provided by engineer. */
"Only you can irreversibly delete messages (your contact can mark them for deletion)." = "Vous êtes le seul à pouvoir supprimer des messages de manière irréversible (votre contact peut les marquer comme supprimé).";
/* No comment provided by engineer. */
"Only you can make calls." = "Vous seul pouvez passer des appels.";
/* No comment provided by engineer. */
"Only you can send disappearing messages." = "Seulement vous pouvez envoyer des messages éphémères.";
@@ -1857,6 +1881,9 @@
/* No comment provided by engineer. */
"Only your contact can irreversibly delete messages (you can mark them for deletion)." = "Seul votre contact peut supprimer de manière irréversible des messages (vous pouvez les marquer comme supprimé).";
/* No comment provided by engineer. */
"Only your contact can make calls." = "Seul votre contact peut passer des appels.";
/* No comment provided by engineer. */
"Only your contact can send disappearing messages." = "Seulement votre contact peut envoyer des messages éphémères.";
@@ -1926,6 +1953,9 @@
/* No comment provided by engineer. */
"Periodically" = "Périodique";
/* message decrypt error item */
"Permanent decryption error" = "Erreur de déchiffrement";
/* No comment provided by engineer. */
"PING count" = "Nombre de PING";
@@ -1956,6 +1986,9 @@
/* No comment provided by engineer. */
"Please remember or store it securely - there is no way to recover a lost passcode!" = "N'oubliez pas de le mémoriser ou de le conserver en toute sécurité - il n'y a aucun moyen de récupérer un code d'accès perdu !";
/* No comment provided by engineer. */
"Please report it to the developers." = "Veuillez le signaler aux développeurs.";
/* No comment provided by engineer. */
"Please restart the app and migrate the database to enable push notifications." = "Veuillez redémarrer l'app et migrer la base de données pour activer les notifications push.";
@@ -1995,6 +2028,9 @@
/* No comment provided by engineer. */
"Profile password" = "Mot de passe de profil";
/* No comment provided by engineer. */
"Prohibit audio/video calls." = "Interdire les appels audio/vidéo.";
/* No comment provided by engineer. */
"Prohibit irreversible message deletion." = "Interdire la suppression irréversible des messages.";
@@ -2002,7 +2038,7 @@
"Prohibit sending direct messages to members." = "Interdire l'envoi de messages directs aux membres.";
/* No comment provided by engineer. */
"Prohibit sending disappearing messages." = "Interdit lenvoi de messages éphémères.";
"Prohibit sending disappearing messages." = "Interdire lenvoi de messages éphémères.";
/* No comment provided by engineer. */
"Prohibit sending voice messages." = "Interdire l'envoi de messages vocaux.";
@@ -2040,6 +2076,9 @@
/* notification */
"Received file event" = "Événement de fichier reçu";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "La réception du fichier sera interrompue.";
/* No comment provided by engineer. */
"Receiving via" = "Réception via";
@@ -2127,6 +2166,15 @@
/* No comment provided by engineer. */
"Revert" = "Revenir en arrière";
/* No comment provided by engineer. */
"Revoke" = "Révoquer";
/* cancel file action */
"Revoke file" = "Révoquer le fichier";
/* No comment provided by engineer. */
"Revoke file?" = "Révoquer le fichier ?";
/* No comment provided by engineer. */
"Role" = "Rôle";
@@ -2235,15 +2283,15 @@
/* No comment provided by engineer. */
"Send them from gallery or custom keyboards." = "Envoyez-les depuis la phototèque ou des claviers personnalisés.";
/* No comment provided by engineer. */
"Send videos and files via XFTP" = "Envoi de fichiers via XFTP";
/* No comment provided by engineer. */
"Sender cancelled file transfer." = "L'expéditeur a annulé le transfert de fichiers.";
/* No comment provided by engineer. */
"Sender may have deleted the connection request." = "L'expéditeur a peut-être supprimé la demande de connexion.";
/* No comment provided by engineer. */
"Sending file will be stopped." = "L'envoi du fichier sera interrompu.";
/* No comment provided by engineer. */
"Sending via" = "Envoi via";
@@ -2379,6 +2427,15 @@
/* No comment provided by engineer. */
"Stop chat?" = "Arrêter le chat ?";
/* cancel file action */
"Stop file" = "Arrêter le fichier";
/* No comment provided by engineer. */
"Stop receiving file?" = "Arrêter de recevoir le fichier ?";
/* No comment provided by engineer. */
"Stop sending file?" = "Arrêter l'envoi du fichier ?";
/* authentication reason */
"Stop SimpleX" = "Arrêter SimpleX";
@@ -2469,6 +2526,12 @@
/* No comment provided by engineer. */
"The group is fully decentralized it is visible only to the members." = "Le groupe est entièrement décentralisé il n'est visible que par ses membres.";
/* No comment provided by engineer. */
"The hash of the previous message is different." = "Le hash du message précédent est différent.";
/* No comment provided by engineer. */
"The ID of the next message is incorrect (less or equal to the previous).\nIt can happen because of some bug or when the connection is compromised." = "L'ID du message suivant est incorrect (inférieur ou égal au précédent).\nCela peut se produire en raison d'un bug ou lorsque la connexion est compromise.";
/* No comment provided by engineer. */
"The message will be deleted for all members." = "Le message sera supprimé pour tous les membres.";
@@ -2511,6 +2574,9 @@
/* notification title */
"this contact" = "ce contact";
/* No comment provided by engineer. */
"This error is permanent for this connection, please re-connect." = "Cette erreur est persistante pour cette connexion, veuillez vous reconnecter.";
/* No comment provided by engineer. */
"This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member)." = "Cette fonctionnalité est expérimentale ! Elle ne fonctionnera que si l'autre client a la version 4.2 installée. Vous devriez voir le message dans la conversation une fois le changement d'adresse effectué. Vérifiez que vous pouvez toujours recevoir des messages de ce contact (ou membre du groupe).";
@@ -2676,9 +2742,6 @@
/* No comment provided by engineer. */
"v%@ (%@)" = "v%@ (%@)";
/* No comment provided by engineer. */
"v4.6.1+ is required to receive via XFTP." = "v4.6.1+ nécessaire pour la réception via XFTP.";
/* No comment provided by engineer. */
"Verify connection security" = "Vérifier la sécurité de la connexion";
+78 -15
View File
@@ -284,6 +284,9 @@
/* No comment provided by engineer. */
"Allow" = "Consenti";
/* No comment provided by engineer. */
"Allow calls only if your contact allows them." = "Consenti le chiamate solo se il contatto le consente.";
/* No comment provided by engineer. */
"Allow disappearing messages only if your contact allows it to you." = "Consenti i messaggi a tempo solo se il contatto li consente a te.";
@@ -308,6 +311,9 @@
/* No comment provided by engineer. */
"Allow voice messages?" = "Consentire i messaggi vocali?";
/* No comment provided by engineer. */
"Allow your contacts to call you." = "Consenti ai tuoi contatti di chiamarti.";
/* No comment provided by engineer. */
"Allow your contacts to irreversibly delete sent messages." = "Permetti ai tuoi contatti di eliminare irreversibilmente i messaggi inviati.";
@@ -356,6 +362,12 @@
/* No comment provided by engineer. */
"audio call (not e2e encrypted)" = "chiamata audio (non crittografata e2e)";
/* chat feature */
"Audio/video calls" = "Chiamate audio/video";
/* No comment provided by engineer. */
"Audio/video calls are prohibited." = "Le chiamate audio/video sono vietate.";
/* PIN entry */
"Authentication cancelled" = "Autenticazione annullata";
@@ -383,15 +395,24 @@
/* integrity error chat item */
"bad message hash" = "hash del messaggio errato";
/* No comment provided by engineer. */
"Bad message hash" = "Hash del messaggio errato";
/* integrity error chat item */
"bad message ID" = "ID messaggio errato";
/* No comment provided by engineer. */
"Bad message ID" = "ID del messaggio errato";
/* No comment provided by engineer. */
"bold" = "grassetto";
/* No comment provided by engineer. */
"Both you and your contact can irreversibly delete sent messages." = "Sia tu che il tuo contatto potete eliminare irreversibilmente i messaggi inviati.";
/* No comment provided by engineer. */
"Both you and your contact can make calls." = "Sia tu che il tuo contatto potete effettuare chiamate.";
/* No comment provided by engineer. */
"Both you and your contact can send disappearing messages." = "Sia tu che il tuo contatto potete inviare messaggi a tempo.";
@@ -425,11 +446,8 @@
/* No comment provided by engineer. */
"Can't invite contacts!" = "Impossibile invitare i contatti!";
/* chat item action */
"Cancel" = "Annulla";
/* No comment provided by engineer. */
"Cancel file transfer?" = "Annullare il trasferimento di file?";
"Cancel" = "Annulla";
/* feature offered item */
"cancelled %@" = "annullato %@";
@@ -785,6 +803,9 @@
/* No comment provided by engineer. */
"Decentralized" = "Decentralizzato";
/* No comment provided by engineer. */
"Decryption error" = "Errore di decifrazione";
/* pref value */
"default (%@)" = "predefinito (%@)";
@@ -1205,9 +1226,6 @@
/* No comment provided by engineer. */
"Exit without saving" = "Esci senza salvare";
/* No comment provided by engineer. */
"Experimental" = "Sperimentale";
/* No comment provided by engineer. */
"Export database" = "Esporta database";
@@ -1224,7 +1242,7 @@
"Failed to remove passphrase" = "Rimozione della password fallita";
/* No comment provided by engineer. */
"File transfer will be cancelled. If it's in progress it will be stoppped." = "Il trasferimento di file verrà annullato. Se è in corso, verrà interrotto.";
"File will be deleted from servers." = "Il file verrà eliminato dai server.";
/* No comment provided by engineer. */
"File will be received when your contact completes uploading it." = "Il file verrà ricevuto quando il tuo contatto completerà l'invio.";
@@ -1527,7 +1545,10 @@
"It allows having many anonymous connections without any shared data between them in a single chat profile." = "Permette di avere molte connessioni anonime senza dati condivisi tra di loro in un unico profilo di chat.";
/* No comment provided by engineer. */
"It can happen when:\n1. The messages expire on the server if they were not received for 30 days,\n2. The server you use to receive the messages from this contact was updated and restarted.\n3. The connection is compromised.\nPlease connect to the developers via Settings to receive the updates about the servers.\nWe will be adding server redundancy to prevent lost messages." = "Può accadere quando:\n1. I messaggi scadono sul server se non sono stati ricevuti per 30 giorni,\n2. Il server usato per ricevere i messaggi da questo contatto è stato aggiornato e riavviato.\n3. La connessione è compromessa.\nConnettiti agli sviluppatori tramite Impostazioni per ricevere aggiornamenti riguardo i server.\nAggiungeremo la ridondanza del server per prevenire la perdita di messaggi.";
"It can happen when you or your connection used the old database backup." = "Può accadere quando tu o il tuo contatto avete usato il backup del database vecchio.";
/* 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." = "Può accadere quando:\n1. I messaggi sono scaduti sul client mittente dopo 2 giorni o sul server dopo 30 giorni.\n2. La decifrazione del messaggio è fallita, perché tu o il tuo contatto avete usato un backup del database vecchio.\n3. La connessione è stata compromessa.";
/* No comment provided by engineer. */
"It seems like you are already connected via this link. If it is not the case, there was an error (%@)." = "Sembra che tu sia già connesso tramite questo link. In caso contrario, c'è stato un errore (%@).";
@@ -1848,6 +1869,9 @@
/* No comment provided by engineer. */
"Only you can irreversibly delete messages (your contact can mark them for deletion)." = "Solo tu puoi eliminare irreversibilmente i messaggi (il tuo contatto può contrassegnarli per l'eliminazione).";
/* No comment provided by engineer. */
"Only you can make calls." = "Solo tu puoi effettuare chiamate.";
/* No comment provided by engineer. */
"Only you can send disappearing messages." = "Solo tu puoi inviare messaggi a tempo.";
@@ -1857,6 +1881,9 @@
/* No comment provided by engineer. */
"Only your contact can irreversibly delete messages (you can mark them for deletion)." = "Solo il tuo contatto può eliminare irreversibilmente i messaggi (tu puoi contrassegnarli per l'eliminazione).";
/* No comment provided by engineer. */
"Only your contact can make calls." = "Solo il tuo contatto può effettuare chiamate.";
/* No comment provided by engineer. */
"Only your contact can send disappearing messages." = "Solo il tuo contatto può inviare messaggi a tempo.";
@@ -1926,6 +1953,9 @@
/* No comment provided by engineer. */
"Periodically" = "Periodicamente";
/* message decrypt error item */
"Permanent decryption error" = "Errore di decifrazione";
/* No comment provided by engineer. */
"PING count" = "Conteggio PING";
@@ -1956,6 +1986,9 @@
/* No comment provided by engineer. */
"Please remember or store it securely - there is no way to recover a lost passcode!" = "Ricordalo o conservalo in modo sicuro: non c'è modo di recuperare un codice di accesso perso!";
/* No comment provided by engineer. */
"Please report it to the developers." = "Si prega di segnalarlo agli sviluppatori.";
/* No comment provided by engineer. */
"Please restart the app and migrate the database to enable push notifications." = "Riavvia l'app ed esegui la migrazione del database per attivare le notifiche push.";
@@ -1995,6 +2028,9 @@
/* No comment provided by engineer. */
"Profile password" = "Password del profilo";
/* No comment provided by engineer. */
"Prohibit audio/video calls." = "Proibisci le chiamate audio/video.";
/* No comment provided by engineer. */
"Prohibit irreversible message deletion." = "Proibisci l'eliminazione irreversibile dei messaggi.";
@@ -2040,6 +2076,9 @@
/* notification */
"Received file event" = "Evento file ricevuto";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "La ricezione del file verrà interrotta.";
/* No comment provided by engineer. */
"Receiving via" = "Ricezione via";
@@ -2127,6 +2166,15 @@
/* No comment provided by engineer. */
"Revert" = "Annulla";
/* No comment provided by engineer. */
"Revoke" = "Revoca";
/* cancel file action */
"Revoke file" = "Revoca file";
/* No comment provided by engineer. */
"Revoke file?" = "Revocare il file?";
/* No comment provided by engineer. */
"Role" = "Ruolo";
@@ -2235,15 +2283,15 @@
/* No comment provided by engineer. */
"Send them from gallery or custom keyboards." = "Inviali dalla galleria o dalle tastiere personalizzate.";
/* No comment provided by engineer. */
"Send videos and files via XFTP" = "Invia file tramite XFTP";
/* No comment provided by engineer. */
"Sender cancelled file transfer." = "Il mittente ha annullato il trasferimento del file.";
/* No comment provided by engineer. */
"Sender may have deleted the connection request." = "Il mittente potrebbe aver eliminato la richiesta di connessione.";
/* No comment provided by engineer. */
"Sending file will be stopped." = "L'invio del file verrà interrotto.";
/* No comment provided by engineer. */
"Sending via" = "Invio tramite";
@@ -2379,6 +2427,15 @@
/* No comment provided by engineer. */
"Stop chat?" = "Fermare la chat?";
/* cancel file action */
"Stop file" = "Ferma file";
/* No comment provided by engineer. */
"Stop receiving file?" = "Fermare la ricezione del file?";
/* No comment provided by engineer. */
"Stop sending file?" = "Fermare l'invio del file?";
/* authentication reason */
"Stop SimpleX" = "Ferma SimpleX";
@@ -2469,6 +2526,12 @@
/* No comment provided by engineer. */
"The group is fully decentralized it is visible only to the members." = "Il gruppo è completamente decentralizzato: è visibile solo ai membri.";
/* No comment provided by engineer. */
"The hash of the previous message is different." = "L'hash del messaggio precedente è diverso.";
/* No comment provided by engineer. */
"The ID of the next message is incorrect (less or equal to the previous).\nIt can happen because of some bug or when the connection is compromised." = "L'ID del messaggio successivo non è corretto (inferiore o uguale al precedente).\nPuò accadere a causa di qualche bug o quando la connessione è compromessa.";
/* No comment provided by engineer. */
"The message will be deleted for all members." = "Il messaggio verrà eliminato per tutti i membri.";
@@ -2511,6 +2574,9 @@
/* notification title */
"this contact" = "questo contatto";
/* No comment provided by engineer. */
"This error is permanent for this connection, please re-connect." = "L'errore è permanente per questa connessione, riconnettiti.";
/* No comment provided by engineer. */
"This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member)." = "Questa funzionalità è sperimentale! Funzionerà solo se l'altro client ha la versione 4.2 installata. Dovresti vedere il messaggio nella conversazione una volta completato il cambio di indirizzo. Controlla di potere ancora ricevere messaggi da questo contatto (o membro del gruppo).";
@@ -2676,9 +2742,6 @@
/* No comment provided by engineer. */
"v%@ (%@)" = "v%@ (%@)";
/* No comment provided by engineer. */
"v4.6.1+ is required to receive via XFTP." = "v4.6.1+ necessaria per ricevere via XFTP.";
/* No comment provided by engineer. */
"Verify connection security" = "Verifica la sicurezza della connessione";
+104 -17
View File
@@ -1,6 +1,9 @@
/* No comment provided by engineer. */
"\n" = "\n";
/* No comment provided by engineer. */
"\nAvailable in v5.1" = "\nBeschikbaar in v5.1";
/* No comment provided by engineer. */
" " = " ";
@@ -172,6 +175,12 @@
/* No comment provided by engineer. */
"%lldw" = "%lldw";
/* No comment provided by engineer. */
"%u messages failed to decrypt." = "%u-berichten kunnen niet worden gedecodeerd.";
/* No comment provided by engineer. */
"%u messages skipped." = "%u berichten zijn overgeslagen.";
/* No comment provided by engineer. */
"`a + b`" = "\\`a + b`";
@@ -284,6 +293,9 @@
/* No comment provided by engineer. */
"Allow" = "Toestaan";
/* No comment provided by engineer. */
"Allow calls only if your contact allows them." = "Sta oproepen alleen toe als uw contact persoon dit toestaat.";
/* No comment provided by engineer. */
"Allow disappearing messages only if your contact allows it to you." = "Sta verdwijnende berichten alleen toe als uw contactpersoon dit toestaat.";
@@ -308,6 +320,9 @@
/* No comment provided by engineer. */
"Allow voice messages?" = "Spraak berichten toestaan?";
/* No comment provided by engineer. */
"Allow your contacts to call you." = "Sta toe dat uw contacten u bellen.";
/* No comment provided by engineer. */
"Allow your contacts to irreversibly delete sent messages." = "Laat uw contacten verzonden berichten onomkeerbaar verwijderen.";
@@ -335,6 +350,9 @@
/* No comment provided by engineer. */
"App icon" = "App icon";
/* No comment provided by engineer. */
"App passcode" = "App toegangscode";
/* No comment provided by engineer. */
"App version" = "App versie";
@@ -356,6 +374,12 @@
/* No comment provided by engineer. */
"audio call (not e2e encrypted)" = "audio oproep (niet e2e versleuteld)";
/* chat feature */
"Audio/video calls" = "Audio/video oproepen";
/* No comment provided by engineer. */
"Audio/video calls are prohibited." = "Audio/video gesprekken zijn verboden.";
/* PIN entry */
"Authentication cancelled" = "Verificatie geannuleerd";
@@ -383,15 +407,24 @@
/* integrity error chat item */
"bad message hash" = "Onjuiste bericht hash";
/* No comment provided by engineer. */
"Bad message hash" = "Onjuiste bericht hash";
/* integrity error chat item */
"bad message ID" = "Onjuiste bericht ID";
/* No comment provided by engineer. */
"Bad message ID" = "Onjuiste bericht ID";
/* No comment provided by engineer. */
"bold" = "vetgedrukt";
/* No comment provided by engineer. */
"Both you and your contact can irreversibly delete sent messages." = "Zowel jij als je contactpersoon kunnen verzonden berichten onherroepelijk verwijderen.";
/* No comment provided by engineer. */
"Both you and your contact can make calls." = "Zowel u als uw contact persoon kunnen bellen.";
/* No comment provided by engineer. */
"Both you and your contact can send disappearing messages." = "Zowel jij als je contactpersoon kunnen verdwijnende berichten sturen.";
@@ -425,11 +458,8 @@
/* No comment provided by engineer. */
"Can't invite contacts!" = "Kan geen contacten uitnodigen!";
/* chat item action */
"Cancel" = "Annuleren";
/* No comment provided by engineer. */
"Cancel file transfer?" = "Bestand overdracht annuleren?";
"Cancel" = "Annuleren";
/* feature offered item */
"cancelled %@" = "geannuleerd %@";
@@ -785,6 +815,9 @@
/* No comment provided by engineer. */
"Decentralized" = "Gedecentraliseerd";
/* No comment provided by engineer. */
"Decryption error" = "Decryptie fout";
/* pref value */
"default (%@)" = "standaard (%@)";
@@ -1205,9 +1238,6 @@
/* No comment provided by engineer. */
"Exit without saving" = "Afsluiten zonder opslaan";
/* No comment provided by engineer. */
"Experimental" = "Experimenteel";
/* No comment provided by engineer. */
"Export database" = "Database exporteren";
@@ -1224,7 +1254,10 @@
"Failed to remove passphrase" = "Kan wachtwoord niet verwijderen";
/* No comment provided by engineer. */
"File transfer will be cancelled. If it's in progress it will be stoppped." = "Bestand overdracht wordt geannuleerd. Als het bezig is, wordt het gestopt.";
"Fast and no wait until the sender is online!" = "Snel en niet wachten tot de afzender online is!";
/* No comment provided by engineer. */
"File will be deleted from servers." = "Het bestand wordt van de servers verwijderd.";
/* No comment provided by engineer. */
"File will be received when your contact completes uploading it." = "Het bestand wordt ontvangen wanneer uw contactpersoon het uploaden heeft voltooid.";
@@ -1527,7 +1560,10 @@
"It allows having many anonymous connections without any shared data between them in a single chat profile." = "Het maakt het mogelijk om veel anonieme verbindingen te hebben zonder enige gedeelde gegevens tussen hen in een enkel chat profiel.";
/* No comment provided by engineer. */
"It can happen when:\n1. The messages expire on the server if they were not received for 30 days,\n2. The server you use to receive the messages from this contact was updated and restarted.\n3. The connection is compromised.\nPlease connect to the developers via Settings to receive the updates about the servers.\nWe will be adding server redundancy to prevent lost messages." = "Het kan gebeuren wanneer:\n1. De berichten op de server verlopen als ze 30 dagen niet zijn ontvangen.\n2. De server die u gebruikt om de berichten van deze contactpersoon te ontvangen, is bijgewerkt en opnieuw opgestart.\n3. De verbinding is verbroken.\nMaak verbinding met de ontwikkelaars via Instellingen om de updates over de servers te ontvangen.\nWe zullen serverredundantie toevoegen om verloren berichten te voorkomen.";
"It can happen when you or your connection used the old database backup." = "Het kan gebeuren wanneer u of uw verbinding de oude databaseback-up gebruikte.";
/* 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." = "Het kan gebeuren wanneer:\n1. De berichten zijn na 2 dagen verlopen bij de verzendende client of na 30 dagen op de server.\n2. Decodering van het bericht is mislukt, omdat u of uw contactpersoon een oude databaseback-up heeft gebruikt.\n3. De verbinding is verbroken.";
/* No comment provided by engineer. */
"It seems like you are already connected via this link. If it is not the case, there was an error (%@)." = "Het lijkt erop dat u al bent verbonden via deze link. Als dit niet het geval is, is er een fout opgetreden (%@).";
@@ -1848,6 +1884,9 @@
/* No comment provided by engineer. */
"Only you can irreversibly delete messages (your contact can mark them for deletion)." = "Alleen jij kunt berichten onomkeerbaar verwijderen (je contactpersoon kan ze markeren voor verwijdering).";
/* No comment provided by engineer. */
"Only you can make calls." = "Alleen jij kunt bellen.";
/* No comment provided by engineer. */
"Only you can send disappearing messages." = "Alleen jij kunt verdwijnende berichten verzenden.";
@@ -1857,6 +1896,9 @@
/* No comment provided by engineer. */
"Only your contact can irreversibly delete messages (you can mark them for deletion)." = "Alleen uw contactpersoon kan berichten onherroepelijk verwijderen (u kunt ze markeren voor verwijdering).";
/* No comment provided by engineer. */
"Only your contact can make calls." = "Alleen je contact kan bellen.";
/* No comment provided by engineer. */
"Only your contact can send disappearing messages." = "Alleen uw contactpersoon kan verdwijnende berichten verzenden.";
@@ -1926,6 +1968,9 @@
/* No comment provided by engineer. */
"Periodically" = "Periodiek";
/* message decrypt error item */
"Permanent decryption error" = "Decryptie fout";
/* No comment provided by engineer. */
"PING count" = "PING count";
@@ -1954,7 +1999,10 @@
"Please enter the previous password after restoring database backup. This action can not be undone." = "Voer het vorige wachtwoord in na het herstellen van de database back-up. Deze actie kan niet ongedaan gemaakt worden.";
/* No comment provided by engineer. */
"Please remember or store it securely - there is no way to recover a lost passcode!" = "Onthoud het of bewaar het veilig - er is geen manier om een verloren toegangscode te herstellen!";
"Please remember or store it securely - there is no way to recover a lost passcode!" = "Onthoud of bewaar het veilig - er is geen manier om een verloren toegangscode te herstellen!";
/* No comment provided by engineer. */
"Please report it to the developers." = "Meld het alsjeblieft aan de ontwikkelaars.";
/* No comment provided by engineer. */
"Please restart the app and migrate the database to enable push notifications." = "Start de app opnieuw en migreer de database om push meldingen in te schakelen.";
@@ -1965,6 +2013,9 @@
/* No comment provided by engineer. */
"Please store passphrase securely, you will NOT be able to change it if you lose it." = "Bewaar het wachtwoord veilig, u kunt deze NIET wijzigen als u het kwijtraakt.";
/* No comment provided by engineer. */
"Polish interface" = "Poolse interface";
/* server test error */
"Possibly, certificate fingerprint in server address is incorrect" = "Mogelijk is de certificaat vingerafdruk in het server adres onjuist";
@@ -1995,6 +2046,9 @@
/* No comment provided by engineer. */
"Profile password" = "Profiel wachtwoord";
/* No comment provided by engineer. */
"Prohibit audio/video calls." = "Audio/video gesprekken verbieden.";
/* No comment provided by engineer. */
"Prohibit irreversible message deletion." = "Verbied het onomkeerbaar verwijderen van berichten.";
@@ -2040,6 +2094,9 @@
/* notification */
"Received file event" = "Ontvangen bestandsgebeurtenis";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "Het ontvangen van het bestand wordt gestopt.";
/* No comment provided by engineer. */
"Receiving via" = "Ontvang via";
@@ -2127,6 +2184,15 @@
/* No comment provided by engineer. */
"Revert" = "Terugdraaien";
/* No comment provided by engineer. */
"Revoke" = "Intrekken";
/* cancel file action */
"Revoke file" = "Bestand intrekken";
/* No comment provided by engineer. */
"Revoke file?" = "Bestand intrekken?";
/* No comment provided by engineer. */
"Role" = "Rol";
@@ -2235,15 +2301,15 @@
/* No comment provided by engineer. */
"Send them from gallery or custom keyboards." = "Stuur ze vanuit de galerij of aangepaste toetsenborden.";
/* No comment provided by engineer. */
"Send videos and files via XFTP" = "Bestanden verzenden via XFTP";
/* No comment provided by engineer. */
"Sender cancelled file transfer." = "Afzender heeft bestandsoverdracht geannuleerd.";
/* No comment provided by engineer. */
"Sender may have deleted the connection request." = "De afzender heeft mogelijk het verbindingsverzoek verwijderd.";
/* No comment provided by engineer. */
"Sending file will be stopped." = "Het verzenden van het bestand wordt gestopt.";
/* No comment provided by engineer. */
"Sending via" = "Verzenden via";
@@ -2274,6 +2340,9 @@
/* No comment provided by engineer. */
"Set group preferences" = "Groep voorkeuren instellen";
/* No comment provided by engineer. */
"Set it instead of system authentication." = "Stel het in in plaats van systeemverificatie.";
/* No comment provided by engineer. */
"Set passphrase to export" = "Wachtwoord instellen om te exporteren";
@@ -2379,6 +2448,15 @@
/* No comment provided by engineer. */
"Stop chat?" = "Stop chat?";
/* cancel file action */
"Stop file" = "Bestand stoppen";
/* No comment provided by engineer. */
"Stop receiving file?" = "Stopt met het ontvangen van een bestand?";
/* No comment provided by engineer. */
"Stop sending file?" = "Bestand verzenden stoppen?";
/* authentication reason */
"Stop SimpleX" = "Stop SimpleX";
@@ -2469,6 +2547,12 @@
/* No comment provided by engineer. */
"The group is fully decentralized it is visible only to the members." = "De groep is volledig gedecentraliseerd het is alleen zichtbaar voor de leden.";
/* No comment provided by engineer. */
"The hash of the previous message is different." = "De hash van het vorige bericht is anders.";
/* No comment provided by engineer. */
"The ID of the next message is incorrect (less or equal to the previous).\nIt can happen because of some bug or when the connection is compromised." = "De ID van het volgende bericht is onjuist (minder of gelijk aan het vorige).\nHet kan gebeuren vanwege een bug of wanneer de verbinding is aangetast.";
/* No comment provided by engineer. */
"The message will be deleted for all members." = "Het bericht wordt verwijderd voor alle leden.";
@@ -2511,6 +2595,9 @@
/* notification title */
"this contact" = "dit contact";
/* No comment provided by engineer. */
"This error is permanent for this connection, please re-connect." = "Deze fout is permanent voor deze verbinding, maak opnieuw verbinding.";
/* No comment provided by engineer. */
"This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member)." = "Deze functie is experimenteel! Het werkt alleen als op de andere client versie 4.2 is geïnstalleerd. U zou het bericht in het gesprek moeten zien zodra de adreswijziging is voltooid. Controleer of u nog steeds berichten van dit contact (of groepslid) kunt ontvangen.";
@@ -2676,9 +2763,6 @@
/* No comment provided by engineer. */
"v%@ (%@)" = "v%@ (%@)";
/* No comment provided by engineer. */
"v4.6.1+ is required to receive via XFTP." = "v4.6.1+ is vereist om te ontvangen via XFTP.";
/* No comment provided by engineer. */
"Verify connection security" = "Controleer de verbindingsbeveiliging";
@@ -2712,6 +2796,9 @@
/* No comment provided by engineer. */
"Video will be received when your contact is online, please wait or check later!" = "De video wordt ontvangen wanneer uw contact online is, even geduld a.u.b. of kijk later!";
/* No comment provided by engineer. */
"Videos and files up to 1gb" = "Video's en bestanden tot 1 GB";
/* No comment provided by engineer. */
"View security code" = "Beveiligingscode bekijken";
@@ -2914,7 +3001,7 @@
"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 join a group this link refers to and connect to its group members." = "U wordt lid van een groep waarnaar deze link verwijst en maakt verbinding met de groepsleden.";
"You will join a group this link refers to and connect to its group members." = "U wordt lid van de groep waar deze link naar verwijst en maakt verbinding met de groepsleden.";
/* 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.";
+104 -17
View File
@@ -1,6 +1,9 @@
/* No comment provided by engineer. */
"\n" = "\n";
/* No comment provided by engineer. */
"\nAvailable in v5.1" = "\nDostępny w v5.1";
/* No comment provided by engineer. */
" " = " ";
@@ -172,6 +175,12 @@
/* No comment provided by engineer. */
"%lldw" = "%lldt";
/* No comment provided by engineer. */
"%u messages failed to decrypt." = "Nie udało się odszyfrować %u wiadomości.";
/* No comment provided by engineer. */
"%u messages skipped." = "%u pominiętych wiadomości.";
/* No comment provided by engineer. */
"`a + b`" = "\\`a + b`";
@@ -284,6 +293,9 @@
/* No comment provided by engineer. */
"Allow" = "Pozwól";
/* No comment provided by engineer. */
"Allow calls only if your contact allows them." = "Zezwalaj na połączenia tylko wtedy, gdy Twój kontakt na to pozwala.";
/* No comment provided by engineer. */
"Allow disappearing messages only if your contact allows it to you." = "Zezwól na znikające wiadomości tylko wtedy, gdy Twój kontakt Ci na to pozwoli.";
@@ -308,6 +320,9 @@
/* No comment provided by engineer. */
"Allow voice messages?" = "Zezwolić na wiadomości głosowe?";
/* No comment provided by engineer. */
"Allow your contacts to call you." = "Zezwól swoim kontaktom na połączenia do Ciebie.";
/* No comment provided by engineer. */
"Allow your contacts to irreversibly delete sent messages." = "Zezwól swoim kontaktom na nieodwracalne usuwanie wysłanych wiadomości.";
@@ -335,6 +350,9 @@
/* No comment provided by engineer. */
"App icon" = "Ikona aplikacji";
/* No comment provided by engineer. */
"App passcode" = "Pin aplikacji";
/* No comment provided by engineer. */
"App version" = "Wersja aplikacji";
@@ -356,6 +374,12 @@
/* No comment provided by engineer. */
"audio call (not e2e encrypted)" = "połączenie audio (nie szyfrowane e2e)";
/* chat feature */
"Audio/video calls" = "Połączenia audio/wideo";
/* No comment provided by engineer. */
"Audio/video calls are prohibited." = "Połączenia audio/wideo są zabronione.";
/* PIN entry */
"Authentication cancelled" = "Uwierzytelnianie anulowane";
@@ -383,15 +407,24 @@
/* integrity error chat item */
"bad message hash" = "zły hash wiadomości";
/* No comment provided by engineer. */
"Bad message hash" = "Zły hash wiadomości";
/* integrity error chat item */
"bad message ID" = "zły identyfikator wiadomości";
/* No comment provided by engineer. */
"Bad message ID" = "Zły identyfikator wiadomości";
/* No comment provided by engineer. */
"bold" = "pogrubiona";
/* No comment provided by engineer. */
"Both you and your contact can irreversibly delete sent messages." = "Zarówno Ty, jak i Twój kontakt możecie nieodwracalnie usunąć wysłane wiadomości.";
/* No comment provided by engineer. */
"Both you and your contact can make calls." = "Zarówno Ty, jak i Twój kontakt możecie nawiązywać połączenia.";
/* No comment provided by engineer. */
"Both you and your contact can send disappearing messages." = "Zarówno Ty, jak i Twój kontakt możecie wysyłać znikające wiadomości.";
@@ -425,11 +458,8 @@
/* No comment provided by engineer. */
"Can't invite contacts!" = "Nie można zaprosić kontaktów!";
/* chat item action */
"Cancel" = "Anuluj";
/* No comment provided by engineer. */
"Cancel file transfer?" = "Anulować transfer plików?";
"Cancel" = "Anuluj";
/* feature offered item */
"cancelled %@" = "anulowany %@";
@@ -785,6 +815,9 @@
/* No comment provided by engineer. */
"Decentralized" = "Zdecentralizowane";
/* No comment provided by engineer. */
"Decryption error" = "Błąd odszyfrowania";
/* pref value */
"default (%@)" = "domyślne (%@)";
@@ -1205,9 +1238,6 @@
/* No comment provided by engineer. */
"Exit without saving" = "Wyjdź bez zapisywania";
/* No comment provided by engineer. */
"Experimental" = "Eksperymentalne";
/* No comment provided by engineer. */
"Export database" = "Eksportuj bazę danych";
@@ -1224,7 +1254,10 @@
"Failed to remove passphrase" = "Nie udało się usunąć hasła";
/* No comment provided by engineer. */
"File transfer will be cancelled. If it's in progress it will be stoppped." = "Transfer plików zostanie anulowany. Jeśli jest w toku, zostanie zatrzymany.";
"Fast and no wait until the sender is online!" = "Szybko i bez czekania aż nadawca będzie online!";
/* No comment provided by engineer. */
"File will be deleted from servers." = "Plik zostanie usunięty z serwerów.";
/* No comment provided by engineer. */
"File will be received when your contact completes uploading it." = "Plik zostanie odebrany, gdy Twój kontakt zakończy przesyłanie.";
@@ -1524,10 +1557,13 @@
"Irreversible message deletion is prohibited in this group." = "Nieodwracalne usuwanie wiadomości jest w tej grupie zabronione.";
/* No comment provided by engineer. */
"It allows having many anonymous connections without any shared data between them in a single chat profile." = "Pozwala na posiadanie wielu anonimowych połączeń bez żadnych wspólnych danych między nimi w jednym profilu czatu.";
"It allows having many anonymous connections without any shared data between them in a single chat profile." = "To pozwala na posiadanie wielu anonimowych połączeń bez żadnych wspólnych danych między nimi w pojedynczym profilu czatu.";
/* No comment provided by engineer. */
"It can happen when:\n1. The messages expire on the server if they were not received for 30 days,\n2. The server you use to receive the messages from this contact was updated and restarted.\n3. The connection is compromised.\nPlease connect to the developers via Settings to receive the updates about the servers.\nWe will be adding server redundancy to prevent lost messages." = "Może to nastąpić, gdy:\n1. Wiadomości wygasają na serwerze, jeśli nie zostały odebrane przez 30 dni,\n2. Serwer, którego używasz do odbierania wiadomości od tego kontaktu został zaktualizowany i uruchomiony ponownie.\n3. Połączenie jest skompromitowane.\nProszę połączyć się z deweloperami przez Ustawienia, aby otrzymać aktualizacje dotyczące serwerów.\nBędziemy dodawać redundancję serwerów, aby zapobiec utracie wiadomości.";
"It can happen when you or your connection used the old database backup." = "Może się to zdarzyć, gdy Ty lub Twoje połączenie użyło starej kopii zapasowej bazy danych.";
/* No comment provided by engineer. */
"It can happen when:\n1. The messages expired in the sending client after 2 days or on the server after 30 days.\n2. Message decryption failed, because you or your contact used old database backup.\n3. The connection was compromised." = "Może to nastąpić, gdy:\n1. Wiadomości wygasły w wysyłającym kliencie po 2 dniach lub na serwerze po 30 dniach.\n2. Odszyfrowanie wiadomości nie powiodło się, ponieważ Ty lub Twój kontakt użyliście starej kopii zapasowej bazy danych.\n3. Połączenie zostało skompromitowane.";
/* No comment provided by engineer. */
"It seems like you are already connected via this link. If it is not the case, there was an error (%@)." = "Wygląda na to, że jesteś już połączony przez ten link. Jeśli tak nie jest, wystąpił błąd (%@).";
@@ -1848,6 +1884,9 @@
/* No comment provided by engineer. */
"Only you can irreversibly delete messages (your contact can mark them for deletion)." = "Tylko Ty możesz nieodwracalnie usunąć wiadomości (Twój kontakt może oznaczyć je do usunięcia).";
/* No comment provided by engineer. */
"Only you can make calls." = "Tylko Ty możesz wykonywać połączenia.";
/* No comment provided by engineer. */
"Only you can send disappearing messages." = "Tylko Ty możesz wysyłać znikające wiadomości.";
@@ -1857,6 +1896,9 @@
/* No comment provided by engineer. */
"Only your contact can irreversibly delete messages (you can mark them for deletion)." = "Tylko Twój kontakt może nieodwracalnie usunąć wiadomości (możesz oznaczyć je do usunięcia).";
/* No comment provided by engineer. */
"Only your contact can make calls." = "Tylko Twój kontakt może wykonywać połączenia.";
/* No comment provided by engineer. */
"Only your contact can send disappearing messages." = "Tylko Twój kontakt może wysyłać znikające wiadomości.";
@@ -1926,6 +1968,9 @@
/* No comment provided by engineer. */
"Periodically" = "Okresowo";
/* message decrypt error item */
"Permanent decryption error" = "Błąd odszyfrowania";
/* No comment provided by engineer. */
"PING count" = "Liczba PINGÓW";
@@ -1956,6 +2001,9 @@
/* No comment provided by engineer. */
"Please remember or store it securely - there is no way to recover a lost passcode!" = "Prosimy o jego zapamiętanie lub bezpieczne przechowywanie - nie ma możliwości odzyskania utraconego pinu!";
/* No comment provided by engineer. */
"Please report it to the developers." = "Prosimy o zgłaszanie tego do deweloperów.";
/* No comment provided by engineer. */
"Please restart the app and migrate the database to enable push notifications." = "Uruchom ponownie aplikację i przeprowadź migrację bazy danych, aby włączyć powiadomienia push.";
@@ -1965,6 +2013,9 @@
/* No comment provided by engineer. */
"Please store passphrase securely, you will NOT be able to change it if you lose it." = "Prosimy o bezpieczne przechowywanie hasła, w przypadku jego utraty NIE będzie można go zmienić.";
/* No comment provided by engineer. */
"Polish interface" = "Polski interfejs";
/* server test error */
"Possibly, certificate fingerprint in server address is incorrect" = "Możliwe, że odcisk palca certyfikatu w adresie serwera jest nieprawidłowy";
@@ -1995,6 +2046,9 @@
/* No comment provided by engineer. */
"Profile password" = "Hasło profilu";
/* No comment provided by engineer. */
"Prohibit audio/video calls." = "Zabroń połączeń audio/wideo.";
/* No comment provided by engineer. */
"Prohibit irreversible message deletion." = "Zabroń nieodwracalnego usuwania wiadomości.";
@@ -2040,6 +2094,9 @@
/* notification */
"Received file event" = "Otrzymano zdarzenie pliku";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "Odbieranie pliku zostanie przerwane.";
/* No comment provided by engineer. */
"Receiving via" = "Odbieranie przez";
@@ -2127,6 +2184,15 @@
/* No comment provided by engineer. */
"Revert" = "Przywrócić";
/* No comment provided by engineer. */
"Revoke" = "Odwołaj";
/* cancel file action */
"Revoke file" = "Odwołaj plik";
/* No comment provided by engineer. */
"Revoke file?" = "Odwołać plik?";
/* No comment provided by engineer. */
"Role" = "Rola";
@@ -2235,15 +2301,15 @@
/* No comment provided by engineer. */
"Send them from gallery or custom keyboards." = "Wyślij je z galerii lub niestandardowych klawiatur.";
/* No comment provided by engineer. */
"Send videos and files via XFTP" = "Wysyłaj filmy i pliki przez XFTP";
/* No comment provided by engineer. */
"Sender cancelled file transfer." = "Nadawca anulował transfer pliku.";
/* No comment provided by engineer. */
"Sender may have deleted the connection request." = "Nadawca mógł usunąć prośbę o połączenie.";
/* No comment provided by engineer. */
"Sending file will be stopped." = "Wysyłanie pliku zostanie przerwane.";
/* No comment provided by engineer. */
"Sending via" = "Wysyłanie przez";
@@ -2274,6 +2340,9 @@
/* No comment provided by engineer. */
"Set group preferences" = "Ustaw preferencje grupy";
/* No comment provided by engineer. */
"Set it instead of system authentication." = "Ustaw go zamiast uwierzytelniania systemowego.";
/* No comment provided by engineer. */
"Set passphrase to export" = "Ustaw hasło do eksportu";
@@ -2379,6 +2448,15 @@
/* No comment provided by engineer. */
"Stop chat?" = "Zatrzymać czat?";
/* cancel file action */
"Stop file" = "Zatrzymaj plik";
/* No comment provided by engineer. */
"Stop receiving file?" = "Przestać odbierać plik?";
/* No comment provided by engineer. */
"Stop sending file?" = "Przestać wysyłać plik?";
/* authentication reason */
"Stop SimpleX" = "Zatrzymaj SimpleX";
@@ -2469,6 +2547,12 @@
/* No comment provided by engineer. */
"The group is fully decentralized it is visible only to the members." = "Grupa jest w pełni zdecentralizowana jest widoczna tylko dla członków.";
/* No comment provided by engineer. */
"The hash of the previous message is different." = "Hash poprzedniej wiadomości jest inny.";
/* No comment provided by engineer. */
"The ID of the next message is incorrect (less or equal to the previous).\nIt can happen because of some bug or when the connection is compromised." = "Identyfikator następnej wiadomości jest nieprawidłowy (mniejszy lub równy poprzedniej).\nMoże się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skompromitowane.";
/* No comment provided by engineer. */
"The message will be deleted for all members." = "Wiadomość zostanie usunięta dla wszystkich członków.";
@@ -2511,6 +2595,9 @@
/* notification title */
"this contact" = "ten kontakt";
/* No comment provided by engineer. */
"This error is permanent for this connection, please re-connect." = "Ten błąd jest trwały dla tego połączenia, proszę o ponowne połączenie.";
/* No comment provided by engineer. */
"This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed please check that you can still receive messages from this contact (or group member)." = "Ta funkcja jest eksperymentalna! Będzie działać tylko wtedy, gdy drugi klient ma zainstalowaną wersję 4.2. Po zakończeniu zmiany adresu powinieneś zobaczyć wiadomość w konwersacji - sprawdź, czy nadal możesz otrzymywać wiadomości od tego kontaktu (lub członka grupy).";
@@ -2614,7 +2701,7 @@
"Unmute" = "Wyłącz wyciszenie";
/* No comment provided by engineer. */
"Unread" = "Oznacz jako nieprzeczytane";
"Unread" = "Nieprzeczytane";
/* No comment provided by engineer. */
"Update" = "Aktualizuj";
@@ -2676,9 +2763,6 @@
/* No comment provided by engineer. */
"v%@ (%@)" = "v%@ (%@)";
/* No comment provided by engineer. */
"v4.6.1+ is required to receive via XFTP." = "v4.6.1+ jest wymagany do odbierania przez XFTP.";
/* No comment provided by engineer. */
"Verify connection security" = "Weryfikuj bezpieczeństwo połączenia";
@@ -2712,6 +2796,9 @@
/* No comment provided by engineer. */
"Video will be received when your contact is online, please wait or check later!" = "Film zostanie odebrany, gdy kontakt będzie online, poczekaj lub sprawdź później!";
/* No comment provided by engineer. */
"Videos and files up to 1gb" = "Filmy i pliki do 1gb";
/* No comment provided by engineer. */
"View security code" = "Pokaż kod bezpieczeństwa";

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