mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2024-12-17 17:20:21 +01:00
Compare commits
44 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c7f5443920 | |||
| ccff79aa59 | |||
| ccb52e0acd | |||
| d84b30c071 | |||
| 5ae0afe1fe | |||
| d250e503b0 | |||
| afb0ae3d03 | |||
| 1a3f0bed47 | |||
| 1e280fb7e1 | |||
| 6feac55380 | |||
| 93d8eac037 | |||
| a11f99be3d | |||
| da17639309 | |||
| 10301aa742 | |||
| 2148d50393 | |||
| 12fb2a4ec5 | |||
| 8085e5b85c | |||
| 4ba310ec16 | |||
| 865c56f400 | |||
| c510e73256 | |||
| 73638129bc | |||
| 1a7a79d504 | |||
| d3268e4a72 | |||
| 15a93014a5 | |||
| e7735329bc | |||
| 3e222c68eb | |||
| a596bd9011 | |||
| 21a49710a8 | |||
| ce6fdb2558 | |||
| 0baee848a6 | |||
| 6f304bc9e6 | |||
| 1ca0dfffa0 | |||
| 1420084f5e | |||
| 3e03474437 | |||
| 95366e4d1b | |||
| df1775a1e6 | |||
| 30ccea18ab | |||
| 4cd90d74ad | |||
| 7f1214688a | |||
| aa89d0d156 | |||
| 787cd94362 | |||
| ec61a7fc51 | |||
| 9b627534f5 | |||
| 400a3707b2 |
@@ -52,9 +52,9 @@ jobs:
|
||||
- os: ubuntu-20.04
|
||||
cache_path: ~/.cabal/store
|
||||
asset_name: simplex-chat-ubuntu-20_04-x86-64
|
||||
- os: ubuntu-18.04
|
||||
- os: ubuntu-22.04
|
||||
cache_path: ~/.cabal/store
|
||||
asset_name: simplex-chat-ubuntu-18_04-x86-64
|
||||
asset_name: simplex-chat-ubuntu-22_04-x86-64
|
||||
- os: macos-latest
|
||||
cache_path: ~/.cabal/store
|
||||
asset_name: simplex-chat-macos-x86-64
|
||||
@@ -96,7 +96,7 @@ jobs:
|
||||
run: brew install pkg-config
|
||||
|
||||
- name: Unix prepare cabal.project.local for Ubuntu
|
||||
if: matrix.os == 'ubuntu-20.04' || matrix.os == 'ubuntu-18.04'
|
||||
if: matrix.os == 'ubuntu-20.04' || matrix.os == 'ubuntu-22.04'
|
||||
shell: bash
|
||||
run: |
|
||||
echo "ignore-project: False" >> cabal.project.local
|
||||
@@ -112,8 +112,8 @@ jobs:
|
||||
echo "::set-output name=bin_path::$(cabal list-bin simplex-chat)"
|
||||
|
||||
- name: Unix test
|
||||
if: matrix.os != 'windows-latest' && matrix.os != 'ubuntu-20.04'
|
||||
timeout-minutes: 20
|
||||
if: matrix.os != 'windows-latest'
|
||||
timeout-minutes: 30
|
||||
shell: bash
|
||||
run: cabal test --test-show-details=direct
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
[](https://www.reddit.com/r/SimpleXChat)
|
||||
[](https://mastodon.social/@simplex)
|
||||
|
||||
| 19/03/2023 | EN, [FR](/docs/lang/fr/README.md), [CZ](/docs/lang/cs/README.md) |
|
||||
| 30/03/2023 | EN, [FR](/docs/lang/fr/README.md), [CZ](/docs/lang/cs/README.md) |
|
||||
|
||||
<img src="images/simplex-chat-logo.svg" alt="SimpleX logo" width="100%">
|
||||
|
||||
@@ -79,14 +79,15 @@ Join our translators to help SimpleX grow!
|
||||
|locale|language |contributor|[Android](https://play.google.com/store/apps/details?id=chat.simplex.app) and [iOS](https://apps.apple.com/us/app/simplex-chat/id1605771084)|[website](https://simplex.chat)|Github docs|
|
||||
|:----:|:-------:|:---------:|:---------:|:---------:|:---------:|
|
||||
|🇬🇧 en|English | |✓|✓|✓|✓|
|
||||
|ar|العربية |[jermanuts](https://github.com/jermanuts)||[](https://hosted.weblate.org/projects/simplex-chat/website/ar/)||
|
||||
|🇨🇿 cs|Čeština |[zen0bit](https://github.com/zen0bit)|[](https://hosted.weblate.org/projects/simplex-chat/android/cs/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/cs/)|[](https://hosted.weblate.org/projects/simplex-chat/website/cs/)|[✓](https://github.com/simplex-chat/simplex-chat/tree/master/docs/lang/cs)|
|
||||
|🇩🇪 de|Deutsch |[mlanp](https://github.com/mlanp)|[](https://hosted.weblate.org/projects/simplex-chat/android/de/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/de/)|[](https://hosted.weblate.org/projects/simplex-chat/website/de/)||
|
||||
|🇪🇸 es|Español ||[](https://hosted.weblate.org/projects/simplex-chat/android/es/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/es/)|||
|
||||
|🇫🇷 fr|Français |[ishi_sama](https://github.com/ishi_sama)|[](https://hosted.weblate.org/projects/simplex-chat/android/fr/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/fr/)|[](https://hosted.weblate.org/projects/simplex-chat/website/fr/)|[✓](https://github.com/simplex-chat/simplex-chat/tree/master/docs/lang/fr)|
|
||||
|🇪🇸 es|Español |[Mateyhv](https://github.com/Mateyhv)|[](https://hosted.weblate.org/projects/simplex-chat/android/es/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/es/)|[](https://hosted.weblate.org/projects/simplex-chat/website/es/)||
|
||||
|🇫🇷 fr|Français |[ishi_sama](https://github.com/ishi-sama)|[](https://hosted.weblate.org/projects/simplex-chat/android/fr/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/fr/)|[](https://hosted.weblate.org/projects/simplex-chat/website/fr/)|[✓](https://github.com/simplex-chat/simplex-chat/tree/master/docs/lang/fr)|
|
||||
|🇮🇹 it|Italiano |[unbranched](https://github.com/unbranched)|[](https://hosted.weblate.org/projects/simplex-chat/android/it/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/it/)|[](https://hosted.weblate.org/projects/simplex-chat/website/it/)||
|
||||
|🇳🇱 nl|Nederlands|[mika-nl](https://github.com/mika-nl)|[](https://hosted.weblate.org/projects/simplex-chat/android/nl/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/nl/)|[](https://hosted.weblate.org/projects/simplex-chat/website/nl/)||
|
||||
|🇷🇺 ru|Русский ||[](https://hosted.weblate.org/projects/simplex-chat/android/ru/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/ru/)|||
|
||||
|🇨🇳 zh-CHS|简体中文|[sith-on-mars](https://github.com/sith-on-mars)|[](https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/zh_Hans/)|||
|
||||
|🇨🇳 zh-CHS|简体中文|[sith-on-mars](https://github.com/sith-on-mars)|[](https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/zh_Hans/)|[](https://hosted.weblate.org/projects/simplex-chat/website/zh_Hans/)||
|
||||
|
||||
Languages in progress: Arabic, Hindi, Japanese, Spanish and [many others](https://hosted.weblate.org/projects/simplex-chat/#languages). We will be adding more languages as some of the already added are completed – please suggest new languages, review the [translation guide](./docs/TRANSLATIONS.md) and get in touch with us!
|
||||
|
||||
|
||||
@@ -11,8 +11,8 @@ android {
|
||||
applicationId "chat.simplex.app"
|
||||
minSdk 26
|
||||
targetSdk 32
|
||||
versionCode 109
|
||||
versionName "4.6.1-beta.0"
|
||||
versionCode 111
|
||||
versionName "4.6.1-beta.2"
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
vectorDrawables {
|
||||
@@ -143,6 +143,9 @@ dependencies {
|
||||
implementation "io.coil-kt:coil-compose:2.1.0"
|
||||
implementation "io.coil-kt:coil-gif:2.1.0"
|
||||
|
||||
// Video support
|
||||
implementation "com.google.android.exoplayer:exoplayer:2.17.1"
|
||||
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
|
||||
@@ -150,19 +153,12 @@ dependencies {
|
||||
debugImplementation "androidx.compose.ui:ui-tooling:$compose_version"
|
||||
}
|
||||
|
||||
def buildType = "unknown"
|
||||
// Don't do anything if no compression is needed
|
||||
if (compression_level != "0") {
|
||||
tasks.whenTaskAdded { task ->
|
||||
if (task.name == 'packageDebug') {
|
||||
task.doLast {
|
||||
buildType = "debug"
|
||||
}
|
||||
task.finalizedBy compressApk
|
||||
} else if (task.name == 'packageRelease') {
|
||||
task.doLast {
|
||||
buildType = "release"
|
||||
}
|
||||
task.finalizedBy compressApk
|
||||
}
|
||||
}
|
||||
@@ -170,6 +166,13 @@ if (compression_level != "0") {
|
||||
|
||||
tasks.register("compressApk") {
|
||||
doLast {
|
||||
def isRelease = gradle.getStartParameter().taskNames.find({ it.toLowerCase().contains("release") }) != null
|
||||
def buildType
|
||||
if (isRelease) {
|
||||
buildType = "release"
|
||||
} else {
|
||||
buildType = "debug"
|
||||
}
|
||||
def javaHome = System.properties['java.home'] ?: org.gradle.internal.jvm.Jvm.current().getJavaHome()
|
||||
def sdkDir = android.getSdkDirectory().getAbsolutePath()
|
||||
def keyAlias = ""
|
||||
|
||||
@@ -128,6 +128,7 @@ class MainActivity: FragmentActivity() {
|
||||
|
||||
override fun onStop() {
|
||||
super.onStop()
|
||||
VideoPlayer.stopAll()
|
||||
enteredBackground.value = elapsedRealtime()
|
||||
}
|
||||
|
||||
@@ -401,7 +402,8 @@ fun processNotificationIntent(intent: Intent?, chatModel: ChatModel) {
|
||||
Log.d(TAG, "processNotificationIntent: OpenChatAction $chatId")
|
||||
if (chatId != null) {
|
||||
withBGApi {
|
||||
if (userId != null && userId != chatModel.currentUser.value?.userId) {
|
||||
awaitChatStartedIfNeeded(chatModel)
|
||||
if (userId != null && userId != chatModel.currentUser.value?.userId && chatModel.currentUser.value != null) {
|
||||
chatModel.controller.changeActiveUser(userId, null)
|
||||
}
|
||||
val cInfo = chatModel.getChat(chatId)?.chatInfo
|
||||
@@ -413,7 +415,8 @@ fun processNotificationIntent(intent: Intent?, chatModel: ChatModel) {
|
||||
NtfManager.ShowChatsAction -> {
|
||||
Log.d(TAG, "processNotificationIntent: ShowChatsAction")
|
||||
withBGApi {
|
||||
if (userId != null && userId != chatModel.currentUser.value?.userId) {
|
||||
awaitChatStartedIfNeeded(chatModel)
|
||||
if (userId != null && userId != chatModel.currentUser.value?.userId && chatModel.currentUser.value != null) {
|
||||
chatModel.controller.changeActiveUser(userId, null)
|
||||
}
|
||||
chatModel.chatId.value = null
|
||||
@@ -504,6 +507,20 @@ fun connectIfOpenedViaUri(uri: Uri, chatModel: ChatModel) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun awaitChatStartedIfNeeded(chatModel: ChatModel, timeout: Long = 30_000) {
|
||||
// Still decrypting database
|
||||
if (chatModel.chatRunning.value == null) {
|
||||
val step = 50L
|
||||
for (i in 0..(timeout / step)) {
|
||||
if (chatModel.chatRunning.value == true || chatModel.onboardingStage.value == OnboardingStage.Step1_SimpleXInfo) {
|
||||
break
|
||||
}
|
||||
delay(step)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//fun testJson() {
|
||||
// val str: String = """
|
||||
// """.trimIndent()
|
||||
|
||||
@@ -192,10 +192,13 @@ class ChatModel(val controller: ChatController) {
|
||||
// add to current chat
|
||||
if (chatId.value == cInfo.id) {
|
||||
withContext(Dispatchers.Main) {
|
||||
if (chatItems.lastOrNull()?.id == ChatItem.TEMP_LIVE_CHAT_ITEM_ID) {
|
||||
chatItems.add(kotlin.math.max(0, chatItems.lastIndex), cItem)
|
||||
} else {
|
||||
chatItems.add(cItem)
|
||||
// Prevent situation when chat item already in the list received from backend
|
||||
if (chatItems.none { it.id == cItem.id }) {
|
||||
if (chatItems.lastOrNull()?.id == ChatItem.TEMP_LIVE_CHAT_ITEM_ID) {
|
||||
chatItems.add(kotlin.math.max(0, chatItems.lastIndex), cItem)
|
||||
} else {
|
||||
chatItems.add(cItem)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -222,19 +225,19 @@ class ChatModel(val controller: ChatController) {
|
||||
res = true
|
||||
}
|
||||
// update current chat
|
||||
if (chatId.value == cInfo.id) {
|
||||
val itemIndex = chatItems.indexOfFirst { it.id == cItem.id }
|
||||
if (itemIndex >= 0) {
|
||||
chatItems[itemIndex] = cItem
|
||||
return false
|
||||
} else {
|
||||
withContext(Dispatchers.Main) {
|
||||
return if (chatId.value == cInfo.id) {
|
||||
withContext(Dispatchers.Main) {
|
||||
val itemIndex = chatItems.indexOfFirst { it.id == cItem.id }
|
||||
if (itemIndex >= 0) {
|
||||
chatItems[itemIndex] = cItem
|
||||
false
|
||||
} else {
|
||||
chatItems.add(cItem)
|
||||
true
|
||||
}
|
||||
return true
|
||||
}
|
||||
} else {
|
||||
return res
|
||||
res
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1419,7 +1422,7 @@ data class ChatItem (
|
||||
file = null
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
private const val TEMP_DELETED_CHAT_ITEM_ID = -1L
|
||||
const val TEMP_LIVE_CHAT_ITEM_ID = -2L
|
||||
|
||||
@@ -1777,6 +1780,7 @@ sealed class MsgContent {
|
||||
@Serializable(with = MsgContentSerializer::class) class MCText(override val text: String): MsgContent()
|
||||
@Serializable(with = MsgContentSerializer::class) class MCLink(override val text: String, val preview: LinkPreview): MsgContent()
|
||||
@Serializable(with = MsgContentSerializer::class) class MCImage(override val text: String, val image: String): MsgContent()
|
||||
@Serializable(with = MsgContentSerializer::class) class MCVideo(override val text: String, val image: String, val duration: Int): MsgContent()
|
||||
@Serializable(with = MsgContentSerializer::class) class MCVoice(override val text: String, val duration: Int): MsgContent()
|
||||
@Serializable(with = MsgContentSerializer::class) class MCFile(override val text: String): MsgContent()
|
||||
@Serializable(with = MsgContentSerializer::class) class MCUnknown(val type: String? = null, override val text: String, val json: JsonElement): MsgContent()
|
||||
@@ -1830,6 +1834,11 @@ object MsgContentSerializer : KSerializer<MsgContent> {
|
||||
element<String>("text")
|
||||
element<String>("image")
|
||||
})
|
||||
element("MCVideo", buildClassSerialDescriptor("MCVideo") {
|
||||
element<String>("text")
|
||||
element<String>("image")
|
||||
element<Int>("duration")
|
||||
})
|
||||
element("MCFile", buildClassSerialDescriptor("MCFile") {
|
||||
element<String>("text")
|
||||
})
|
||||
@@ -1853,6 +1862,11 @@ object MsgContentSerializer : KSerializer<MsgContent> {
|
||||
val image = json["image"]?.jsonPrimitive?.content ?: "unknown message format"
|
||||
MsgContent.MCImage(text, image)
|
||||
}
|
||||
"video" -> {
|
||||
val image = json["image"]?.jsonPrimitive?.content ?: "unknown message format"
|
||||
val duration = json["duration"]?.jsonPrimitive?.intOrNull ?: 0
|
||||
MsgContent.MCVideo(text, image, duration)
|
||||
}
|
||||
"voice" -> {
|
||||
val duration = json["duration"]?.jsonPrimitive?.intOrNull ?: 0
|
||||
MsgContent.MCVoice(text, duration)
|
||||
@@ -1888,6 +1902,13 @@ object MsgContentSerializer : KSerializer<MsgContent> {
|
||||
put("text", value.text)
|
||||
put("image", value.image)
|
||||
}
|
||||
is MsgContent.MCVideo ->
|
||||
buildJsonObject {
|
||||
put("type", "video")
|
||||
put("text", value.text)
|
||||
put("image", value.image)
|
||||
put("duration", value.duration)
|
||||
}
|
||||
is MsgContent.MCVoice ->
|
||||
buildJsonObject {
|
||||
put("type", "voice")
|
||||
|
||||
@@ -1440,8 +1440,18 @@ open class ChatController(var ctrl: ChatCtrl?, val ntfManager: NtfManager, val a
|
||||
chatItemSimpleUpdate(r.user, r.chatItem)
|
||||
is CR.SndFileProgressXFTP ->
|
||||
chatItemSimpleUpdate(r.user, r.chatItem)
|
||||
is CR.SndFileCompleteXFTP ->
|
||||
is CR.SndFileCompleteXFTP -> {
|
||||
chatItemSimpleUpdate(r.user, r.chatItem)
|
||||
val cItem = r.chatItem.chatItem
|
||||
val mc = cItem.content.msgContent
|
||||
val fileName = cItem.file?.fileName
|
||||
if (
|
||||
mc is MsgContent.MCFile
|
||||
&& fileName != null
|
||||
) {
|
||||
removeFile(appContext, fileName)
|
||||
}
|
||||
}
|
||||
is CR.CallInvitation -> {
|
||||
chatModel.callManager.reportNewIncomingCall(r.callInvitation)
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package chat.simplex.app.views.chat
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.res.Configuration
|
||||
import android.graphics.Bitmap
|
||||
import android.net.Uri
|
||||
@@ -133,6 +134,7 @@ fun ChatView(chatId: String, chatModel: ChatModel, onComposed: () -> Unit) {
|
||||
searchText,
|
||||
useLinkPreviews = useLinkPreviews,
|
||||
linkMode = chatModel.simplexLinkMode.value,
|
||||
allowVideoAttachment = chatModel.controller.appPrefs.xftpSendEnabled.get(),
|
||||
chatModelIncognito = chatModel.incognito.value,
|
||||
back = {
|
||||
hideKeyboard(view)
|
||||
@@ -306,6 +308,7 @@ fun ChatLayout(
|
||||
searchValue: State<String>,
|
||||
useLinkPreviews: Boolean,
|
||||
linkMode: SimplexLinkMode,
|
||||
allowVideoAttachment: Boolean,
|
||||
chatModelIncognito: Boolean,
|
||||
back: () -> Unit,
|
||||
info: () -> Unit,
|
||||
@@ -337,6 +340,7 @@ fun ChatLayout(
|
||||
sheetContent = {
|
||||
ChooseAttachmentView(
|
||||
attachmentOption,
|
||||
allowVideoAttachment,
|
||||
hide = { scope.launch { attachmentBottomSheetState.hide() } }
|
||||
)
|
||||
},
|
||||
@@ -578,6 +582,11 @@ fun BoxWithConstraintsScope.ChatItemsList(
|
||||
stopListening = true
|
||||
}
|
||||
}
|
||||
DisposableEffectOnGone(
|
||||
whenGone = {
|
||||
VideoPlayer.releaseAll()
|
||||
}
|
||||
)
|
||||
LazyColumn(Modifier.align(Alignment.BottomCenter), state = listState, reverseLayout = true) {
|
||||
itemsIndexed(reversedChatItems, key = { _, item -> item.id}) { i, cItem ->
|
||||
CompositionLocalProvider(
|
||||
@@ -597,10 +606,12 @@ fun BoxWithConstraintsScope.ChatItemsList(
|
||||
if (dismissState.isAnimationRunning && (swipedToStart || swipedToEnd)) {
|
||||
LaunchedEffect(Unit) {
|
||||
scope.launch {
|
||||
if (composeState.value.editing) {
|
||||
composeState.value = ComposeState(contextItem = ComposeContextItem.QuotedItem(cItem), useLinkPreviews = useLinkPreviews)
|
||||
} else if (cItem.id != ChatItem.TEMP_LIVE_CHAT_ITEM_ID) {
|
||||
composeState.value = composeState.value.copy(contextItem = ComposeContextItem.QuotedItem(cItem))
|
||||
if (cItem.content is CIContent.SndMsgContent || cItem.content is CIContent.RcvMsgContent) {
|
||||
if (composeState.value.editing) {
|
||||
composeState.value = ComposeState(contextItem = ComposeContextItem.QuotedItem(cItem), useLinkPreviews = useLinkPreviews)
|
||||
} else if (cItem.id != ChatItem.TEMP_LIVE_CHAT_ITEM_ID) {
|
||||
composeState.value = composeState.value.copy(contextItem = ComposeContextItem.QuotedItem(cItem))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -935,21 +946,26 @@ private fun markUnreadChatAsRead(activeChat: MutableState<Chat?>, chatModel: Cha
|
||||
}
|
||||
}
|
||||
|
||||
sealed class ProviderMedia {
|
||||
data class Image(val uri: Uri, val image: Bitmap): ProviderMedia()
|
||||
data class Video(val uri: Uri, val preview: String): ProviderMedia()
|
||||
}
|
||||
|
||||
private fun providerForGallery(
|
||||
listStateIndex: Int,
|
||||
chatItems: List<ChatItem>,
|
||||
cItemId: Long,
|
||||
scrollTo: (Int) -> Unit
|
||||
): ImageGalleryProvider {
|
||||
fun canShowImage(item: ChatItem): Boolean =
|
||||
item.content.msgContent is MsgContent.MCImage && item.file?.loaded == true && getLoadedFilePath(SimplexApp.context, item.file) != null
|
||||
fun canShowMedia(item: ChatItem): Boolean =
|
||||
(item.content.msgContent is MsgContent.MCImage || item.content.msgContent is MsgContent.MCVideo) && (item.file?.loaded == true && getLoadedFilePath(SimplexApp.context, item.file) != null)
|
||||
|
||||
fun item(skipInternalIndex: Int, initialChatId: Long): Pair<Int, ChatItem>? {
|
||||
var processedInternalIndex = -skipInternalIndex.sign
|
||||
val indexOfFirst = chatItems.indexOfFirst { it.id == initialChatId }
|
||||
for (chatItemsIndex in if (skipInternalIndex >= 0) indexOfFirst downTo 0 else indexOfFirst..chatItems.lastIndex) {
|
||||
val item = chatItems[chatItemsIndex]
|
||||
if (canShowImage(item)) {
|
||||
if (canShowMedia(item)) {
|
||||
processedInternalIndex += skipInternalIndex.sign
|
||||
}
|
||||
if (processedInternalIndex == skipInternalIndex) {
|
||||
@@ -963,16 +979,28 @@ private fun providerForGallery(
|
||||
var initialChatId = cItemId
|
||||
return object: ImageGalleryProvider {
|
||||
override val initialIndex: Int = initialIndex
|
||||
override val totalImagesSize = mutableStateOf(Int.MAX_VALUE)
|
||||
override fun getImage(index: Int): Pair<Bitmap, Uri>? {
|
||||
override val totalMediaSize = mutableStateOf(Int.MAX_VALUE)
|
||||
override fun getMedia(index: Int): ProviderMedia? {
|
||||
val internalIndex = initialIndex - index
|
||||
val file = item(internalIndex, initialChatId)?.second?.file
|
||||
val imageBitmap: Bitmap? = getLoadedImage(SimplexApp.context, file)
|
||||
val filePath = getLoadedFilePath(SimplexApp.context, file)
|
||||
return if (imageBitmap != null && filePath != null) {
|
||||
val uri = FileProvider.getUriForFile(SimplexApp.context, "${BuildConfig.APPLICATION_ID}.provider", File(filePath))
|
||||
imageBitmap to uri
|
||||
} else null
|
||||
val item = item(internalIndex, initialChatId)?.second ?: return null
|
||||
return when (item.content.msgContent) {
|
||||
is MsgContent.MCImage -> {
|
||||
val imageBitmap: Bitmap? = getLoadedImage(SimplexApp.context, item.file)
|
||||
val filePath = getLoadedFilePath(SimplexApp.context, item.file)
|
||||
if (imageBitmap != null && filePath != null) {
|
||||
val uri = FileProvider.getUriForFile(SimplexApp.context, "${BuildConfig.APPLICATION_ID}.provider", File(filePath))
|
||||
ProviderMedia.Image(uri, imageBitmap)
|
||||
} else null
|
||||
}
|
||||
is MsgContent.MCVideo -> {
|
||||
val filePath = getLoadedFilePath(SimplexApp.context, item.file)
|
||||
if (filePath != null) {
|
||||
val uri = FileProvider.getUriForFile(SimplexApp.context, "${BuildConfig.APPLICATION_ID}.provider", File(filePath))
|
||||
ProviderMedia.Video(uri, (item.content.msgContent as MsgContent.MCVideo).image)
|
||||
} else null
|
||||
}
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
override fun currentPageChanged(index: Int) {
|
||||
@@ -984,7 +1012,7 @@ private fun providerForGallery(
|
||||
|
||||
override fun scrollToStart() {
|
||||
initialIndex = 0
|
||||
initialChatId = chatItems.first { canShowImage(it) }.id
|
||||
initialChatId = chatItems.first { canShowMedia(it) }.id
|
||||
}
|
||||
|
||||
override fun onDismiss(index: Int) {
|
||||
@@ -1055,6 +1083,7 @@ fun PreviewChatLayout() {
|
||||
searchValue,
|
||||
useLinkPreviews = true,
|
||||
linkMode = SimplexLinkMode.DESCRIPTION,
|
||||
allowVideoAttachment = true,
|
||||
chatModelIncognito = false,
|
||||
back = {},
|
||||
info = {},
|
||||
@@ -1115,6 +1144,7 @@ fun PreviewGroupChatLayout() {
|
||||
searchValue,
|
||||
useLinkPreviews = true,
|
||||
linkMode = SimplexLinkMode.DESCRIPTION,
|
||||
allowVideoAttachment = true,
|
||||
chatModelIncognito = false,
|
||||
back = {},
|
||||
info = {},
|
||||
|
||||
@@ -9,14 +9,13 @@ import android.content.*
|
||||
import android.content.pm.PackageManager
|
||||
import android.graphics.*
|
||||
import android.graphics.drawable.AnimatedImageDrawable
|
||||
import android.media.MediaMetadataRetriever
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.provider.MediaStore
|
||||
import android.util.Log
|
||||
import android.widget.Toast
|
||||
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||
import androidx.activity.result.contract.ActivityResultContract
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.shape.CircleShape
|
||||
import androidx.compose.material.*
|
||||
@@ -32,10 +31,8 @@ import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.font.FontStyle
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.net.toFile
|
||||
import chat.simplex.app.*
|
||||
import chat.simplex.app.R
|
||||
import chat.simplex.app.model.*
|
||||
@@ -53,6 +50,7 @@ sealed class ComposePreview {
|
||||
@Serializable object NoPreview: ComposePreview()
|
||||
@Serializable class CLinkPreview(val linkPreview: LinkPreview?): ComposePreview()
|
||||
@Serializable class ImagePreview(val images: List<String>, val content: List<UploadContent>): ComposePreview()
|
||||
@Serializable class VideoPreview(val images: List<String>, val content: List<UploadContent>): ComposePreview()
|
||||
@Serializable data class VoicePreview(val voice: String, val durationMs: Int, val finished: Boolean): ComposePreview()
|
||||
@Serializable class FilePreview(val fileName: String, val uri: Uri): ComposePreview()
|
||||
}
|
||||
@@ -99,6 +97,7 @@ data class ComposeState(
|
||||
get() = {
|
||||
val hasContent = when (preview) {
|
||||
is ComposePreview.ImagePreview -> true
|
||||
is ComposePreview.VideoPreview -> true
|
||||
is ComposePreview.VoicePreview -> true
|
||||
is ComposePreview.FilePreview -> true
|
||||
else -> message.isNotEmpty() || liveMessage != null
|
||||
@@ -112,6 +111,7 @@ data class ComposeState(
|
||||
get() =
|
||||
when (preview) {
|
||||
is ComposePreview.ImagePreview -> false
|
||||
is ComposePreview.VideoPreview -> false
|
||||
is ComposePreview.VoicePreview -> false
|
||||
is ComposePreview.FilePreview -> false
|
||||
else -> useLinkPreviews
|
||||
@@ -162,6 +162,7 @@ fun chatItemPreview(chatItem: ChatItem): ComposePreview {
|
||||
is MsgContent.MCLink -> ComposePreview.CLinkPreview(linkPreview = mc.preview)
|
||||
// TODO: include correct type
|
||||
is MsgContent.MCImage -> ComposePreview.ImagePreview(images = listOf(mc.image), listOf(UploadContent.SimpleImage(getAppFileUri(fileName))))
|
||||
is MsgContent.MCVideo -> ComposePreview.VideoPreview(images = listOf(mc.image), listOf(UploadContent.SimpleImage(getAppFileUri(fileName))))
|
||||
is MsgContent.MCVoice -> ComposePreview.VoicePreview(voice = fileName, mc.duration / 1000, true)
|
||||
is MsgContent.MCFile -> ComposePreview.FilePreview(fileName, getAppFileUri(fileName))
|
||||
is MsgContent.MCUnknown, null -> ComposePreview.NoPreview
|
||||
@@ -235,6 +236,21 @@ fun ComposeView(
|
||||
composeState.value = composeState.value.copy(message = text ?: composeState.value.message, preview = ComposePreview.ImagePreview(imagesPreview, content))
|
||||
}
|
||||
}
|
||||
val processPickedVideo = { uris: List<Uri>, text: String? ->
|
||||
val content = ArrayList<UploadContent>()
|
||||
val imagesPreview = ArrayList<String>()
|
||||
uris.forEach { uri ->
|
||||
val (bitmap: Bitmap?, durationMs: Long?) = getBitmapFromVideo(uri)
|
||||
content.add(UploadContent.Video(uri, durationMs?.div(1000)?.toInt() ?: 0))
|
||||
if (bitmap != null) {
|
||||
imagesPreview.add(resizeImageToStrSize(bitmap, maxDataSize = 14000))
|
||||
}
|
||||
}
|
||||
|
||||
if (imagesPreview.isNotEmpty()) {
|
||||
composeState.value = composeState.value.copy(message = text ?: composeState.value.message, preview = ComposePreview.VideoPreview(imagesPreview, content))
|
||||
}
|
||||
}
|
||||
val processPickedFile = { uri: Uri?, text: String? ->
|
||||
if (uri != null) {
|
||||
val fileSize = getFileSize(context, uri)
|
||||
@@ -251,8 +267,10 @@ fun ComposeView(
|
||||
}
|
||||
}
|
||||
}
|
||||
val galleryLauncher = rememberLauncherForActivityResult(contract = PickMultipleFromGallery()) { processPickedImage(it, null) }
|
||||
val galleryLauncherFallback = rememberGetMultipleContentsLauncher { processPickedImage(it, null) }
|
||||
val galleryImageLauncher = rememberLauncherForActivityResult(contract = PickMultipleImagesFromGallery()) { processPickedImage(it, null) }
|
||||
val galleryImageLauncherFallback = rememberGetMultipleContentsLauncher { processPickedImage(it, null) }
|
||||
val galleryVideoLauncher = rememberLauncherForActivityResult(contract = PickMultipleVideosFromGallery()) { processPickedVideo(it, null) }
|
||||
val galleryVideoLauncherFallback = rememberGetMultipleContentsLauncher { processPickedVideo(it, null) }
|
||||
val filesLauncher = rememberGetContentLauncher { processPickedFile(it, null) }
|
||||
val recState: MutableState<RecordingState> = remember { mutableStateOf(RecordingState.NotStarted) }
|
||||
|
||||
@@ -271,9 +289,17 @@ fun ComposeView(
|
||||
}
|
||||
AttachmentOption.PickImage -> {
|
||||
try {
|
||||
galleryLauncher.launch(0)
|
||||
galleryImageLauncher.launch(0)
|
||||
} catch (e: ActivityNotFoundException) {
|
||||
galleryLauncherFallback.launch("image/*")
|
||||
galleryImageLauncherFallback.launch("image/*")
|
||||
}
|
||||
attachmentOption.value = null
|
||||
}
|
||||
AttachmentOption.PickVideo -> {
|
||||
try {
|
||||
galleryVideoLauncher.launch(0)
|
||||
} catch (e: ActivityNotFoundException) {
|
||||
galleryVideoLauncherFallback.launch("video/*")
|
||||
}
|
||||
attachmentOption.value = null
|
||||
}
|
||||
@@ -394,6 +420,7 @@ fun ComposeView(
|
||||
is MsgContent.MCText -> checkLinkPreview()
|
||||
is MsgContent.MCLink -> checkLinkPreview()
|
||||
is MsgContent.MCImage -> MsgContent.MCImage(msgText, image = msgContent.image)
|
||||
is MsgContent.MCVideo -> MsgContent.MCVideo(msgText, image = msgContent.image, duration = msgContent.duration)
|
||||
is MsgContent.MCVoice -> MsgContent.MCVoice(msgText, duration = msgContent.duration)
|
||||
is MsgContent.MCFile -> MsgContent.MCFile(msgText)
|
||||
is MsgContent.MCUnknown -> MsgContent.MCUnknown(type = msgContent.type, text = msgText, json = msgContent.json)
|
||||
@@ -438,6 +465,7 @@ fun ComposeView(
|
||||
val file = when (it) {
|
||||
is UploadContent.SimpleImage -> saveImage(context, it.uri)
|
||||
is UploadContent.AnimatedImage -> saveAnimImage(context, it.uri)
|
||||
else -> return@forEachIndexed
|
||||
}
|
||||
if (file != null) {
|
||||
files.add(file)
|
||||
@@ -445,6 +473,18 @@ fun ComposeView(
|
||||
}
|
||||
}
|
||||
}
|
||||
is ComposePreview.VideoPreview -> {
|
||||
preview.content.forEachIndexed { index, it ->
|
||||
val file = when (it) {
|
||||
is UploadContent.Video -> saveFileFromUri(context, it.uri)
|
||||
else -> return@forEachIndexed
|
||||
}
|
||||
if (file != null) {
|
||||
files.add(file)
|
||||
msgs.add(MsgContent.MCVideo(if (preview.content.lastIndex == index) msgText else "", preview.images[index], it.duration))
|
||||
}
|
||||
}
|
||||
}
|
||||
is ComposePreview.VoicePreview -> {
|
||||
val tmpFile = File(preview.voice)
|
||||
AudioPlayer.stop(tmpFile.absolutePath)
|
||||
@@ -475,7 +515,12 @@ fun ComposeView(
|
||||
if (content !is MsgContent.MCVoice && index == msgs.lastIndex) live else false
|
||||
)
|
||||
}
|
||||
if (sent == null && (cs.preview is ComposePreview.ImagePreview || cs.preview is ComposePreview.FilePreview || cs.preview is ComposePreview.VoicePreview)) {
|
||||
if (sent == null &&
|
||||
(cs.preview is ComposePreview.ImagePreview ||
|
||||
cs.preview is ComposePreview.VideoPreview ||
|
||||
cs.preview is ComposePreview.FilePreview ||
|
||||
cs.preview is ComposePreview.VoicePreview)
|
||||
) {
|
||||
sent = send(cInfo, MsgContent.MCText(msgText), quotedItemId, null, live)
|
||||
}
|
||||
}
|
||||
@@ -602,6 +647,11 @@ fun ComposeView(
|
||||
::cancelImages,
|
||||
cancelEnabled = !composeState.value.editing
|
||||
)
|
||||
is ComposePreview.VideoPreview -> ComposeImageView(
|
||||
preview.images,
|
||||
::cancelImages,
|
||||
cancelEnabled = !composeState.value.editing
|
||||
)
|
||||
is ComposePreview.VoicePreview -> ComposeVoiceView(
|
||||
preview.voice,
|
||||
preview.durationMs,
|
||||
@@ -769,7 +819,7 @@ class PickFromGallery: ActivityResultContract<Int, Uri?>() {
|
||||
override fun parseResult(resultCode: Int, intent: Intent?): Uri? = intent?.data
|
||||
}
|
||||
|
||||
class PickMultipleFromGallery: ActivityResultContract<Int, List<Uri>>() {
|
||||
class PickMultipleImagesFromGallery: ActivityResultContract<Int, List<Uri>>() {
|
||||
override fun createIntent(context: Context, input: Int) =
|
||||
Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI).apply {
|
||||
putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
|
||||
@@ -794,3 +844,30 @@ class PickMultipleFromGallery: ActivityResultContract<Int, List<Uri>>() {
|
||||
else
|
||||
emptyList()
|
||||
}
|
||||
|
||||
|
||||
class PickMultipleVideosFromGallery: ActivityResultContract<Int, List<Uri>>() {
|
||||
override fun createIntent(context: Context, input: Int) =
|
||||
Intent(Intent.ACTION_PICK, MediaStore.Video.Media.INTERNAL_CONTENT_URI).apply {
|
||||
putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
|
||||
type = "video/*"
|
||||
}
|
||||
|
||||
override fun parseResult(resultCode: Int, intent: Intent?): List<Uri> =
|
||||
if (intent?.data != null)
|
||||
listOf(intent.data!!)
|
||||
else if (intent?.clipData != null)
|
||||
with(intent.clipData!!) {
|
||||
val uris = ArrayList<Uri>()
|
||||
for (i in 0 until kotlin.math.min(itemCount, 10)) {
|
||||
val uri = getItemAt(i).uri
|
||||
if (uri != null) uris.add(uri)
|
||||
}
|
||||
if (itemCount > 10) {
|
||||
AlertManager.shared.showAlertMsg(R.string.videos_limit_title, R.string.videos_limit_desc)
|
||||
}
|
||||
uris
|
||||
}
|
||||
else
|
||||
emptyList()
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ fun SendMsgView(
|
||||
) {
|
||||
Box(Modifier.padding(vertical = 8.dp)) {
|
||||
val cs = composeState.value
|
||||
val showProgress = cs.inProgress && (cs.preview is ComposePreview.ImagePreview || cs.preview is ComposePreview.FilePreview)
|
||||
val showProgress = cs.inProgress && (cs.preview is ComposePreview.ImagePreview || cs.preview is ComposePreview.VideoPreview || cs.preview is ComposePreview.FilePreview)
|
||||
val showVoiceButton = cs.message.isEmpty() && showVoiceRecordIcon && !composeState.value.editing &&
|
||||
cs.liveMessage == null && (cs.preview is ComposePreview.NoPreview || recState.value is RecordingState.Started)
|
||||
val showDeleteTextButton = rememberSaveable { mutableStateOf(false) }
|
||||
|
||||
+9
-24
@@ -5,7 +5,6 @@ import SectionDivider
|
||||
import SectionItemView
|
||||
import SectionSpacer
|
||||
import SectionView
|
||||
import android.util.Log
|
||||
import androidx.activity.compose.BackHandler
|
||||
import androidx.compose.foundation.*
|
||||
import androidx.compose.foundation.layout.*
|
||||
@@ -13,7 +12,6 @@ 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
|
||||
@@ -23,7 +21,6 @@ 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.TAG
|
||||
import chat.simplex.app.model.*
|
||||
import chat.simplex.app.ui.theme.*
|
||||
import chat.simplex.app.views.chat.*
|
||||
@@ -54,20 +51,15 @@ fun GroupMemberInfoView(
|
||||
developerTools,
|
||||
connectionCode,
|
||||
getContactChat = { chatModel.getContactChat(it) },
|
||||
knownDirectChat = {
|
||||
withApi {
|
||||
chatModel.chatItems.clear()
|
||||
chatModel.chatItems.addAll(it.chatItems)
|
||||
chatModel.chatId.value = it.chatInfo.id
|
||||
closeAll()
|
||||
}
|
||||
},
|
||||
newDirectChat = {
|
||||
openDirectChat = {
|
||||
withApi {
|
||||
val c = chatModel.controller.apiGetChat(ChatType.Direct, it)
|
||||
if (c != null) {
|
||||
chatModel.addChat(c)
|
||||
if (chatModel.getContactChat(it) == null) {
|
||||
chatModel.addChat(c)
|
||||
}
|
||||
chatModel.chatItems.clear()
|
||||
chatModel.chatItems.addAll(c.chatItems)
|
||||
chatModel.chatId.value = c.id
|
||||
closeAll()
|
||||
}
|
||||
@@ -150,8 +142,7 @@ fun GroupMemberInfoLayout(
|
||||
developerTools: Boolean,
|
||||
connectionCode: String?,
|
||||
getContactChat: (Long) -> Chat?,
|
||||
knownDirectChat: (Chat) -> Unit,
|
||||
newDirectChat: (Long) -> Unit,
|
||||
openDirectChat: (Long) -> Unit,
|
||||
removeMember: () -> Unit,
|
||||
onRoleSelected: (GroupMemberRole) -> Unit,
|
||||
switchMemberAddress: () -> Unit,
|
||||
@@ -176,13 +167,8 @@ fun GroupMemberInfoLayout(
|
||||
if (contactId != null) {
|
||||
SectionView {
|
||||
val chat = getContactChat(contactId)
|
||||
if (chat != null && chat.chatInfo is ChatInfo.Direct && chat.chatInfo.contact.directOrUsed) {
|
||||
OpenChatButton(onClick = { knownDirectChat(chat) })
|
||||
if (connectionCode != null) {
|
||||
SectionDivider()
|
||||
}
|
||||
} else if (groupInfo.fullGroupPreferences.directMessages.on) {
|
||||
OpenChatButton(onClick = { newDirectChat(contactId) })
|
||||
if ((chat != null && chat.chatInfo is ChatInfo.Direct && chat.chatInfo.contact.directOrUsed) || groupInfo.fullGroupPreferences.directMessages.on) {
|
||||
OpenChatButton(onClick = { openDirectChat(contactId) })
|
||||
if (connectionCode != null) {
|
||||
SectionDivider()
|
||||
}
|
||||
@@ -364,8 +350,7 @@ fun PreviewGroupMemberInfoLayout() {
|
||||
developerTools = false,
|
||||
connectionCode = "123",
|
||||
getContactChat = { Chat.sampleData },
|
||||
knownDirectChat = {},
|
||||
newDirectChat = {},
|
||||
openDirectChat = {},
|
||||
removeMember = {},
|
||||
onRoleSelected = {},
|
||||
switchMemberAddress = {},
|
||||
|
||||
@@ -115,7 +115,7 @@ fun CIFileView(
|
||||
CircularProgressIndicator(
|
||||
Modifier.size(32.dp),
|
||||
color = if (isInDarkTheme()) FileDark else FileLight,
|
||||
strokeWidth = 4.dp
|
||||
strokeWidth = 3.dp
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package chat.simplex.app.views.chat.item
|
||||
|
||||
import android.graphics.Bitmap
|
||||
import android.os.Build.VERSION.SDK_INT
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.combinedClickable
|
||||
import androidx.compose.foundation.layout.*
|
||||
@@ -9,8 +10,7 @@ import androidx.compose.material.CircularProgressIndicator
|
||||
import androidx.compose.material.Icon
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.Check
|
||||
import androidx.compose.material.icons.outlined.ArrowDownward
|
||||
import androidx.compose.material.icons.outlined.MoreHoriz
|
||||
import androidx.compose.material.icons.outlined.*
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
@@ -18,6 +18,7 @@ import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.asImageBitmap
|
||||
import androidx.compose.ui.graphics.painter.BitmapPainter
|
||||
import androidx.compose.ui.graphics.painter.Painter
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.layout.ContentScale
|
||||
import androidx.compose.ui.layout.layoutId
|
||||
import androidx.compose.ui.platform.*
|
||||
@@ -53,6 +54,16 @@ fun CIImageView(
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun fileIcon(icon: ImageVector, @StringRes stringId: Int) {
|
||||
Icon(
|
||||
icon,
|
||||
stringResource(stringId),
|
||||
Modifier.fillMaxSize(),
|
||||
tint = Color.White
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun loadingIndicator() {
|
||||
if (file != null) {
|
||||
@@ -68,31 +79,13 @@ fun CIImageView(
|
||||
FileProtocol.XFTP -> progressIndicator()
|
||||
FileProtocol.SMP -> {}
|
||||
}
|
||||
is CIFileStatus.SndTransfer ->
|
||||
progressIndicator()
|
||||
is CIFileStatus.SndComplete ->
|
||||
Icon(
|
||||
Icons.Filled.Check,
|
||||
stringResource(R.string.icon_descr_image_snd_complete),
|
||||
Modifier.fillMaxSize(),
|
||||
tint = Color.White
|
||||
)
|
||||
is CIFileStatus.RcvAccepted ->
|
||||
Icon(
|
||||
Icons.Outlined.MoreHoriz,
|
||||
stringResource(R.string.icon_descr_waiting_for_image),
|
||||
Modifier.fillMaxSize(),
|
||||
tint = Color.White
|
||||
)
|
||||
is CIFileStatus.RcvTransfer ->
|
||||
progressIndicator()
|
||||
is CIFileStatus.RcvInvitation ->
|
||||
Icon(
|
||||
Icons.Outlined.ArrowDownward,
|
||||
stringResource(R.string.icon_descr_asked_to_receive),
|
||||
Modifier.fillMaxSize(),
|
||||
tint = Color.White
|
||||
)
|
||||
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.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)
|
||||
else -> {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,339 @@
|
||||
package chat.simplex.app.views.chat.item
|
||||
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.Rect
|
||||
import android.net.Uri
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.compose.foundation.*
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.shape.CornerSize
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
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.runtime.saveable.rememberSaveable
|
||||
import androidx.compose.ui.*
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.asImageBitmap
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.layout.*
|
||||
import androidx.compose.ui.platform.*
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.unit.*
|
||||
import androidx.compose.ui.viewinterop.AndroidView
|
||||
import androidx.core.content.FileProvider
|
||||
import androidx.core.graphics.drawable.toDrawable
|
||||
import chat.simplex.app.*
|
||||
import chat.simplex.app.R
|
||||
import chat.simplex.app.model.*
|
||||
import chat.simplex.app.ui.theme.*
|
||||
import chat.simplex.app.views.helpers.*
|
||||
import com.google.android.exoplayer2.ui.AspectRatioFrameLayout.RESIZE_MODE_FIXED_WIDTH
|
||||
import com.google.android.exoplayer2.ui.StyledPlayerView
|
||||
import java.io.File
|
||||
|
||||
@Composable
|
||||
fun CIVideoView(
|
||||
image: String,
|
||||
duration: Int,
|
||||
file: CIFile?,
|
||||
imageProvider: () -> ImageGalleryProvider,
|
||||
showMenu: MutableState<Boolean>,
|
||||
receiveFile: (Long) -> Unit
|
||||
) {
|
||||
Box(
|
||||
Modifier.layoutId(CHAT_IMAGE_LAYOUT_ID),
|
||||
contentAlignment = Alignment.TopEnd
|
||||
) {
|
||||
val context = LocalContext.current
|
||||
val filePath = remember(file) { getLoadedFilePath(SimplexApp.context, file) }
|
||||
val preview = remember(image) { base64ToBitmap(image) }
|
||||
if (file != null && filePath != null) {
|
||||
val uri = remember(filePath) { FileProvider.getUriForFile(context, "${BuildConfig.APPLICATION_ID}.provider", File(filePath)) }
|
||||
val view = LocalView.current
|
||||
VideoView(uri, file, preview, duration * 1000L, showMenu, onClick = {
|
||||
hideKeyboard(view)
|
||||
ModalManager.shared.showCustomModal(animated = false) { close ->
|
||||
ImageFullScreenView(imageProvider, close)
|
||||
}
|
||||
})
|
||||
} else {
|
||||
Box {
|
||||
ImageView(preview, showMenu, onClick = {
|
||||
if (file != null) {
|
||||
when (file.fileStatus) {
|
||||
CIFileStatus.RcvInvitation ->
|
||||
receiveFileIfValidSize(file, receiveFile)
|
||||
CIFileStatus.RcvAccepted ->
|
||||
when (file.fileProtocol) {
|
||||
FileProtocol.XFTP ->
|
||||
AlertManager.shared.showAlertMsg(
|
||||
generalGetString(R.string.waiting_for_video),
|
||||
generalGetString(R.string.video_will_be_received_when_contact_completes_uploading)
|
||||
)
|
||||
|
||||
FileProtocol.SMP ->
|
||||
AlertManager.shared.showAlertMsg(
|
||||
generalGetString(R.string.waiting_for_video),
|
||||
generalGetString(R.string.video_will_be_received_when_contact_is_online)
|
||||
)
|
||||
}
|
||||
CIFileStatus.RcvTransfer(rcvProgress = 7, rcvTotal = 10) -> {} // ?
|
||||
CIFileStatus.RcvComplete -> {} // ?
|
||||
CIFileStatus.RcvCancelled -> {} // TODO
|
||||
else -> {}
|
||||
}
|
||||
}
|
||||
})
|
||||
if (file != null) {
|
||||
DurationProgress(file, remember { mutableStateOf(false) }, remember { mutableStateOf(duration * 1000L) }, remember { mutableStateOf(0L) }/*, soundEnabled*/)
|
||||
}
|
||||
if (file?.fileStatus is CIFileStatus.RcvInvitation) {
|
||||
PlayButton(error = false, { showMenu.value = true }) { receiveFileIfValidSize(file, receiveFile) }
|
||||
}
|
||||
}
|
||||
}
|
||||
loadingIndicator(file)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun VideoView(uri: Uri, file: CIFile, defaultPreview: Bitmap, defaultDuration: Long, showMenu: MutableState<Boolean>, onClick: () -> Unit) {
|
||||
val context = LocalContext.current
|
||||
val player = remember(uri) { VideoPlayer.getOrCreate(uri, false, defaultPreview, defaultDuration, true, context) }
|
||||
val videoPlaying = remember(uri.path) { player.videoPlaying }
|
||||
val progress = remember(uri.path) { player.progress }
|
||||
val duration = remember(uri.path) { player.duration }
|
||||
val preview by remember { player.preview }
|
||||
// val soundEnabled by rememberSaveable(uri.path) { player.soundEnabled }
|
||||
val brokenVideo by rememberSaveable(uri.path) { player.brokenVideo }
|
||||
val play = {
|
||||
player.enableSound(true)
|
||||
player.play(true)
|
||||
}
|
||||
val stop = {
|
||||
player.enableSound(false)
|
||||
player.stop()
|
||||
}
|
||||
val showPreview = remember { derivedStateOf { !videoPlaying.value || progress.value == 0L } }
|
||||
DisposableEffect(Unit) {
|
||||
onDispose {
|
||||
stop()
|
||||
}
|
||||
}
|
||||
Box {
|
||||
val windowWidth = LocalWindowWidth()
|
||||
val width = remember(preview) { if (preview.width * 0.97 <= preview.height) videoViewFullWidth(windowWidth) * 0.75f else 1000.dp }
|
||||
AndroidView(
|
||||
factory = { ctx ->
|
||||
StyledPlayerView(ctx).apply {
|
||||
useController = false
|
||||
resizeMode = RESIZE_MODE_FIXED_WIDTH
|
||||
this.player = player.player
|
||||
}
|
||||
},
|
||||
Modifier
|
||||
.width(width)
|
||||
.combinedClickable(
|
||||
onLongClick = { showMenu.value = true },
|
||||
onClick = { if (player.player.playWhenReady) stop() else onClick() }
|
||||
)
|
||||
)
|
||||
if (showPreview.value) {
|
||||
ImageView(preview, showMenu, onClick)
|
||||
PlayButton(brokenVideo, onLongClick = { showMenu.value = true }, play)
|
||||
}
|
||||
DurationProgress(file, videoPlaying, duration, progress/*, soundEnabled*/)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun BoxScope.PlayButton(error: Boolean = false, onLongClick: () -> Unit, onClick: () -> Unit) {
|
||||
Surface(
|
||||
Modifier.align(Alignment.Center),
|
||||
color = Color.Black.copy(alpha = 0.25f),
|
||||
shape = RoundedCornerShape(percent = 50)
|
||||
) {
|
||||
Box(
|
||||
Modifier
|
||||
.defaultMinSize(minWidth = 40.dp, minHeight = 40.dp)
|
||||
.combinedClickable(onClick = onClick, onLongClick = onLongClick),
|
||||
contentAlignment = Alignment.Center
|
||||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Filled.PlayArrow,
|
||||
contentDescription = null,
|
||||
Modifier.size(25.dp),
|
||||
tint = if (error) WarningOrange else Color.White
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun DurationProgress(file: CIFile, playing: MutableState<Boolean>, duration: MutableState<Long>, progress: MutableState<Long>/*, soundEnabled: MutableState<Boolean>*/) {
|
||||
if (duration.value > 0L || progress.value > 0) {
|
||||
Row {
|
||||
Box(
|
||||
Modifier
|
||||
.padding(DEFAULT_PADDING_HALF)
|
||||
.background(Color.Black.copy(alpha = 0.35f), RoundedCornerShape(percent = 50))
|
||||
.padding(vertical = 2.dp, horizontal = 4.dp)
|
||||
) {
|
||||
val time = if (progress.value > 0) progress.value else duration.value
|
||||
val timeStr = durationText((time / 1000).toInt())
|
||||
val width = if (timeStr.length <= 5) 44 else 50
|
||||
Text(
|
||||
timeStr,
|
||||
Modifier.widthIn(min = with(LocalDensity.current) { width.sp.toDp() }).padding(horizontal = 4.dp),
|
||||
fontSize = 13.sp,
|
||||
color = Color.White
|
||||
)
|
||||
/*if (!soundEnabled.value) {
|
||||
Icon(Icons.Outlined.VolumeOff, null,
|
||||
Modifier.padding(start = 5.dp).size(10.dp),
|
||||
tint = Color.White
|
||||
)
|
||||
}*/
|
||||
}
|
||||
if (!playing.value) {
|
||||
Box(
|
||||
Modifier
|
||||
.padding(top = DEFAULT_PADDING_HALF)
|
||||
.background(Color.Black.copy(alpha = 0.35f), RoundedCornerShape(percent = 50))
|
||||
.padding(vertical = 2.dp, horizontal = 4.dp)
|
||||
) {
|
||||
Text(
|
||||
formatBytes(file.fileSize),
|
||||
Modifier.padding(horizontal = 4.dp),
|
||||
fontSize = 13.sp,
|
||||
color = Color.White
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun ImageView(preview: Bitmap, showMenu: MutableState<Boolean>, onClick: () -> Unit) {
|
||||
val windowWidth = LocalWindowWidth()
|
||||
val width = remember(preview) { if (preview.width * 0.97 <= preview.height) videoViewFullWidth(windowWidth) * 0.75f else 1000.dp }
|
||||
Image(
|
||||
preview.asImageBitmap(),
|
||||
contentDescription = stringResource(R.string.video_descr),
|
||||
modifier = Modifier
|
||||
.width(width)
|
||||
.combinedClickable(
|
||||
onLongClick = { showMenu.value = true },
|
||||
onClick = onClick
|
||||
),
|
||||
contentScale = ContentScale.FillWidth,
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun LocalWindowWidth(): Dp {
|
||||
val view = LocalView.current
|
||||
val density = LocalDensity.current.density
|
||||
return remember {
|
||||
val rect = Rect()
|
||||
view.getWindowVisibleDisplayFrame(rect)
|
||||
(rect.width() / density).dp
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun progressIndicator() {
|
||||
CircularProgressIndicator(
|
||||
Modifier.size(16.dp),
|
||||
color = Color.White,
|
||||
strokeWidth = 2.dp
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun fileIcon(icon: ImageVector, @StringRes stringId: Int) {
|
||||
Icon(
|
||||
icon,
|
||||
stringResource(stringId),
|
||||
Modifier.fillMaxSize(),
|
||||
tint = Color.White
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun progressCircle(progress: Long, total: Long) {
|
||||
val angle = 360f * (progress.toDouble() / total.toDouble()).toFloat()
|
||||
val strokeWidth = with(LocalDensity.current) { 2.dp.toPx() }
|
||||
val strokeColor = Color.White
|
||||
Surface(
|
||||
Modifier.drawRingModifier(angle, strokeColor, strokeWidth),
|
||||
color = Color.Transparent,
|
||||
shape = MaterialTheme.shapes.small.copy(CornerSize(percent = 50))
|
||||
) {
|
||||
Box(Modifier.size(16.dp))
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun loadingIndicator(file: CIFile?) {
|
||||
if (file != null) {
|
||||
Box(
|
||||
Modifier
|
||||
.padding(8.dp)
|
||||
.size(20.dp),
|
||||
contentAlignment = Alignment.Center
|
||||
) {
|
||||
when (file.fileStatus) {
|
||||
is CIFileStatus.SndStored ->
|
||||
when (file.fileProtocol) {
|
||||
FileProtocol.XFTP -> progressIndicator()
|
||||
FileProtocol.SMP -> {}
|
||||
}
|
||||
is CIFileStatus.SndTransfer ->
|
||||
when (file.fileProtocol) {
|
||||
FileProtocol.XFTP -> progressCircle(file.fileStatus.sndProgress, file.fileStatus.sndTotal)
|
||||
FileProtocol.SMP -> progressIndicator()
|
||||
}
|
||||
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.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 ->
|
||||
if (file.fileProtocol == FileProtocol.XFTP && file.fileStatus.rcvProgress < file.fileStatus.rcvTotal) {
|
||||
progressCircle(file.fileStatus.rcvProgress, file.fileStatus.rcvTotal)
|
||||
} else {
|
||||
progressIndicator()
|
||||
}
|
||||
is CIFileStatus.RcvCancelled -> fileIcon(Icons.Outlined.Close, R.string.icon_descr_file)
|
||||
else -> {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun fileSizeValid(file: CIFile?): Boolean {
|
||||
if (file != null) {
|
||||
return file.fileSize <= getMaxFileSize(file.fileProtocol)
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
private fun receiveFileIfValidSize(file: CIFile, receiveFile: (Long) -> Unit) {
|
||||
if (fileSizeValid(file)) {
|
||||
receiveFile(file.fileId)
|
||||
} else {
|
||||
AlertManager.shared.showAlertMsg(
|
||||
generalGetString(R.string.large_file),
|
||||
String.format(generalGetString(R.string.contact_sent_large_file), formatBytes(getMaxFileSize(file.fileProtocol)))
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun videoViewFullWidth(windowWidth: Dp): Dp {
|
||||
val approximatePadding = 100.dp
|
||||
return minOf(1000.dp, windowWidth - approximatePadding)
|
||||
}
|
||||
@@ -132,7 +132,7 @@ fun ChatItemView(
|
||||
copyText(context, cItem.content.text)
|
||||
showMenu.value = false
|
||||
})
|
||||
if (cItem.content.msgContent is MsgContent.MCImage || cItem.content.msgContent is MsgContent.MCFile || cItem.content.msgContent is MsgContent.MCVoice) {
|
||||
if (cItem.content.msgContent is MsgContent.MCImage || cItem.content.msgContent is MsgContent.MCVideo || cItem.content.msgContent is MsgContent.MCFile || cItem.content.msgContent is MsgContent.MCVoice) {
|
||||
val filePath = getLoadedFilePath(context, cItem.file)
|
||||
if (filePath != null) {
|
||||
val writePermissionState = rememberPermissionState(permission = Manifest.permission.WRITE_EXTERNAL_STORAGE)
|
||||
@@ -145,8 +145,7 @@ fun ChatItemView(
|
||||
writePermissionState.launchPermissionRequest()
|
||||
}
|
||||
}
|
||||
is MsgContent.MCFile -> saveFileLauncher.launch(cItem.file?.fileName)
|
||||
is MsgContent.MCVoice -> saveFileLauncher.launch(cItem.file?.fileName)
|
||||
is MsgContent.MCFile, is MsgContent.MCVoice, is MsgContent.MCVideo -> saveFileLauncher.launch(cItem.file?.fileName)
|
||||
else -> {}
|
||||
}
|
||||
showMenu.value = false
|
||||
|
||||
@@ -125,6 +125,18 @@ fun FramedItemView(
|
||||
modifier = Modifier.size(68.dp).clipToBounds()
|
||||
)
|
||||
}
|
||||
is MsgContent.MCVideo -> {
|
||||
Box(Modifier.fillMaxWidth().weight(1f)) {
|
||||
ciQuotedMsgView(qi)
|
||||
}
|
||||
val imageBitmap = base64ToBitmap(qi.content.image).asImageBitmap()
|
||||
Image(
|
||||
imageBitmap,
|
||||
contentDescription = stringResource(R.string.video_descr),
|
||||
contentScale = ContentScale.Crop,
|
||||
modifier = Modifier.size(68.dp).clipToBounds()
|
||||
)
|
||||
}
|
||||
is MsgContent.MCFile, is MsgContent.MCVoice -> {
|
||||
Box(Modifier.fillMaxWidth().weight(1f)) {
|
||||
ciQuotedMsgView(qi)
|
||||
@@ -151,7 +163,8 @@ fun FramedItemView(
|
||||
}
|
||||
}
|
||||
|
||||
val transparentBackground = (ci.content.msgContent is MsgContent.MCImage) && !ci.meta.isLive && ci.content.text.isEmpty() && ci.quotedItem == null
|
||||
val transparentBackground = (ci.content.msgContent is MsgContent.MCImage || ci.content.msgContent is MsgContent.MCVideo) &&
|
||||
!ci.meta.isLive && ci.content.text.isEmpty() && ci.quotedItem == null
|
||||
|
||||
Box(Modifier
|
||||
.clip(RoundedCornerShape(18.dp))
|
||||
@@ -198,6 +211,14 @@ fun FramedItemView(
|
||||
CIMarkdownText(ci, chatTTL, showMember, linkMode, uriHandler)
|
||||
}
|
||||
}
|
||||
is MsgContent.MCVideo -> {
|
||||
CIVideoView(image = mc.image, mc.duration, file = ci.file, imageProvider ?: return@PriorityLayout, showMenu, receiveFile)
|
||||
if (mc.text == "" && !ci.meta.isLive) {
|
||||
metaColor = Color.White
|
||||
} else {
|
||||
CIMarkdownText(ci, chatTTL, showMember, linkMode, uriHandler)
|
||||
}
|
||||
}
|
||||
is MsgContent.MCVoice -> {
|
||||
CIVoiceView(mc.duration, ci.file, ci.meta.itemEdited, ci.chatDir.sent, hasText = true, ci, timedMessagesTTL = chatTTL, longClick = { onLinkLongClick("") })
|
||||
if (mc.text != "") {
|
||||
|
||||
+119
-54
@@ -3,21 +3,28 @@ package chat.simplex.app.views.chat.item
|
||||
import android.graphics.Bitmap
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.view.View
|
||||
import androidx.activity.compose.BackHandler
|
||||
import androidx.compose.foundation.*
|
||||
import androidx.compose.foundation.interaction.MutableInteractionSource
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.material.*
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.runtime.saveable.rememberSaveable
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.*
|
||||
import androidx.compose.ui.graphics.painter.BitmapPainter
|
||||
import androidx.compose.ui.input.pointer.*
|
||||
import androidx.compose.ui.layout.ContentScale
|
||||
import androidx.compose.ui.layout.onGloballyPositioned
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.platform.LocalView
|
||||
import androidx.compose.ui.platform.*
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.unit.*
|
||||
import androidx.compose.ui.viewinterop.AndroidView
|
||||
import androidx.core.view.isVisible
|
||||
import chat.simplex.app.R
|
||||
import chat.simplex.app.views.chat.ProviderMedia
|
||||
import chat.simplex.app.views.helpers.*
|
||||
import coil.ImageLoader
|
||||
import coil.compose.rememberAsyncImagePainter
|
||||
@@ -26,13 +33,16 @@ import coil.decode.ImageDecoderDecoder
|
||||
import coil.request.ImageRequest
|
||||
import coil.size.Size
|
||||
import com.google.accompanist.pager.*
|
||||
import com.google.android.exoplayer2.ui.AspectRatioFrameLayout
|
||||
import com.google.android.exoplayer2.ui.StyledPlayerView
|
||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlin.math.absoluteValue
|
||||
|
||||
interface ImageGalleryProvider {
|
||||
val initialIndex: Int
|
||||
val totalImagesSize: MutableState<Int>
|
||||
fun getImage(index: Int): Pair<Bitmap, Uri>?
|
||||
val totalMediaSize: MutableState<Int>
|
||||
fun getMedia(index: Int): ProviderMedia?
|
||||
fun currentPageChanged(index: Int)
|
||||
fun scrollToStart()
|
||||
fun onDismiss(index: Int)
|
||||
@@ -48,13 +58,17 @@ fun ImageFullScreenView(imageProvider: () -> ImageGalleryProvider, close: () ->
|
||||
// Pager doesn't ask previous page at initialization step who knows why. By not doing this, prev page is not checked and can be blank,
|
||||
// which makes this blank page visible for a moment. Prevent it by doing the check ourselves
|
||||
LaunchedEffect(Unit) {
|
||||
if (provider.getImage(provider.initialIndex - 1) == null) {
|
||||
if (provider.getMedia(provider.initialIndex - 1) == null) {
|
||||
provider.scrollToStart()
|
||||
pagerState.scrollToPage(0)
|
||||
}
|
||||
}
|
||||
val scope = rememberCoroutineScope()
|
||||
HorizontalPager(count = remember { provider.totalImagesSize }.value, state = pagerState) { index ->
|
||||
val playersToRelease = rememberSaveable { mutableSetOf<Uri>() }
|
||||
DisposableEffectOnGone(
|
||||
whenGone = { playersToRelease.forEach { VideoPlayer.release(it, true, true) } }
|
||||
)
|
||||
HorizontalPager(count = remember { provider.totalMediaSize }.value, state = pagerState) { index ->
|
||||
Column(
|
||||
Modifier
|
||||
.fillMaxSize()
|
||||
@@ -74,13 +88,13 @@ fun ImageFullScreenView(imageProvider: () -> ImageGalleryProvider, close: () ->
|
||||
if (settledCurrentPage != provider.initialIndex)
|
||||
provider.currentPageChanged(index)
|
||||
}
|
||||
val image = provider.getImage(index)
|
||||
if (image == null) {
|
||||
val media = provider.getMedia(index)
|
||||
if (media == null) {
|
||||
// No such image. Let's shrink total pages size or scroll to start of the list of pages to remove blank page automatically
|
||||
SideEffect {
|
||||
scope.launch {
|
||||
when (settledCurrentPage) {
|
||||
index - 1 -> provider.totalImagesSize.value = settledCurrentPage + 1
|
||||
index - 1 -> provider.totalMediaSize.value = settledCurrentPage + 1
|
||||
index + 1 -> {
|
||||
provider.scrollToStart()
|
||||
pagerState.scrollToPage(0)
|
||||
@@ -89,7 +103,6 @@ fun ImageFullScreenView(imageProvider: () -> ImageGalleryProvider, close: () ->
|
||||
}
|
||||
}
|
||||
} else {
|
||||
val (imageBitmap: Bitmap, uri: Uri) = image
|
||||
var scale by remember { mutableStateOf(1f) }
|
||||
var translationX by remember { mutableStateOf(0f) }
|
||||
var translationY by remember { mutableStateOf(0f) }
|
||||
@@ -100,54 +113,106 @@ fun ImageFullScreenView(imageProvider: () -> ImageGalleryProvider, close: () ->
|
||||
translationX = 0f
|
||||
translationY = 0f
|
||||
}
|
||||
// I'm making a new instance of imageLoader here because if I use one instance in multiple places
|
||||
// after end of composition here a GIF from the first instance will be paused automatically which isn't what I want
|
||||
val imageLoader = ImageLoader.Builder(LocalContext.current)
|
||||
.components {
|
||||
if (Build.VERSION.SDK_INT >= 28) {
|
||||
add(ImageDecoderDecoder.Factory())
|
||||
} else {
|
||||
add(GifDecoder.Factory())
|
||||
}
|
||||
val modifier = Modifier
|
||||
.onGloballyPositioned {
|
||||
viewWidth = it.size.width
|
||||
}
|
||||
.build()
|
||||
Image(
|
||||
rememberAsyncImagePainter(
|
||||
ImageRequest.Builder(LocalContext.current).data(data = uri).size(Size.ORIGINAL).build(),
|
||||
placeholder = BitmapPainter(imageBitmap.asImageBitmap()), // show original image while it's still loading by coil
|
||||
imageLoader = imageLoader
|
||||
),
|
||||
contentDescription = stringResource(R.string.image_descr),
|
||||
contentScale = ContentScale.Fit,
|
||||
modifier = Modifier
|
||||
.onGloballyPositioned {
|
||||
viewWidth = it.size.width
|
||||
}
|
||||
.graphicsLayer(
|
||||
scaleX = scale,
|
||||
scaleY = scale,
|
||||
translationX = translationX,
|
||||
translationY = translationY,
|
||||
)
|
||||
.pointerInput(Unit) {
|
||||
detectTransformGestures(
|
||||
{ allowTranslate },
|
||||
onGesture = { _, pan, gestureZoom, _ ->
|
||||
scale = (scale * gestureZoom).coerceIn(1f, 20f)
|
||||
allowTranslate = viewWidth * (scale - 1f) - ((translationX + pan.x * scale).absoluteValue * 2) > 0
|
||||
if (scale > 1 && allowTranslate) {
|
||||
translationX += pan.x * scale
|
||||
translationY += pan.y * scale
|
||||
} else if (allowTranslate) {
|
||||
translationX = 0f
|
||||
translationY = 0f
|
||||
}
|
||||
.graphicsLayer(
|
||||
scaleX = scale,
|
||||
scaleY = scale,
|
||||
translationX = translationX,
|
||||
translationY = translationY,
|
||||
)
|
||||
.pointerInput(Unit) {
|
||||
detectTransformGestures(
|
||||
{ allowTranslate },
|
||||
onGesture = { _, pan, gestureZoom, _ ->
|
||||
scale = (scale * gestureZoom).coerceIn(1f, 20f)
|
||||
allowTranslate = viewWidth * (scale - 1f) - ((translationX + pan.x * scale).absoluteValue * 2) > 0
|
||||
if (scale > 1 && allowTranslate) {
|
||||
translationX += pan.x * scale
|
||||
translationY += pan.y * scale
|
||||
} else if (allowTranslate) {
|
||||
translationX = 0f
|
||||
translationY = 0f
|
||||
}
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
.fillMaxSize()
|
||||
if (media is ProviderMedia.Image) {
|
||||
val (uri: Uri, imageBitmap: Bitmap) = media
|
||||
// I'm making a new instance of imageLoader here because if I use one instance in multiple places
|
||||
// after end of composition here a GIF from the first instance will be paused automatically which isn't what I want
|
||||
val imageLoader = ImageLoader.Builder(LocalContext.current)
|
||||
.components {
|
||||
if (Build.VERSION.SDK_INT >= 28) {
|
||||
add(ImageDecoderDecoder.Factory())
|
||||
} else {
|
||||
add(GifDecoder.Factory())
|
||||
}
|
||||
}
|
||||
.fillMaxSize(),
|
||||
)
|
||||
.build()
|
||||
Image(
|
||||
rememberAsyncImagePainter(
|
||||
ImageRequest.Builder(LocalContext.current).data(data = uri).size(Size.ORIGINAL).build(),
|
||||
placeholder = BitmapPainter(imageBitmap.asImageBitmap()), // show original image while it's still loading by coil
|
||||
imageLoader = imageLoader
|
||||
),
|
||||
contentDescription = stringResource(R.string.image_descr),
|
||||
contentScale = ContentScale.Fit,
|
||||
modifier = modifier,
|
||||
)
|
||||
} else if (media is ProviderMedia.Video) {
|
||||
val preview = remember(media.uri.path) { base64ToBitmap(media.preview) }
|
||||
VideoView(modifier, media.uri, preview, index == settledCurrentPage)
|
||||
DisposableEffect(Unit) {
|
||||
onDispose { playersToRelease.add(media.uri) }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun VideoView(modifier: Modifier, uri: Uri, defaultPreview: Bitmap, currentPage: Boolean) {
|
||||
val context = LocalContext.current
|
||||
val player = remember(uri) { VideoPlayer.getOrCreate(uri, true, defaultPreview, 0L, true, context) }
|
||||
val isCurrentPage = rememberUpdatedState(currentPage)
|
||||
val play = {
|
||||
player.play(true)
|
||||
}
|
||||
val stop = {
|
||||
player.stop()
|
||||
}
|
||||
LaunchedEffect(Unit) {
|
||||
player.enableSound(true)
|
||||
snapshotFlow { isCurrentPage.value }
|
||||
.distinctUntilChanged()
|
||||
.collect { if (it) play() else stop() }
|
||||
}
|
||||
|
||||
Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
|
||||
AndroidView(
|
||||
factory = { ctx ->
|
||||
StyledPlayerView(ctx).apply {
|
||||
resizeMode = if (ctx.resources.configuration.screenWidthDp > ctx.resources.configuration.screenHeightDp) {
|
||||
AspectRatioFrameLayout.RESIZE_MODE_FIXED_HEIGHT
|
||||
} else {
|
||||
AspectRatioFrameLayout.RESIZE_MODE_FIXED_WIDTH
|
||||
}
|
||||
setShowPreviousButton(false)
|
||||
setShowNextButton(false)
|
||||
setShowSubtitleButton(false)
|
||||
setShowVrButton(false)
|
||||
controllerAutoShow = false
|
||||
findViewById<View>(com.google.android.exoplayer2.R.id.exo_controls_background).setBackgroundColor(Color.Black.copy(alpha = 0.3f).toArgb())
|
||||
findViewById<View>(com.google.android.exoplayer2.R.id.exo_settings).isVisible = false
|
||||
this.player = player.player
|
||||
}
|
||||
},
|
||||
modifier
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,12 +15,14 @@ import chat.simplex.app.views.newchat.ActionButton
|
||||
sealed class AttachmentOption {
|
||||
object TakePhoto: AttachmentOption()
|
||||
object PickImage: AttachmentOption()
|
||||
object PickVideo: AttachmentOption()
|
||||
object PickFile: AttachmentOption()
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun ChooseAttachmentView(
|
||||
attachmentOption: MutableState<AttachmentOption?>,
|
||||
allowVideoAttachment: Boolean,
|
||||
hide: () -> Unit
|
||||
) {
|
||||
Box(
|
||||
@@ -45,6 +47,12 @@ fun ChooseAttachmentView(
|
||||
attachmentOption.value = AttachmentOption.PickImage
|
||||
hide()
|
||||
}
|
||||
if (allowVideoAttachment) {
|
||||
ActionButton(null, stringResource(R.string.from_gallery_button), icon = Icons.Outlined.Videocam) {
|
||||
attachmentOption.value = AttachmentOption.PickVideo
|
||||
hide()
|
||||
}
|
||||
}
|
||||
ActionButton(null, stringResource(R.string.choose_file), icon = Icons.Outlined.InsertDriveFile) {
|
||||
attachmentOption.value = AttachmentOption.PickFile
|
||||
hide()
|
||||
|
||||
@@ -48,4 +48,5 @@ object UriSerializer : KSerializer<Uri> {
|
||||
sealed class UploadContent {
|
||||
@Serializable data class SimpleImage(val uri: Uri): UploadContent()
|
||||
@Serializable data class AnimatedImage(val uri: Uri): UploadContent()
|
||||
@Serializable data class Video(val uri: Uri, val duration: Int): UploadContent()
|
||||
}
|
||||
|
||||
@@ -39,6 +39,7 @@ class RecorderNative(private val recordedBytesLimit: Long): Recorder {
|
||||
}
|
||||
|
||||
override fun start(onProgressUpdate: (position: Int?, finished: Boolean) -> Unit): String {
|
||||
VideoPlayer.stopAll()
|
||||
AudioPlayer.stop()
|
||||
val rec: MediaRecorder
|
||||
recorder = initRecorder().also { rec = it }
|
||||
@@ -152,6 +153,7 @@ object AudioPlayer {
|
||||
return null
|
||||
}
|
||||
|
||||
VideoPlayer.stopAll()
|
||||
RecorderNative.stopRecording?.invoke()
|
||||
val current = currentlyPlaying.value
|
||||
if (current == null || current.first != filePath) {
|
||||
|
||||
@@ -10,6 +10,7 @@ import android.content.res.Resources
|
||||
import android.graphics.*
|
||||
import android.graphics.Typeface
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.media.MediaMetadataRetriever
|
||||
import android.net.Uri
|
||||
import android.os.*
|
||||
import android.provider.OpenableColumns
|
||||
@@ -549,6 +550,19 @@ fun getMaxFileSize(fileProtocol: FileProtocol): Long {
|
||||
}
|
||||
}
|
||||
|
||||
fun getBitmapFromVideo(uri: Uri, timestamp: Long? = null, random: Boolean = true): VideoPlayer.PreviewAndDuration {
|
||||
val mmr = MediaMetadataRetriever()
|
||||
mmr.setDataSource(SimplexApp.context, uri)
|
||||
val durationMs = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)?.toLong()
|
||||
val image = when {
|
||||
timestamp != null -> mmr.getFrameAtTime(timestamp * 1000, MediaMetadataRetriever.OPTION_CLOSEST)
|
||||
random -> mmr.frameAtTime
|
||||
else -> mmr.getFrameAtIndex(0)
|
||||
}
|
||||
mmr.release()
|
||||
return VideoPlayer.PreviewAndDuration(image, durationMs, timestamp ?: 0)
|
||||
}
|
||||
|
||||
fun Color.darker(factor: Float = 0.1f): Color =
|
||||
Color(max(red * (1 - factor), 0f), max(green * (1 - factor), 0f), max(blue * (1 - factor), 0f), alpha)
|
||||
|
||||
@@ -606,3 +620,24 @@ fun UriHandler.openUriCatching(uri: String) {
|
||||
Log.e(TAG, e.stackTraceToString())
|
||||
}
|
||||
}
|
||||
|
||||
fun IntSize.Companion.Saver(): Saver<IntSize, *> = Saver(
|
||||
save = { it.width to it.height },
|
||||
restore = { IntSize(it.first, it.second) }
|
||||
)
|
||||
|
||||
@Composable
|
||||
fun DisposableEffectOnGone(always: () -> Unit = {}, whenDispose: () -> Unit = {}, whenGone: () -> Unit) {
|
||||
val context = LocalContext.current
|
||||
DisposableEffect(Unit) {
|
||||
always()
|
||||
val activity = context as? Activity ?: return@DisposableEffect onDispose {}
|
||||
val orientation = activity.resources.configuration.orientation
|
||||
onDispose {
|
||||
whenDispose()
|
||||
if (orientation == activity.resources.configuration.orientation) {
|
||||
whenGone()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,246 @@
|
||||
package chat.simplex.app.views.helpers
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Bitmap
|
||||
import android.media.session.PlaybackState
|
||||
import android.net.Uri
|
||||
import android.util.Log
|
||||
import androidx.compose.runtime.MutableState
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import chat.simplex.app.*
|
||||
import chat.simplex.app.R
|
||||
import com.google.android.exoplayer2.*
|
||||
import com.google.android.exoplayer2.C.*
|
||||
import com.google.android.exoplayer2.audio.AudioAttributes
|
||||
import com.google.android.exoplayer2.source.ProgressiveMediaSource
|
||||
import com.google.android.exoplayer2.upstream.DefaultDataSource
|
||||
import com.google.android.exoplayer2.upstream.DefaultHttpDataSource
|
||||
import kotlinx.coroutines.*
|
||||
import java.io.File
|
||||
|
||||
class VideoPlayer private constructor(
|
||||
private val uri: Uri,
|
||||
private val gallery: Boolean,
|
||||
private val defaultPreview: Bitmap,
|
||||
defaultDuration: Long,
|
||||
soundEnabled: Boolean,
|
||||
context: Context
|
||||
) {
|
||||
companion object {
|
||||
private val players: MutableMap<Pair<Uri, Boolean>, VideoPlayer> = mutableMapOf()
|
||||
private val previewsAndDurations: MutableMap<Uri, PreviewAndDuration> = mutableMapOf()
|
||||
|
||||
fun getOrCreate(
|
||||
uri: Uri,
|
||||
gallery: Boolean,
|
||||
defaultPreview: Bitmap,
|
||||
defaultDuration: Long,
|
||||
soundEnabled: Boolean,
|
||||
context: Context
|
||||
): VideoPlayer =
|
||||
players.getOrPut(uri to gallery) { VideoPlayer(uri, gallery, defaultPreview, defaultDuration, soundEnabled, context) }
|
||||
|
||||
fun enableSound(enable: Boolean, fileName: String?, gallery: Boolean): Boolean =
|
||||
player(fileName, gallery)?.enableSound(enable) == true
|
||||
|
||||
private fun player(fileName: String?, gallery: Boolean): VideoPlayer? {
|
||||
fileName ?: return null
|
||||
return players.values.firstOrNull { player -> player.uri.path?.endsWith(fileName) == true && player.gallery == gallery }
|
||||
}
|
||||
|
||||
fun release(uri: Uri, gallery: Boolean, remove: Boolean) =
|
||||
player(uri.path, gallery)?.release(remove)
|
||||
|
||||
fun stopAll() {
|
||||
players.values.forEach { it.stop() }
|
||||
}
|
||||
|
||||
fun releaseAll() {
|
||||
players.values.forEach { it.release(false) }
|
||||
players.clear()
|
||||
previewsAndDurations.clear()
|
||||
}
|
||||
}
|
||||
|
||||
data class PreviewAndDuration(val preview: Bitmap?, val duration: Long?, val timestamp: Long)
|
||||
|
||||
private val currentVolume: Float
|
||||
val soundEnabled: MutableState<Boolean> = mutableStateOf(soundEnabled)
|
||||
val brokenVideo: MutableState<Boolean> = mutableStateOf(false)
|
||||
val videoPlaying: MutableState<Boolean> = mutableStateOf(false)
|
||||
val progress: MutableState<Long> = mutableStateOf(0L)
|
||||
val duration: MutableState<Long> = mutableStateOf(defaultDuration)
|
||||
val preview: MutableState<Bitmap> = mutableStateOf(defaultPreview)
|
||||
|
||||
init {
|
||||
setPreviewAndDuration()
|
||||
}
|
||||
|
||||
val player = ExoPlayer.Builder(context,
|
||||
DefaultRenderersFactory(context))
|
||||
/*.setLoadControl(DefaultLoadControl.Builder()
|
||||
.setPrioritizeTimeOverSizeThresholds(false) // Could probably save some megabytes in memory in case it will be needed
|
||||
.createDefaultLoadControl())*/
|
||||
.setSeekBackIncrementMs(10_000)
|
||||
.setSeekForwardIncrementMs(10_000)
|
||||
.build()
|
||||
.apply {
|
||||
// Repeat the same track endlessly
|
||||
repeatMode = 1
|
||||
currentVolume = volume
|
||||
if (!soundEnabled) {
|
||||
volume = 0f
|
||||
}
|
||||
setAudioAttributes(
|
||||
AudioAttributes.Builder()
|
||||
.setContentType(CONTENT_TYPE_MUSIC)
|
||||
.setUsage(USAGE_MEDIA)
|
||||
.build(),
|
||||
true // disallow to play multiple instances simultaneously
|
||||
)
|
||||
}
|
||||
|
||||
private val listener: MutableState<((position: Long?, state: TrackState) -> Unit)?> = mutableStateOf(null)
|
||||
private var progressJob: Job? = null
|
||||
|
||||
enum class TrackState {
|
||||
PLAYING, PAUSED, STOPPED
|
||||
}
|
||||
|
||||
private fun start(seek: Long? = null, onProgressUpdate: (position: Long?, state: TrackState) -> Unit): Boolean {
|
||||
val filepath = getAppFilePath(SimplexApp.context, uri)
|
||||
if (filepath == null || !File(filepath).exists()) {
|
||||
Log.e(TAG, "No such file: $uri")
|
||||
brokenVideo.value = true
|
||||
return false
|
||||
}
|
||||
|
||||
if (soundEnabled.value) {
|
||||
RecorderNative.stopRecording?.invoke()
|
||||
}
|
||||
AudioPlayer.stop()
|
||||
stopAll()
|
||||
if (listener.value == null) {
|
||||
runCatching {
|
||||
val dataSourceFactory = DefaultDataSource.Factory(SimplexApp.context, DefaultHttpDataSource.Factory())
|
||||
val source = ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(uri))
|
||||
player.setMediaSource(source, seek ?: 0L)
|
||||
}.onFailure {
|
||||
Log.e(TAG, it.stackTraceToString())
|
||||
AlertManager.shared.showAlertMsg(generalGetString(R.string.unknown_error), it.message)
|
||||
brokenVideo.value = true
|
||||
return false
|
||||
}
|
||||
}
|
||||
if (player.playbackState == PlaybackState.STATE_NONE || player.playbackState == PlaybackState.STATE_STOPPED) {
|
||||
runCatching { player.prepare() }.onFailure {
|
||||
// Can happen when video file is broken
|
||||
Log.e(TAG, it.stackTraceToString())
|
||||
AlertManager.shared.showAlertMsg(generalGetString(R.string.unknown_error), it.message)
|
||||
brokenVideo.value = true
|
||||
return false
|
||||
}
|
||||
}
|
||||
if (seek != null) player.seekTo(seek)
|
||||
player.play()
|
||||
listener.value = onProgressUpdate
|
||||
// Player can only be accessed in one specific thread
|
||||
progressJob = CoroutineScope(Dispatchers.Main).launch {
|
||||
onProgressUpdate(player.currentPosition, TrackState.PLAYING)
|
||||
while (isActive && player.playbackState != Player.STATE_IDLE && player.playWhenReady) {
|
||||
// Even when current position is equal to duration, the player has isPlaying == true for some time,
|
||||
// so help to make the playback stopped in UI immediately
|
||||
if (player.currentPosition == player.duration) {
|
||||
onProgressUpdate(player.currentPosition, TrackState.PLAYING)
|
||||
break
|
||||
}
|
||||
delay(50)
|
||||
onProgressUpdate(player.currentPosition, TrackState.PLAYING)
|
||||
}
|
||||
/*
|
||||
* Since coroutine is still NOT canceled, means player ended (no stop/no pause). But in some cases
|
||||
* the player can show position != duration even if they actually equal.
|
||||
* Let's say to a listener that the position == duration in case of coroutine finished without cancel
|
||||
* */
|
||||
if (isActive) {
|
||||
onProgressUpdate(player.duration, TrackState.PAUSED)
|
||||
}
|
||||
onProgressUpdate(null, TrackState.PAUSED)
|
||||
}
|
||||
player.addListener(object: Player.Listener{
|
||||
override fun onIsPlayingChanged(isPlaying: Boolean) {
|
||||
super.onIsPlayingChanged(isPlaying)
|
||||
// Produce non-ideal transition from stopped to playing state while showing preview image in ChatView
|
||||
// videoPlaying.value = isPlaying
|
||||
}
|
||||
})
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
fun stop() {
|
||||
player.stop()
|
||||
stopListener()
|
||||
}
|
||||
|
||||
private fun stopListener() {
|
||||
val afterCoroutineCancel: CompletionHandler = {
|
||||
// Notify prev video listener about stop
|
||||
listener.value?.invoke(null, TrackState.STOPPED)
|
||||
}
|
||||
/** Preventing race by calling a code AFTER coroutine ends, so [TrackState] will be:
|
||||
* [TrackState.PLAYING] -> [TrackState.PAUSED] -> [TrackState.STOPPED] (in this order)
|
||||
* */
|
||||
if (progressJob != null) {
|
||||
progressJob?.invokeOnCompletion(afterCoroutineCancel)
|
||||
} else {
|
||||
afterCoroutineCancel(null)
|
||||
}
|
||||
progressJob?.cancel()
|
||||
progressJob = null
|
||||
}
|
||||
|
||||
fun play(resetOnEnd: Boolean) {
|
||||
if (progress.value == duration.value) {
|
||||
progress.value = 0
|
||||
}
|
||||
videoPlaying.value = start(progress.value) { pro, _ ->
|
||||
if (pro != null) {
|
||||
progress.value = pro
|
||||
}
|
||||
if (pro == null || pro == duration.value) {
|
||||
videoPlaying.value = false
|
||||
if (pro == duration.value) {
|
||||
progress.value = if (resetOnEnd) 0 else duration.value
|
||||
}/* else if (state == TrackState.STOPPED) {
|
||||
progress.value = 0 //
|
||||
}*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun enableSound(enable: Boolean): Boolean {
|
||||
if (soundEnabled.value == enable) return false
|
||||
soundEnabled.value = enable
|
||||
player.volume = if (enable) currentVolume else 0f
|
||||
return true
|
||||
}
|
||||
|
||||
fun release(remove: Boolean) {
|
||||
player.release()
|
||||
if (remove) {
|
||||
players.remove(uri to gallery)
|
||||
}
|
||||
}
|
||||
|
||||
private fun setPreviewAndDuration() {
|
||||
// It freezes main thread, doing it in IO thread
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
val previewAndDuration = previewsAndDurations.getOrPut(uri) { getBitmapFromVideo(uri) }
|
||||
withContext(Dispatchers.Main) {
|
||||
preview.value = previewAndDuration.preview ?: defaultPreview
|
||||
duration.value = (previewAndDuration.duration ?: 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+8
-8
@@ -52,7 +52,7 @@ fun UserProfilesView(m: ChatModel, search: MutableState<String>, profileHidden:
|
||||
},
|
||||
activateUser = { user ->
|
||||
withBGApi {
|
||||
m.controller.changeActiveUser(user.userId, userViewPassword(user, searchTextOrPassword.value))
|
||||
m.controller.changeActiveUser(user.userId, userViewPassword(user, searchTextOrPassword.value.trim()))
|
||||
}
|
||||
},
|
||||
removeUser = { user ->
|
||||
@@ -71,13 +71,13 @@ fun UserProfilesView(m: ChatModel, search: MutableState<String>, profileHidden:
|
||||
Column {
|
||||
SectionItemView({
|
||||
AlertManager.shared.hideAlert()
|
||||
removeUser(m, user, users, true, searchTextOrPassword.value)
|
||||
removeUser(m, user, users, true, searchTextOrPassword.value.trim())
|
||||
}) {
|
||||
Text(stringResource(R.string.users_delete_with_connections), color = Color.Red)
|
||||
}
|
||||
SectionItemView({
|
||||
AlertManager.shared.hideAlert()
|
||||
removeUser(m, user, users, false, searchTextOrPassword.value)
|
||||
removeUser(m, user, users, false, searchTextOrPassword.value.trim())
|
||||
}
|
||||
) {
|
||||
Text(stringResource(R.string.users_delete_data_only), color = Color.Red)
|
||||
@@ -107,7 +107,7 @@ fun UserProfilesView(m: ChatModel, search: MutableState<String>, profileHidden:
|
||||
}
|
||||
}
|
||||
} else {
|
||||
withBGApi { setUserPrivacy(m) { m.controller.apiUnhideUser(user.userId, searchTextOrPassword.value) } }
|
||||
withBGApi { setUserPrivacy(m) { m.controller.apiUnhideUser(user.userId, searchTextOrPassword.value.trim()) } }
|
||||
}
|
||||
},
|
||||
muteUser = { user ->
|
||||
@@ -173,7 +173,7 @@ private fun UserProfilesView(
|
||||
UserView(user, users, visibleUsersCount, activateUser, removeUser, unhideUser, muteUser, unmuteUser, showHiddenProfile)
|
||||
SectionDivider()
|
||||
}
|
||||
if (searchTextOrPassword.value.isEmpty()) {
|
||||
if (searchTextOrPassword.value.trim().isEmpty()) {
|
||||
SectionItemView(addUser, minHeight = 68.dp) {
|
||||
Icon(Icons.Outlined.Add, stringResource(R.string.users_add), tint = MaterialTheme.colors.primary)
|
||||
Spacer(Modifier.padding(horizontal = 4.dp))
|
||||
@@ -324,10 +324,10 @@ private fun correctPassword(user: User, pwd: String): Boolean {
|
||||
}
|
||||
|
||||
private fun userViewPassword(user: User, searchTextOrPassword: String): String? =
|
||||
if (user.hidden) searchTextOrPassword else null
|
||||
if (user.hidden) searchTextOrPassword.trim() else null
|
||||
|
||||
private fun passwordEntryRequired(user: User, searchTextOrPassword: String): Boolean =
|
||||
user.hidden && user.activeUser && !correctPassword(user, searchTextOrPassword)
|
||||
user.hidden && user.activeUser && !correctPassword(user, searchTextOrPassword.trim())
|
||||
|
||||
private fun removeUser(m: ChatModel, user: User, users: List<User>, delSMPQueues: Boolean, searchTextOrPassword: String) {
|
||||
if (passwordEntryRequired(user, searchTextOrPassword)) {
|
||||
@@ -340,7 +340,7 @@ private fun removeUser(m: ChatModel, user: User, users: List<User>, delSMPQueues
|
||||
}
|
||||
}
|
||||
} else {
|
||||
withBGApi { doRemoveUser(m, user, users, delSMPQueues, userViewPassword(user, searchTextOrPassword)) }
|
||||
withBGApi { doRemoveUser(m, user, users, delSMPQueues, userViewPassword(user, searchTextOrPassword.trim())) }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,4 +26,25 @@
|
||||
<string name="smp_servers_per_user">خوادم الاتصالات الجديدة لملف تعريف الدردشة الحالي الخاص بك</string>
|
||||
<string name="switch_receiving_address_desc">هذه الميزة تجريبية! ستعمل فقط إذا كان لدى العميل الآخر الإصدار 4.2 مثبتًا. يجب أن ترى الرسالة في المحادثة بمجرد اكتمال تغيير العنوان - يرجى التحقق من أنه لا يزال بإمكانك تلقي الرسائل من جهة الاتصال هذه (أو عضو المجموعة).</string>
|
||||
<string name="this_link_is_not_a_valid_connection_link">هذا الارتباط ليس ارتباط اتصال صالح!</string>
|
||||
<string name="allow_verb">يسمح</string>
|
||||
<string name="smp_servers_preset_add">أضف خوادم محددة مسبقًا</string>
|
||||
<string name="smp_servers_add_to_another_device">أضف إلى جهاز آخر</string>
|
||||
<string name="users_delete_all_chats_deleted">سيتم حذف جميع الدردشات والرسائل - لا يمكن التراجع عن هذا!</string>
|
||||
<string name="network_enable_socks_info">الوصول إلى الخوادم عبر بروكسي SOCKS على المنفذ 9050؟ يجب بدء تشغيل الوكيل قبل تمكين هذا الخيار.</string>
|
||||
<string name="accept_requests">قبول طلبات</string>
|
||||
<string name="smp_servers_add">إضافة خادم …</string>
|
||||
<string name="network_settings">إعدادات الشبكة المتقدمة</string>
|
||||
<string name="all_group_members_will_remain_connected">سيبقى جميع أعضاء المجموعة على اتصال.</string>
|
||||
<string name="allow_disappearing_messages_only_if">السماح باختفاء الرسائل فقط إذا سمحت جهة الاتصال الخاصة بك بذلك.</string>
|
||||
<string name="allow_irreversible_message_deletion_only_if">السماح بحذف الرسائل بشكل لا رجوع فيه فقط إذا سمحت لك جهة الاتصال بذلك.</string>
|
||||
<string name="group_member_role_admin">مسؤل</string>
|
||||
<string name="users_add">إضافة ملف التعريف</string>
|
||||
<string name="allow_direct_messages">السماح بإرسال رسائل مباشرة إلى الأعضاء.</string>
|
||||
<string name="accept_contact_incognito_button">قبول التخفي</string>
|
||||
<string name="button_add_welcome_message">أضف رسالة ترحيب</string>
|
||||
<string name="v4_3_improved_server_configuration_desc">أضف الخوادم عن طريق مسح رموز QR.</string>
|
||||
<string name="v4_2_group_links_desc">يمكن للمسؤولين إنشاء روابط للانضمام إلى المجموعات.</string>
|
||||
<string name="accept_connection_request__question">قبول طلب الاتصال؟</string>
|
||||
<string name="clear_chat_warning">سيتم حذف جميع الرسائل - لا يمكن التراجع عن هذا! سيتم حذف الرسائل فقط من أجلك.</string>
|
||||
<string name="callstatus_accepted">مكالمة مقبولة</string>
|
||||
</resources>
|
||||
@@ -93,7 +93,7 @@
|
||||
<string name="profile_will_be_sent_to_contact_sending_link">Váš profil bude odeslán kontaktu, od kterého jste obdrželi tento odkaz.</string>
|
||||
<string name="server_connected">připojeno</string>
|
||||
<string name="server_error">chyba</string>
|
||||
<string name="server_connecting">připojení</string>
|
||||
<string name="server_connecting">připojování</string>
|
||||
<string name="trying_to_connect_to_server_to_receive_messages">Pokus o připojení k serveru používanému pro příjem zpráv od tohoto kontaktu.</string>
|
||||
<string name="deleted_description">smazáno</string>
|
||||
<string name="invalid_chat">neplatný chat</string>
|
||||
@@ -101,7 +101,7 @@
|
||||
<string name="connection_local_display_name">spojení <xliff:g id="connection ID" example="1">%1$d</xliff:g></string>
|
||||
<string name="display_name_connection_established">spojení navázáno</string>
|
||||
<string name="display_name_invited_to_connect">pozvánka k připojení</string>
|
||||
<string name="display_name_connecting">připojení…</string>
|
||||
<string name="display_name_connecting">připojování…</string>
|
||||
<string name="description_you_shared_one_time_link">sdíleli jste jednorázový odkaz</string>
|
||||
<string name="description_you_shared_one_time_link_incognito">sdíleli jste jednorázový odkaz inkognito</string>
|
||||
<string name="description_via_group_link">prostřednictvím skupinového odkazu</string>
|
||||
@@ -685,7 +685,7 @@
|
||||
<string name="callstate_waiting_for_confirmation">čekání na potvrzení…</string>
|
||||
<string name="callstate_received_answer">obdržel odpověď…</string>
|
||||
<string name="callstate_received_confirmation">obdržel potvrzení…</string>
|
||||
<string name="callstate_connecting">připojení…</string>
|
||||
<string name="callstate_connecting">připojování…</string>
|
||||
<string name="privacy_redefined">Nové vymezení soukromí</string>
|
||||
<string name="first_platform_without_user_ids">1. platforma bez jakýchkoliv uživatelských identifikátorů – soukromá již od návrhu.</string>
|
||||
<string name="immune_to_spam_and_abuse">Odolná vůči spamu a zneužití</string>
|
||||
@@ -987,7 +987,7 @@
|
||||
<string name="v4_6_chinese_spanish_interface">Čínské a Španělské rozhranní</string>
|
||||
<string name="v4_6_audio_video_calls">Hlasové a video hovory</string>
|
||||
<string name="confirm_password">Potvrdit heslo</string>
|
||||
<string name="enter_password_to_show">Pro zobrazení zadejte heslo výše!</string>
|
||||
<string name="enter_password_to_show">Zadejte heslo do hledání</string>
|
||||
<string name="v4_6_reduced_battery_usage">Další snížení spotřeby baterie</string>
|
||||
<string name="error_saving_user_password">Chyba ukládání hesla uživatele</string>
|
||||
<string name="error_updating_user_privacy">Chyba aktualizace soukromí uživatele</string>
|
||||
@@ -1017,4 +1017,45 @@
|
||||
<string name="button_welcome_message">Uvítací zpráva</string>
|
||||
<string name="group_welcome_title">Uvítací zpráva</string>
|
||||
<string name="user_unmute">Zrušit ztlumení</string>
|
||||
<string name="to_reveal_profile_enter_password">Chcete-li odhalit svůj skrytý profil, zadejte celé heslo do vyhledávacího pole na stránce Chat profily.</string>
|
||||
<string name="should_be_at_least_one_visible_profile">Měl by tam být alespoň jeden viditelný uživatelský profil.</string>
|
||||
<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>
|
||||
<string name="database_downgrade">Původní databáze</string>
|
||||
<string name="mtr_error_no_down_migration">verze databáze je novější než aplikace, ale žádný přechod dolů pro: %s</string>
|
||||
<string name="downgrade_and_open_chat">Snížit a otevřít chat</string>
|
||||
<string name="database_migrations">Migrací: %s</string>
|
||||
<string name="mtr_error_different">různé migrace v aplikaci/databázi: %s / %s</string>
|
||||
<string name="incompatible_database_version">Nekompatibilní verze databáze</string>
|
||||
<string name="invalid_migration_confirmation">Neplatné potvrzení migrace</string>
|
||||
<string name="upgrade_and_open_chat">Zvýšit a otevřít chat</string>
|
||||
<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>
|
||||
<string name="file_will_be_received_when_contact_completes_uploading">Soubor bude přijat, jakmile váš kontakt dokončí nahrávání.</string>
|
||||
<string name="file_transfer_will_be_cancelled_warning">Přenos souboru bude zrušen. Pokud probíhá, bude zastaven.</string>
|
||||
<string name="delete_chat_profile">Smazat chat profil</string>
|
||||
<string name="delete_profile">Smazat profil</string>
|
||||
<string name="profile_password">Heslo profilu</string>
|
||||
<string name="unhide_chat_profile">Odkrýt chat profil</string>
|
||||
<string name="unhide_profile">Odkrýt profil</string>
|
||||
<string name="cancel_file__question">Zrušit přenos souboru\?</string>
|
||||
<string name="icon_descr_video_asked_to_receive">Žádost o přijetí videa</string>
|
||||
<string name="videos_limit_desc">Současně lze odeslat pouze 10 videí</string>
|
||||
<string name="videos_limit_title">Příliš mnoho videí!</string>
|
||||
<string name="video_descr">Video</string>
|
||||
<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="waiting_for_video">Čekám na video</string>
|
||||
</resources>
|
||||
@@ -1054,15 +1054,15 @@
|
||||
<string name="observer_cant_send_message_desc">Bitte kontaktieren Sie den Gruppen-Administrator.</string>
|
||||
<string name="moderate_message_will_be_deleted_warning">Diese Nachricht wird für alle Gruppenmitglieder gelöscht.</string>
|
||||
<string name="language_system">System</string>
|
||||
<string name="confirm_password">Bestätigen Sie das Passwort</string>
|
||||
<string name="confirm_password">Passwort bestätigen</string>
|
||||
<string name="cant_delete_user_profile">Das Benutzerprofil kann nicht gelöscht werden!</string>
|
||||
<string name="dont_show_again">Nicht nochmals anzeigen</string>
|
||||
<string name="v4_6_chinese_spanish_interface">Chinesische und spanische Bedienoberfläche</string>
|
||||
<string name="v4_6_audio_video_calls">Audio- und Videoanrufe</string>
|
||||
<string name="button_add_welcome_message">Fügen Sie eine Begrüßungsmeldung hinzu</string>
|
||||
<string name="button_add_welcome_message">Begrüßungsmeldung hinzufügen</string>
|
||||
<string name="error_updating_user_privacy">Fehler beim Aktualisieren der Benutzer-Privatsphäre</string>
|
||||
<string name="smp_save_servers_question">Alle Server speichern\?</string>
|
||||
<string name="hide_profile">Verberge das Profil</string>
|
||||
<string name="hide_profile">Profil verbergen</string>
|
||||
<string name="password_to_show">Passwort anzeigen</string>
|
||||
<string name="save_profile_password">Profil-Passwort speichern</string>
|
||||
<string name="error_saving_user_password">Fehler beim Speichern des Benutzer-Passworts</string>
|
||||
@@ -1070,8 +1070,8 @@
|
||||
<string name="button_welcome_message">Begrüßungsmeldung</string>
|
||||
<string name="save_welcome_message_question">Begrüßungsmeldung speichern\?</string>
|
||||
<string name="user_unhide">Verbergen aufheben</string>
|
||||
<string name="enter_password_to_show">Geben Sie oben das Passwort für die Anzeige an!</string>
|
||||
<string name="make_profile_private">Erzeugen Sie ein privates Profil!</string>
|
||||
<string name="enter_password_to_show">Für die Anzeige das Passwort im Suchfeld eingeben</string>
|
||||
<string name="make_profile_private">Privates Profil erzeugen!</string>
|
||||
<string name="user_mute">Stummschalten</string>
|
||||
<string name="tap_to_activate_profile">Tippen Sie, um das Profil zu aktivieren.</string>
|
||||
<string name="should_be_at_least_one_profile">Es muss mindestens ein Benutzer-Profil vorhanden sein.</string>
|
||||
@@ -1086,14 +1086,50 @@
|
||||
<string name="v4_6_group_welcome_message">Gruppen-Begrüßungsmeldung</string>
|
||||
<string name="v4_6_reduced_battery_usage">Weiter reduzierter Batterieverbrauch</string>
|
||||
<string name="v4_6_reduced_battery_usage_descr">Weitere Verbesserungen sind bald verfügbar!</string>
|
||||
<string name="v4_6_group_welcome_message_descr">Legen Sie die Nachricht fest, die neuen Mitgliedern angezeigt werden soll!</string>
|
||||
<string name="v4_6_group_welcome_message_descr">Definieren Sie eine Begrüßungsmeldung, die neuen Mitgliedern angezeigt wird!</string>
|
||||
<string name="v4_6_chinese_spanish_interface_descr">Dank der Nutzer - Tragen Sie per Weblate bei!</string>
|
||||
<string name="v4_6_group_moderation">Gruppenmoderation</string>
|
||||
<string name="v4_6_hidden_chat_profiles">Verborgene Chat-Profile</string>
|
||||
<string name="user_hide">Verberge</string>
|
||||
<string name="save_and_update_group_profile">Sichern und aktualisieren des Gruppen-Profils</string>
|
||||
<string name="save_and_update_group_profile">Gruppen-Profil sichern und aktualisieren</string>
|
||||
<string name="you_will_still_receive_calls_and_ntfs">Sie können Anrufe und Benachrichtigungen auch von stummgeschalteten Profilen empfangen, solange diese aktiv sind.</string>
|
||||
<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>
|
||||
<string name="show_dev_options">Anzeigen:</string>
|
||||
<string name="show_developer_options">Entwickleroptionen anzeigen</string>
|
||||
<string name="settings_section_title_experimenta">EXPERIMENTELL</string>
|
||||
<string name="database_upgrade">Datenbank-Aktualisierung</string>
|
||||
<string name="mtr_error_different">Unterschiedlicher Migrationsstand in der App/Datenbank: %s / %s</string>
|
||||
<string name="downgrade_and_open_chat">Herabstufen und den Chat öffnen</string>
|
||||
<string name="incompatible_database_version">Inkompatible Datenbank-Version</string>
|
||||
<string name="database_downgrade_warning">Warnung: Sie könnten einige Daten verlieren!</string>
|
||||
<string name="database_downgrade">Datenbank-Herabstufung</string>
|
||||
<string name="developer_options">Datenbank-IDs und Transport-Isolationsoption.</string>
|
||||
<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>
|
||||
<string name="file_transfer_will_be_cancelled_warning">Der Dateitransfer wird abgebrochen. Falls er gerade abläuft, wird er angehalten.</string>
|
||||
<string name="delete_chat_profile">Chat-Profil löschen</string>
|
||||
<string name="delete_profile">Profil löschen</string>
|
||||
<string name="unhide_profile">Verbergen des Profils aufheben</string>
|
||||
<string name="profile_password">Passwort für Profil</string>
|
||||
<string name="unhide_chat_profile">Verbergen des Chat-Profils aufheben</string>
|
||||
<string name="icon_descr_video_asked_to_receive">Aufforderung zum Empfang des Videos</string>
|
||||
<string name="videos_limit_desc">Es können nur 10 Videos zur gleichen Zeit versendet werden</string>
|
||||
<string name="videos_limit_title">Zu viele Videos auf einmal!</string>
|
||||
<string name="video_descr">Video</string>
|
||||
<string name="icon_descr_video_snd_complete">Video gesendet</string>
|
||||
<string name="video_will_be_received_when_contact_completes_uploading">Das Video wird empfangen, sobald Ihr Kontakt das Hochladen beendet hat.</string>
|
||||
<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>
|
||||
</resources>
|
||||
@@ -47,7 +47,7 @@
|
||||
<string name="accept">Aceptar</string>
|
||||
<string name="audio_call_no_encryption">llamada de audio (sin cifrado e2e)</string>
|
||||
<string name="icon_descr_audio_call">llamada de audio</string>
|
||||
<string name="settings_audio_video_calls">Llamadas de audio y vídeo</string>
|
||||
<string name="settings_audio_video_calls">Llamadas y videollamadas</string>
|
||||
<string name="icon_descr_audio_off">Audio desactivado</string>
|
||||
<string name="icon_descr_audio_on">Audio activado</string>
|
||||
<string name="integrity_msg_bad_id">ID de mensaje erróneo</string>
|
||||
@@ -89,19 +89,19 @@
|
||||
<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>
|
||||
<string name="direct_messages_are_prohibited_in_chat">Los mensajes directos entre miembros del grupo están prohibidos.</string>
|
||||
<string name="direct_messages_are_prohibited_in_chat">Los mensajes directos entre miembros del grupo no están permitidos.</string>
|
||||
<string name="passphrase_is_different">La contraseña es distinta a la almacenada en Keystore</string>
|
||||
<string name="database_will_be_encrypted_and_passphrase_stored">La base de datos será cifrada y la contraseña se guardará en Keystore.</string>
|
||||
<string name="delete_contact_question">¿Eliminar contacto\?</string>
|
||||
<string name="delete_message__question">Eliminar mensaje\?</string>
|
||||
<string name="delete_message__question">¿Eliminar mensaje\?</string>
|
||||
<string name="delete_chat_profile_question">¿Eliminar el perfil de chat\?</string>
|
||||
<string name="rcv_group_event_group_deleted">grupo eliminado</string>
|
||||
<string name="delete_group_question">¿Eliminar grupo\?</string>
|
||||
<string name="delete_messages_after">Eliminar mensaje después</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="no_call_on_lock_screen">Desactivar</string>
|
||||
<string name="disappearing_prohibited_in_this_chat">Los mensajes temporales están prohibidos en este chat.</string>
|
||||
<string name="disappearing_messages_are_prohibited">Los mensajes temporales están prohibidos en este grupo.</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>
|
||||
<string name="display_name_cannot_contain_whitespace">El nombre mostrado no puede contener espacios en blanco.</string>
|
||||
<string name="encrypted_video_call">Videollamada con cifrado e2e</string>
|
||||
<string name="display_name_connection_established">conexión establecida</string>
|
||||
@@ -118,7 +118,7 @@
|
||||
<string name="integrity_msg_duplicate">mensaje duplicado</string>
|
||||
<string name="settings_section_title_develop">DESARROLLO</string>
|
||||
<string name="settings_developer_tools">Herramientas desarrollo</string>
|
||||
<string name="delete_files_and_media_for_all_users">Eliminar archivos para todos los perfiles de chat</string>
|
||||
<string name="delete_files_and_media_for_all_users">Eliminar archivos para todos los perfiles Chat</string>
|
||||
<string name="delete_messages">Eliminar mensaje</string>
|
||||
<string name="database_encrypted">¡Base de datos cifrada!</string>
|
||||
<string name="encrypted_with_random_passphrase">La base de datos está cifrada con una contraseña aleatoria, puedes cambiarla.</string>
|
||||
@@ -158,7 +158,7 @@
|
||||
<string name="enable_automatic_deletion_question">¿Activar eliminación automática de mensajes\?</string>
|
||||
<string name="contact_preferences">Preferencias de contacto</string>
|
||||
<string name="ttl_s">%ds</string>
|
||||
<string name="delete_after">Eliminar después</string>
|
||||
<string name="delete_after">Eliminar después de</string>
|
||||
<string name="ttl_sec">%d seg</string>
|
||||
<string name="contact_already_exists">El contácto ya existe</string>
|
||||
<string name="connection_error_auth">Error de conexión (Autenticación)</string>
|
||||
@@ -250,7 +250,8 @@
|
||||
<string name="icon_descr_email">Email</string>
|
||||
<string name="connect_button">Conectar</string>
|
||||
<string name="connect_via_link">Conectar mediante enlace</string>
|
||||
<string name="database_passphrase_and_export">Contraseña y exportar la base de datos</string>
|
||||
<string name="database_passphrase_and_export">Base de datos
|
||||
\ny frase de contraseña</string>
|
||||
<string name="contribute">Contribuye</string>
|
||||
<string name="core_build_timestamp">Core compilado: %s</string>
|
||||
<string name="core_version">Core versión: v%s</string>
|
||||
@@ -280,14 +281,14 @@
|
||||
<string name="database_initialization_error_title">No se puede iniciar la base de datos</string>
|
||||
<string name="clear_chat_question">Limpiar chat\?</string>
|
||||
<string name="network_session_mode_user">Perfil de Chat</string>
|
||||
<string name="chat_is_stopped_indication">El chat está detenido</string>
|
||||
<string name="chat_is_stopped_indication">Chat está detenido</string>
|
||||
<string name="rcv_group_event_changed_member_role">rol de %s cambiado a %s</string>
|
||||
<string name="change_role">Cambiar rol</string>
|
||||
<string name="v4_5_transport_isolation_descr">Mediante perfil de Chat (por defecto) o por conexión (BETA)</string>
|
||||
<string name="snd_conn_event_switch_queue_phase_changing">cambiando dirección…</string>
|
||||
<string name="chat_preferences">Preferencias de chat</string>
|
||||
<string name="chat_preferences">Preferencias de Chat</string>
|
||||
<string name="feature_cancelled_item">cancelado %s</string>
|
||||
<string name="chat_is_stopped">El chat está detenido</string>
|
||||
<string name="chat_is_stopped">Chat está detenido</string>
|
||||
<string name="settings_section_title_calls">LLAMADAS</string>
|
||||
<string name="chat_is_running">El chat está en ejecución</string>
|
||||
<string name="rcv_conn_event_switch_queue_phase_changing">cambiando dirección…</string>
|
||||
@@ -328,7 +329,7 @@
|
||||
<string name="group_invitation_expired">Invitación de grupo caducada</string>
|
||||
<string name="alert_message_group_invitation_expired">La invitación al grupo ya no es válida, ha sido eliminada por el remitente.</string>
|
||||
<string name="delete_group_for_self_cannot_undo_warning">El grupo se eliminará para tí. ¡No puede deshacerse!</string>
|
||||
<string name="how_to_use_markdown">Cómo usar el marcador</string>
|
||||
<string name="how_to_use_markdown">Cómo usar sintaxis markdown</string>
|
||||
<string name="description_via_one_time_link_incognito">Incógnito mediante enlace de un uso</string>
|
||||
<string name="simplex_link_contact">Dirección de contacto SimpleX</string>
|
||||
<string name="error_saving_smp_servers">Error guardando servidores SMP</string>
|
||||
@@ -346,7 +347,7 @@
|
||||
<string name="failed_to_active_user_title">¡Error cambiando perfil!</string>
|
||||
<string name="smp_servers_enter_manually">Introduce el servidor manualmente</string>
|
||||
<string name="how_to_use_your_servers">Cómo usar tus servidores</string>
|
||||
<string name="error_stopping_chat">Error deteniendo el chat</string>
|
||||
<string name="error_stopping_chat">Error deteniendo Chat</string>
|
||||
<string name="enter_correct_passphrase">Introduce la contraseña correcta.</string>
|
||||
<string name="enter_passphrase">Introduce la contraseña…</string>
|
||||
<string name="icon_descr_group_inactive">Grupo inactivo</string>
|
||||
@@ -406,7 +407,7 @@
|
||||
<string name="v4_4_french_interface">Interfaz en francés</string>
|
||||
<string name="image_descr">Imagen</string>
|
||||
<string name="file_not_found">Archivo no encontrado</string>
|
||||
<string name="how_to_use_simplex_chat">Cómo usar</string>
|
||||
<string name="how_to_use_simplex_chat">Guia de uso</string>
|
||||
<string name="full_name_optional__prompt">Nombre completo (opcional)</string>
|
||||
<string name="callstate_ended">finalizado</string>
|
||||
<string name="settings_section_title_help">AYUDA</string>
|
||||
@@ -419,7 +420,7 @@
|
||||
<string name="error_changing_role">Error cambiando rol</string>
|
||||
<string name="conn_stats_section_title_servers">SERVIDORES</string>
|
||||
<string name="group_display_name_field">Nombre mostrado del grupo:</string>
|
||||
<string name="group_preferences">Preferencias del grupo</string>
|
||||
<string name="group_preferences">Preferencias de grupo</string>
|
||||
<string name="group_members_can_send_dms">Los miembros del grupo pueden enviar mensajes directos.</string>
|
||||
<string name="group_members_can_delete">Los miembros del grupo pueden eliminar mensajes de forma irreversible.</string>
|
||||
<string name="v4_3_improved_privacy_and_security_desc">Ocultar pantalla de aplicaciones en aplicaciones recientes.</string>
|
||||
@@ -452,7 +453,7 @@
|
||||
<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="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. Establece una contraseña para protegerla.</string>
|
||||
<string name="database_is_not_encrypted">La base de datos no está cifrada. Escribe una contraseña para protegerla.</string>
|
||||
<string name="ensure_smp_server_address_are_correct_format_and_unique">Asegúrate de que las direcciones del servidor SMP tienen el formato correcto, están separadas por líneas y no duplicadas.</string>
|
||||
<string name="icon_descr_instant_notifications">Notificación instantánea</string>
|
||||
<string name="network_settings_title">Configuración de red</string>
|
||||
@@ -465,8 +466,8 @@
|
||||
<string name="conn_level_desc_indirect">indirecto (<xliff:g id="conn_level">%1$s</xliff:g>)</string>
|
||||
<string name="theme_light">Claro</string>
|
||||
<string name="chat_preferences_on">Activado</string>
|
||||
<string name="message_deletion_prohibited">La eliminación irreversible de mensajes está prohibida en este chat.</string>
|
||||
<string name="message_deletion_prohibited_in_chat">La eliminación irreversible de mensajes está prohibida en este grupo.</string>
|
||||
<string name="message_deletion_prohibited">La eliminación irreversible de mensajes no está permitida en este chat.</string>
|
||||
<string name="message_deletion_prohibited_in_chat">La eliminación irreversible de mensajes no está permitida en este grupo.</string>
|
||||
<string name="v4_3_improved_server_configuration">Configuración del servidor mejorada</string>
|
||||
<string name="alert_text_skipped_messages_it_can_happen_when">Esto puede suceder cuando:
|
||||
\n1. Los mensajes caducan en el servidor si no se han recibido durante 30 días.
|
||||
@@ -492,7 +493,7 @@
|
||||
<string name="mark_unread">Marcar como no leído</string>
|
||||
<string name="invalid_QR_code">Código QR inválido</string>
|
||||
<string name="incorrect_code">¡Código de seguridad incorrecto!</string>
|
||||
<string name="markdown_in_messages">Marcadores en mensajes</string>
|
||||
<string name="markdown_in_messages">Sintaxis markdown en mensajes</string>
|
||||
<string name="network_use_onion_hosts_no">No</string>
|
||||
<string name="callstatus_missed">llamada perdida</string>
|
||||
<string name="import_database_confirmation">Importar</string>
|
||||
@@ -528,7 +529,7 @@
|
||||
<string name="snd_group_event_user_left">has salido</string>
|
||||
<string name="snd_conn_event_switch_queue_phase_completed">has cambiado la dirección</string>
|
||||
<string name="feature_off">apagado</string>
|
||||
<string name="v4_3_irreversible_message_deletion">Eliminación del mensaje irreversible</string>
|
||||
<string name="v4_3_irreversible_message_deletion">Eliminación irreversible del mensaje</string>
|
||||
<string name="v4_3_voice_messages_desc">Máximo 40 segundos, recibido al instante.</string>
|
||||
<string name="v4_5_italian_interface">Interfaz en italiano</string>
|
||||
<string name="v4_5_message_draft">Borrador de mensaje</string>
|
||||
@@ -538,7 +539,7 @@
|
||||
<string name="no_details">sin detalles</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="only_stored_on_members_devices">(sólo almacenado por miembros del grupo)</string>
|
||||
<string name="markdown_help">Ayuda marcadores</string>
|
||||
<string name="markdown_help">Ayuda sintaxis markdown</string>
|
||||
<string name="network_and_servers">Redes y servidores</string>
|
||||
<string name="network_use_onion_hosts_prefer_desc">Se usarán hosts .onion cuando estén disponibles.</string>
|
||||
<string name="italic">cursiva</string>
|
||||
@@ -574,7 +575,7 @@
|
||||
<string name="snd_conn_event_switch_queue_phase_completed_for_member">has cambiado la dirección por %s</string>
|
||||
<string name="rcv_group_event_member_left">ha salido</string>
|
||||
<string name="button_leave_group">Salir del grupo</string>
|
||||
<string name="only_group_owners_can_change_prefs">Sólo los propietarios del grupo pueden cambiar las preferencias de grupo.</string>
|
||||
<string name="only_group_owners_can_change_prefs">Sólo los propietarios del grupo pueden modificar las preferencias de grupo.</string>
|
||||
<string name="users_delete_data_only">Sólo datos del perfil local</string>
|
||||
<string name="chat_preferences_no">no</string>
|
||||
<string name="thousand_abbreviation">k</string>
|
||||
@@ -635,7 +636,7 @@
|
||||
<string name="send_live_message_desc">Envía un mensaje en vivo: se actualizará para el(los) destinatario(s) a medida que se escribe</string>
|
||||
<string name="icon_descr_sent_msg_status_send_failed">error de envío</string>
|
||||
<string name="sending_via">Enviando mediante</string>
|
||||
<string name="contact_developers">Actualiza la aplicación y ponte en contacto con los desarrolladores.</string>
|
||||
<string name="contact_developers">Por favor, actualiza la aplicación y ponte en contacto con los desarrolladores.</string>
|
||||
<string name="sender_cancelled_file_transfer">El remitente ha cancelado la transferencia de archivos.</string>
|
||||
<string name="smp_server_test_secure_queue">Cola segura</string>
|
||||
<string name="enter_passphrase_notification_title">Se necesita contraseña</string>
|
||||
@@ -663,7 +664,7 @@
|
||||
<string name="connect_via_link_or_qr_from_clipboard_or_in_person">(escanear o pegar desde el portapapeles)</string>
|
||||
<string name="icon_descr_profile_image_placeholder">Espacio reservado para la imagen del perfil</string>
|
||||
<string name="image_descr_qr_code">Código QR</string>
|
||||
<string name="chat_with_the_founder">Envía consultas e ideas</string>
|
||||
<string name="chat_with_the_founder">Consultas y sugerencias</string>
|
||||
<string name="smp_servers_preset_address">Dirección del servidor predefinida</string>
|
||||
<string name="send_us_an_email">Contacta por email</string>
|
||||
<string name="rate_the_app">Valora la aplicación</string>
|
||||
@@ -705,7 +706,7 @@
|
||||
<string name="open_chat">Abrir chat</string>
|
||||
<string name="restore_database">Restaurar copia de seguridad de la base de datos</string>
|
||||
<string name="save_passphrase_and_open_chat">Guardar contraseña y abrir el chat</string>
|
||||
<string name="restore_passphrase_not_found_desc">La contraseña no se ha encontrado en Keystore, introdúzcala manualmente. Esto puede haber ocurrido si has restaurado los datos de la aplicación con una herramienta de copia de seguridad. Si no es así, ponte en contacto con los desarrolladores.</string>
|
||||
<string name="restore_passphrase_not_found_desc">La contraseña no se ha encontrado en Keystore, introdúzcala manualmente. Esto puede haber ocurrido si has restaurado los datos de la aplicación con una herramienta de copia de seguridad. Si no es así, por favor ponte en contacto con los desarrolladores.</string>
|
||||
<string name="remove_member_confirmation">Eliminar</string>
|
||||
<string name="button_remove_member">Eliminar miembro</string>
|
||||
<string name="button_send_direct_message">Enviar mensaje directo</string>
|
||||
@@ -740,7 +741,7 @@
|
||||
<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>
|
||||
<string name="set_contact_name">Introduce el nombre del contacto</string>
|
||||
<string name="set_contact_name">Escribe el nombre del contacto</string>
|
||||
<string name="network_socks_toggle">Usar proxy SOCKS (puerto 9050)</string>
|
||||
<string name="unknown_error">Error desconocido</string>
|
||||
<string name="member_role_will_be_changed_with_notification">El rol cambiará a \"%s\". Se notificará a todos los miembros del grupo.</string>
|
||||
@@ -748,7 +749,7 @@
|
||||
<string name="v4_4_disappearing_messages_desc">Los mensajes enviados se eliminarán una vez transcurrido el tiempo establecido.</string>
|
||||
<string name="ntf_channel_messages">Mensajes de chat SimpleX</string>
|
||||
<string name="icon_descr_received_msg_status_unread">no leído</string>
|
||||
<string name="text_field_set_contact_placeholder">Introduce el nombre del contacto…</string>
|
||||
<string name="text_field_set_contact_placeholder">Escribe el nombre del 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="contact_you_shared_link_with_wont_be_able_to_connect">¡El contacto con el que has compartido este enlace NO podrá conectarse!</string>
|
||||
@@ -758,20 +759,20 @@
|
||||
<string name="share_invitation_link">Compartir enlace de invitación</string>
|
||||
<string name="update_network_session_mode_question">¿Actualizar el modo de aislamiento de transporte\?</string>
|
||||
<string name="icon_descr_speaker_on">Altavoz activado</string>
|
||||
<string name="stop_chat_to_enable_database_actions">Detener Chat para habilitar acciones sobre la base de datos.</string>
|
||||
<string name="stop_chat_to_enable_database_actions">Detén Chat para habilitar las acciones sobre la base de datos.</string>
|
||||
<string name="connection_you_accepted_will_be_cancelled">¡La conexión que has aceptado se cancelará!</string>
|
||||
<string name="database_initialization_error_desc">La base de datos no funciona correctamente. Pulsa para obtener más información</string>
|
||||
<string name="moderate_message_will_be_marked_warning">El mensaje será marcado como moderado para todos los miembros.</string>
|
||||
<string name="next_generation_of_private_messaging">La próxima generación de mensajería privada</string>
|
||||
<string name="delete_files_and_media_desc">Esta acción no se puede deshacer. Se eliminarán todos los archivos y multimedia recibidos y enviados. Las imágenes de baja resolución permanecerán.</string>
|
||||
<string name="enable_automatic_deletion_message">Esta acción no se puede deshacer. Se eliminarán los mensajes enviados y recibidos anteriores a la selección. Puede tardar varios minutos.</string>
|
||||
<string name="messages_section_description">Esta configuración se aplica a los mensajes en su perfil actual de Chat</string>
|
||||
<string name="messages_section_description">Esta configuración se aplica a los mensajes en tu perfil actual</string>
|
||||
<string name="this_string_is_not_a_connection_link">¡Esta cadena no es un enlace de conexión!</string>
|
||||
<string name="to_preserve_privacy_simplex_has_background_service_instead_of_push_notifications_it_uses_a_few_pc_battery">Para preservar tu privacidad, en lugar de notificaciones automáticas la aplicación cuenta con un <b>servicio en segundo plano<xliff:g id="appName">SimpleX</xliff:g></b>, utiliza un pequeño porcentaje de la batería al día.</string>
|
||||
<string name="icon_descr_settings">Configuración</string>
|
||||
<string name="icon_descr_speaker_off">Altavoz apagado</string>
|
||||
<string name="add_contact_or_create_group">Inciar chat nuevo</string>
|
||||
<string name="stop_chat_to_export_import_or_delete_chat_database">Detener Chat para exportar, importar o eliminar la base de datos del chat. No podrá recibir ni enviar mensajes mientras el chat esté detenido.</string>
|
||||
<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.
|
||||
@@ -792,7 +793,7 @@
|
||||
<string name="moderate_message_will_be_deleted_warning">El mensaje se eliminará para todos los miembros.</string>
|
||||
<string name="share_file">Compartir archivo…</string>
|
||||
<string name="images_limit_title">¡Demasiadas imágenes!</string>
|
||||
<string name="image_decoding_exception_desc">La imagen no se puede decodificar. Pruebe otra imagen o pónte en contacto con los desarrolladores.</string>
|
||||
<string name="image_decoding_exception_desc">La imagen no se puede decodificar. Pruebe con otra imagen o contacta con los desarrolladores.</string>
|
||||
<string name="network_enable_socks">¿Usa proxy SOCKS\?</string>
|
||||
<string name="network_use_onion_hosts">Usar hosts .onion</string>
|
||||
<string name="core_simplexmq_version">simplexmq: v%s (%2s)</string>
|
||||
@@ -827,7 +828,7 @@
|
||||
<string name="theme">Tema</string>
|
||||
<string name="set_group_preferences">Establecer preferencias de grupo</string>
|
||||
<string name="settings_section_title_support">SOPORTE SIMPLEX CHAT</string>
|
||||
<string name="set_password_to_export">Seleccióna contraseña para exportar</string>
|
||||
<string name="set_password_to_export">Escribe la contraseña para exportar</string>
|
||||
<string name="update_database">Actualizar</string>
|
||||
<string name="update_database_passphrase">Actualizar contraseña base de datos</string>
|
||||
<string name="group_invitation_tap_to_join_incognito">Pulsa para unirte en modo incógnito</string>
|
||||
@@ -870,11 +871,11 @@
|
||||
<string name="v4_3_irreversible_message_deletion_desc">Tus contactos pueden permitir la eliminación completa de mensajes.</string>
|
||||
<string name="you_control_servers_to_receive_your_contacts_to_send">Tú controlas a través de qué servidor(es) <b>recibes</b> los mensajes. Tus contactos controlan a través de qué servidor(es) <b>envías</b> tus mensajes.</string>
|
||||
<string name="voice_messages">Mensajes de voz</string>
|
||||
<string name="voice_messages_are_prohibited">Los mensajes de voz están prohibidos en este grupo.</string>
|
||||
<string name="voice_messages_are_prohibited">Los mensajes de voz no están permitidos en este grupo.</string>
|
||||
<string name="v4_4_verify_connection_security">Comprobar la seguridad de la conexión</string>
|
||||
<string name="you_are_already_connected_to_vName_via_this_link">¡Ya estás conectado a <xliff:g id="contactName" example="Alice">%1$s! </xliff:g>.</string>
|
||||
<string name="welcome">¡Bienvenido!</string>
|
||||
<string name="your_chat_profile_will_be_sent_to_your_contact">Tu perfil de chat será enviado
|
||||
<string name="your_chat_profile_will_be_sent_to_your_contact">Tu perfil Chat será enviado
|
||||
\na tu contacto</string>
|
||||
<string name="your_ICE_servers">Tus servidores ICE</string>
|
||||
<string name="you_rejected_group_invitation">Has rechazado la invitación del grupo.</string>
|
||||
@@ -887,11 +888,11 @@
|
||||
<string name="contact_wants_to_connect_via_call"><xliff:g id="contactName" example="Alice">%1$s</xliff:g> quiere conectarse contigo mediante</string>
|
||||
<string name="failed_to_create_user_duplicate_desc">Tienes un perfil de chat con el mismo nombre mostrado. Debes elegir otro nombre.</string>
|
||||
<string name="you_can_also_connect_by_clicking_the_link">También puedes conectarte haciendo clic en el enlace. Si se abre en el navegador, haz clic en <b>Abrir en aplicación móvil</b>.</string>
|
||||
<string name="you_can_connect_to_simplex_chat_founder">Puedes <font color="#0088ff">conectar con los desarrolladores de <xliff:g id="appNameFull">SimpleX Chat</xliff:g> para hacer cualquier pregunta y recibir actualizaciones</font>.</string>
|
||||
<string name="you_can_connect_to_simplex_chat_founder">Puedes <font color="#0088ff">ponerte en contacto con los desarrolladores de <xliff:g id="appNameFull">SimpleX Chat</xliff:g> para consultas y para recibir actualizaciones</font>.</string>
|
||||
<string name="you_can_share_your_address_anybody_will_be_able_to_connect">Puedes compartir tu dirección como enlace o como código QR: cualquiera podrá conectarse contigo. Si lo eliminas más tarde tus contactos no se perderán.</string>
|
||||
<string name="observer_cant_send_message_title">¡No puedes enviar mensajes!</string>
|
||||
<string name="you_can_use_markdown_to_format_messages__prompt">Puedes usar marcadores para dar formato a los mensajes:</string>
|
||||
<string name="you_must_use_the_most_recent_version_of_database">Debes usar la versión más reciente de tu base de datos SÓLO en un dispositivo, de lo contrario podrías dejar de recibir mensajes de algunos contactos.</string>
|
||||
<string name="you_can_use_markdown_to_format_messages__prompt">Puedes usar la sintaxis markdown para dar formato a los mensajes:</string>
|
||||
<string name="you_must_use_the_most_recent_version_of_database">Debes usar la versión más reciente de tu base de datos ÚNICAMENTE en un dispositivo, de lo contrario podrías dejar de recibir mensajes de algunos contactos.</string>
|
||||
<string name="alert_text_connection_pending_they_need_to_be_online_can_delete_and_retry">Tu contacto debe estar en línea para que se complete la conexión.
|
||||
\nPuedes cancelar esta conexión y eliminar el contacto (e intentarlo más tarde con un enlace nuevo).</string>
|
||||
<string name="your_current_chat_database_will_be_deleted_and_replaced_with_the_imported_one">La base de datos actual será ELIMINADA y SUSTITUIDA por la importada.
|
||||
@@ -936,12 +937,12 @@
|
||||
<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_chat_database">Base de datos de Chat</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>
|
||||
<string name="num_contacts_selected">%d contacto(s) seleccionado(s)</string>
|
||||
<string name="group_info_section_title_num_members"><xliff:g id="num_members"> %1$s </xliff:g> MIEMBROS</string>
|
||||
<string name="voice_prohibited_in_this_chat">Los mensajes de voz están prohibidos en este chat.</string>
|
||||
<string name="voice_prohibited_in_this_chat">Los mensajes de voz no están permitidos en este chat.</string>
|
||||
<string name="whats_new">Novedades</string>
|
||||
<string name="you_have_to_enter_passphrase_every_time">La contraseña no se almacena en el dispositivo, tienes que introducirla cada vez que inicies la aplicación.</string>
|
||||
<string name="you_joined_this_group">Te has unido a este grupo</string>
|
||||
@@ -963,12 +964,12 @@
|
||||
<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="voice_messages_prohibited">¡Mensajes de voz prohibidos!</string>
|
||||
<string name="group_main_profile_sent">Tu perfil de chat se enviará a los miembros del grupo</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 de chat se enviará a tu contacto</string>
|
||||
<string name="your_chat_profiles">Tus perfiles de chat</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="smp_servers_your_server">Tu servidor</string>
|
||||
<string name="smp_servers_your_server_address">Dirección de tu servidor</string>
|
||||
@@ -1003,7 +1004,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">¡Proteje los perfiles de Chat con contraseña!</string>
|
||||
<string name="v4_6_hidden_chat_profiles_descr">¡Protege tus perfiles Chat 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,4 +1023,31 @@
|
||||
\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 archivos mediante XFTP</string>
|
||||
<string name="database_upgrade">Actualización de la base de datos</string>
|
||||
<string name="database_downgrade">Degradación de la base de datos</string>
|
||||
<string name="invalid_migration_confirmation">Confirmación de migración no válida</string>
|
||||
<string name="upgrade_and_open_chat">Actualizar y abrir Chat</string>
|
||||
<string name="database_migrations">Migraciones: %s</string>
|
||||
<string name="mtr_error_different">migración diferente en la aplicación/base de datos: %s / %s</string>
|
||||
<string name="downgrade_and_open_chat">Degradar y abrir Chat</string>
|
||||
<string name="database_downgrade_warning">Atención: ¡puedes perder algunos datos!</string>
|
||||
<string name="incompatible_database_version">Versión de base de datos incompatible</string>
|
||||
<string name="confirm_database_upgrades">Confirmar actualizaciones de la bases de datos</string>
|
||||
<string name="mtr_error_no_down_migration">la versión de la base de datos es más reciente que la aplicación, pero no hay migración hacia abajo para: %s</string>
|
||||
<string name="settings_section_title_experimenta">EXPERIMENTAL</string>
|
||||
<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>
|
||||
<string name="cancel_file__question">¿Cancelar el envío de archivos\?</string>
|
||||
<string name="file_transfer_will_be_cancelled_warning">El envío de archivos será cancelado. Si está en progreso se detendrá.</string>
|
||||
<string name="delete_chat_profile">Eliminar perfil de chat</string>
|
||||
<string name="profile_password">Contraseña del perfil</string>
|
||||
<string name="unhide_chat_profile">Mostrar perfil de chat</string>
|
||||
<string name="unhide_profile">Mostrar perfil</string>
|
||||
<string name="delete_profile">Eliminar perfil</string>
|
||||
</resources>
|
||||
@@ -990,7 +990,7 @@
|
||||
<string name="confirm_password">Confirmer le mot de passe</string>
|
||||
<string name="v4_6_reduced_battery_usage">Réduction accrue de l\'utilisation de la batterie</string>
|
||||
<string name="v4_6_chinese_spanish_interface">Interface en chinois et en espagnol</string>
|
||||
<string name="enter_password_to_show">Entrez le mot de passe ci-dessus pour continuer !</string>
|
||||
<string name="enter_password_to_show">Entrez le mot de passe dans le champ de recherche</string>
|
||||
<string name="v4_6_audio_video_calls">Appels audio et vidéo</string>
|
||||
<string name="v4_6_group_welcome_message">Message d\'accueil du groupe</string>
|
||||
<string name="error_saving_user_password">Erreur d\'enregistrement du mot de passe de l\'utilisateur</string>
|
||||
@@ -1005,13 +1005,13 @@
|
||||
<string name="hide_profile">Masquer le profil</string>
|
||||
<string name="v4_6_reduced_battery_usage_descr">D\'autres améliorations sont à venir !</string>
|
||||
<string name="password_to_show">Mot de passe à afficher</string>
|
||||
<string name="make_profile_private">Rendre le profil privé !</string>
|
||||
<string name="make_profile_private">Rendre un profil privé !</string>
|
||||
<string name="user_mute">Mute</string>
|
||||
<string name="v4_6_hidden_chat_profiles_descr">Protégez vos profils de chat par un mot de passe !</string>
|
||||
<string name="tap_to_activate_profile">Appuyez pour activer le profil.</string>
|
||||
<string name="save_and_update_group_profile">Sauvegarder et mettre à jour le profil du groupe</string>
|
||||
<string name="save_profile_password">Enregistrer le mot de passe du profil</string>
|
||||
<string name="to_reveal_profile_enter_password">Pour révéler votre profil caché, entrez un mot de passe complet dans le champ de recherche de la page Profils de chat.</string>
|
||||
<string name="to_reveal_profile_enter_password">Pour révéler votre profil caché, entrez le mot de passe dans le champ de recherche de la page Profils de chat.</string>
|
||||
<string name="v4_6_audio_video_calls_descr">Prise en charge du Bluetooth et autres améliorations.</string>
|
||||
<string name="v4_6_chinese_spanish_interface_descr">Merci aux utilisateurs - contribuez via Weblate !</string>
|
||||
<string name="should_be_at_least_one_profile">Il doit y avoir au moins un profil d\'utilisateur.</string>
|
||||
@@ -1022,4 +1022,31 @@
|
||||
<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 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>
|
||||
<string name="downgrade_and_open_chat">Rétrograder et ouvrir le chat</string>
|
||||
<string name="invalid_migration_confirmation">Confirmation de migration invalide</string>
|
||||
<string name="upgrade_and_open_chat">Mettre à niveau et ouvrir le chat</string>
|
||||
<string name="database_migrations">Migrations : %s</string>
|
||||
<string name="database_downgrade_warning">Attention : vous risquez de perdre des données !</string>
|
||||
<string name="confirm_database_upgrades">Confirmer la mise à niveau de la base de données</string>
|
||||
<string name="mtr_error_no_down_migration">la base de données a une version plus récente que celle de l\'application, mais il n\'y a pas de rétrogradation pour : %s</string>
|
||||
<string name="mtr_error_different">migration différente dans l\'app/la base de données : %s / %s</string>
|
||||
<string name="image_will_be_received_when_contact_completes_uploading">L\'image sera reçue lorsque votre contact aura terminé de la mettre en ligne.</string>
|
||||
<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>
|
||||
<string name="unhide_chat_profile">Dévoiler le profil de chat</string>
|
||||
<string name="unhide_profile">Dévoiler le profil</string>
|
||||
<string name="delete_chat_profile">Supprimer le profil de chat</string>
|
||||
<string name="delete_profile">Supprimer le profil</string>
|
||||
<string name="cancel_file__question">Annuler le transfert de fichiers \?</string>
|
||||
<string name="file_transfer_will_be_cancelled_warning">Le transfert de fichiers sera annulé. S\'il est en cours, il sera interrompu.</string>
|
||||
<string name="profile_password">Mot de passe de profil</string>
|
||||
</resources>
|
||||
@@ -985,7 +985,7 @@
|
||||
<string name="save_welcome_message_question">Salvare il messaggio di benvenuto\?</string>
|
||||
<string name="group_welcome_title">Messaggio di benvenuto</string>
|
||||
<string name="save_and_update_group_profile">Salva e aggiorna il profilo del gruppo</string>
|
||||
<string name="enter_password_to_show">Inserisci la password sopra per mostrare!</string>
|
||||
<string name="enter_password_to_show">Inserisci password nella ricerca</string>
|
||||
<string name="user_mute">Silenzia</string>
|
||||
<string name="tap_to_activate_profile">Tocca per attivare il profilo.</string>
|
||||
<string name="user_unhide">Svela</string>
|
||||
@@ -1022,4 +1022,31 @@
|
||||
<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 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>
|
||||
<string name="upgrade_and_open_chat">Aggiorna e apri chat</string>
|
||||
<string name="developer_options">ID del database e opzione isolamento del trasporto.</string>
|
||||
<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>
|
||||
<string name="confirm_database_upgrades">Conferma aggiornamenti database</string>
|
||||
<string name="mtr_error_different">migrazione diversa nell\'app/nel database: %s / %s</string>
|
||||
<string name="invalid_migration_confirmation">Conferma di migrazione non valida</string>
|
||||
<string name="settings_section_title_experimenta">SPERIMENTALE</string>
|
||||
<string name="image_will_be_received_when_contact_completes_uploading">L\'immagine verrà ricevuta quando il tuo contatto completerà l\'invio.</string>
|
||||
<string name="mtr_error_no_down_migration">la versione del database è più recente di quella dell\'app, ma nessuna migrazione downgrade per: %s</string>
|
||||
<string name="file_will_be_received_when_contact_completes_uploading">Il file verrà ricevuto quando il tuo contatto completerà l\'invio.</string>
|
||||
<string name="cancel_file__question">Annullare il trasferimento di file\?</string>
|
||||
<string name="file_transfer_will_be_cancelled_warning">Il trasferimento di file verrà annullato. Se è in corso, verrà interrotto.</string>
|
||||
<string name="unhide_chat_profile">Svela il profilo chat</string>
|
||||
<string name="unhide_profile">Svela profilo</string>
|
||||
<string name="delete_chat_profile">Elimina il profilo di chat</string>
|
||||
<string name="delete_profile">Elimina profilo</string>
|
||||
<string name="profile_password">Password del profilo</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,619 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="server_connected">연결됨</string>
|
||||
<string name="server_connecting">연결 중</string>
|
||||
<string name="connect_via_group_link">그룹 링크를 통해 연결할까요\?</string>
|
||||
<string name="connect_via_invitation_link">초대 링크로 연결할까요\?</string>
|
||||
<string name="display_name_connection_established">연결 수립됨</string>
|
||||
<string name="connection_timeout">연결 시간 초과</string>
|
||||
<string name="cannot_receive_file">파일을 받을 수 없습니다</string>
|
||||
<string name="contact_already_exists">이미 추가된 연락처에요.</string>
|
||||
<string name="smp_server_test_connect">연결</string>
|
||||
<string name="connection_error_auth">연결 오류 (인증)</string>
|
||||
<string name="smp_server_test_create_queue">대기열 생성</string>
|
||||
<string name="database_initialization_error_title">데이터베이스를 초기화할 수 없어요</string>
|
||||
<string name="notifications_mode_service_desc">앱이 백그라운드에서 항상 실행돼요. 대신 메시지가 도착하자마자 바로 알림이 떠요.</string>
|
||||
<string name="notifications_mode_periodic_desc">10분마다 최대 1분간 새 메시지 확인</string>
|
||||
<string name="notification_contact_connected">연결됨</string>
|
||||
<string name="notification_preview_somebody">숨긴 대화 상대 :</string>
|
||||
<string name="notification_preview_mode_contact">대화 상대 이름</string>
|
||||
<string name="allow_verb">허용</string>
|
||||
<string name="auth_confirm_credential">자격 증명 확인</string>
|
||||
<string name="copy_verb">복사</string>
|
||||
<string name="contact_connection_pending">연결 중…</string>
|
||||
<string name="group_connection_pending">연결 중…</string>
|
||||
<string name="attach">첨부파일</string>
|
||||
<string name="icon_descr_cancel_file_preview">파일 미리보기 취소</string>
|
||||
<string name="icon_descr_context">컨텍스트 아이콘</string>
|
||||
<string name="icon_descr_server_status_connected">연결됨</string>
|
||||
<string name="back">뒤로</string>
|
||||
<string name="add_new_contact_to_create_one_time_QR_code"><b>새 연락처 추가</b> : 일회용 QR 코드 만들기</string>
|
||||
<string name="cancel_verb">취소</string>
|
||||
<string name="icon_descr_cancel_live_message">라이브 메시지 취소</string>
|
||||
<string name="choose_file">파일 선택</string>
|
||||
<string name="confirm_verb">확인</string>
|
||||
<string name="connect_via_link_or_qr">링크 / QR 코드를 통해 연결</string>
|
||||
<string name="copied">클립보드로 복사됨</string>
|
||||
<string name="create_group">비밀 그룹 생성</string>
|
||||
<string name="accept_contact_button">수락</string>
|
||||
<string name="clear_chat_warning">모든 메시지가 삭제돼요. 삭제 후 되돌릴 수 없어요! 메시지는 나에게서만 삭제돼요.</string>
|
||||
<string name="clear_verb">지우기</string>
|
||||
<string name="clear_chat_menu_action">지우기</string>
|
||||
<string name="clear_chat_button">채팅 지우기</string>
|
||||
<string name="clear_chat_question">채팅을 지울까요\?</string>
|
||||
<string name="connection_request_sent">연결 요청 완료</string>
|
||||
<string name="connect_via_link">링크를 통해 연결</string>
|
||||
<string name="smp_servers_preset_add">프리셋 서버 추가</string>
|
||||
<string name="smp_servers_add">서버 추가…</string>
|
||||
<string name="chat_console">채팅 콘솔</string>
|
||||
<string name="smp_servers_check_address">서버 주소를 확인 후 다시 시도하십시오.</string>
|
||||
<string name="configure_ICE_servers">ICE 서버 설정</string>
|
||||
<string name="contribute">기여</string>
|
||||
<string name="network_settings">고급 네트워크 설정</string>
|
||||
<string name="network_session_mode_user">채팅 프로필</string>
|
||||
<string name="network_session_mode_entity">연결</string>
|
||||
<string name="accept_requests">요청 수락</string>
|
||||
<string name="app_version_code">앱 빌드 : %s</string>
|
||||
<string name="appearance_settings">외관</string>
|
||||
<string name="app_version_title">앱 버전</string>
|
||||
<string name="app_version_name">앱 버전 : v%s</string>
|
||||
<string name="accept_automatically">자동</string>
|
||||
<string name="contact_requests">대화 상대의 요청</string>
|
||||
<string name="core_version">코어 버전 : v%s</string>
|
||||
<string name="callstatus_accepted">전화 받음</string>
|
||||
<string name="bold">굵게</string>
|
||||
<string name="callstatus_in_progress">전화 연결 중</string>
|
||||
<string name="colored">색깔</string>
|
||||
<string name="confirm_password">암호 확인</string>
|
||||
<string name="callstatus_connecting">전화 연결 중</string>
|
||||
<string name="create_profile_button">생성</string>
|
||||
<string name="create_profile">프로필 생성</string>
|
||||
<string name="callstatus_error">통화 오류</string>
|
||||
<string name="callstate_connected">연결됨</string>
|
||||
<string name="callstate_connecting">연결 중…</string>
|
||||
<string name="create_your_profile">내 프로필 생성</string>
|
||||
<string name="onboarding_notifications_mode_periodic_desc"><b>배터리에 좋음</b>. 백그라운드 서비스는 10분마다 새 메시지를 확인합니다. 전화 및 긴급 메시지를 놓칠 수 있습니다.</string>
|
||||
<string name="call_already_ended">전화가 이미 종료되었습니다!</string>
|
||||
<string name="always_use_relay">항상 릴레이 사용</string>
|
||||
<string name="icon_descr_audio_call">음성 전화</string>
|
||||
<string name="settings_audio_video_calls">음성 & 영상 전화</string>
|
||||
<string name="call_on_lock_screen">잠금 화면에서의 전화</string>
|
||||
<string name="status_contact_has_no_e2e_encryption">대화 상대와 종단간 암호화되지 않음</string>
|
||||
<string name="answer_call">응답</string>
|
||||
<string name="icon_descr_audio_on">소리 켜기</string>
|
||||
<string name="icon_descr_audio_off">소리 끄기</string>
|
||||
<string name="icon_descr_call_ended">통화 종료됨</string>
|
||||
<string name="icon_descr_call_connecting">전화 연결 중</string>
|
||||
<string name="auto_accept_images">이미지 자동 다운로드하기</string>
|
||||
<string name="integrity_msg_bad_hash">잘못된 메시지 해시</string>
|
||||
<string name="integrity_msg_bad_id">잘못된 메시지 아이디</string>
|
||||
<string name="settings_section_title_calls">전화</string>
|
||||
<string name="chat_is_running">채팅 기능이 작동하고 있어요</string>
|
||||
<string name="settings_section_title_chats">채팅</string>
|
||||
<string name="chat_database_imported">채팅 데이테베이스를 불러 왔어요</string>
|
||||
<string name="impossible_to_recover_passphrase"><b>주의</b>: 비밀번호를 분실하면 복구나 비밀번호 변경을 할 수 없어요.</string>
|
||||
<string name="change_database_passphrase_question">데이터베이스 암호를 바꾸겠습니까\?</string>
|
||||
<string name="confirm_new_passphrase">새로운 암호 확인…</string>
|
||||
<string name="chat_archive_section">채팅 기록 보관함</string>
|
||||
<string name="rcv_group_event_changed_your_role">내 역할이 %s 역할로 변경되었습니다.</string>
|
||||
<string name="rcv_conn_event_switch_queue_phase_changing">주소 바꾸기…</string>
|
||||
<string name="snd_conn_event_switch_queue_phase_changing">주소 바꾸기…</string>
|
||||
<string name="snd_conn_event_switch_queue_phase_changing_for_member">%s의 주소 바꾸기…</string>
|
||||
<string name="rcv_group_event_member_connected">연결됨</string>
|
||||
<string name="group_member_status_complete">완료</string>
|
||||
<string name="group_member_status_connected">연결됨</string>
|
||||
<string name="group_member_status_connecting">연결 중</string>
|
||||
<string name="group_member_status_accepted">연결 중 (수락됨)</string>
|
||||
<string name="group_member_status_announced">연결 중 (알림)</string>
|
||||
<string name="group_member_status_intro_invitation">연결 중(초대 시작)</string>
|
||||
<string name="group_member_status_creator">제작자</string>
|
||||
<string name="invite_prohibited">상대를 초대할 수 없습니다</string>
|
||||
<string name="clear_contacts_selection_button">지우기</string>
|
||||
<string name="icon_descr_contact_checked">대화 상대 확인됨</string>
|
||||
<string name="create_group_link">그룹 링크 생성</string>
|
||||
<string name="button_create_group_link">링크 생성</string>
|
||||
<string name="change_member_role_question">그룹 역할을 바꾸겠습니까\?</string>
|
||||
<string name="info_row_connection">연결</string>
|
||||
<string name="users_add">프로필 추가</string>
|
||||
<string name="incognito_random_profile_description">대화 상대에게 랜덤으로 만들어진 익명 프로필이 보내져요</string>
|
||||
<string name="cant_delete_user_profile">사용자 프로필을 삭제할 수 없습니다</string>
|
||||
<string name="chat_preferences_always">항상</string>
|
||||
<string name="chat_preferences_contact_allows">대화 상대가 허용했어요.</string>
|
||||
<string name="contact_preferences">연락처 설정</string>
|
||||
<string name="allow_voice_messages_only_if">대화 상대도 허용한 경우에만 음성 메시지를 보낼 수 있습니다.</string>
|
||||
<string name="allow_your_contacts_irreversibly_delete">모두에게서 메시지 영구 삭제 허용하기.</string>
|
||||
<string name="allow_your_contacts_to_send_disappearing_messages">대화 상대에게 자동 삭제되는 메시지 허용하기.</string>
|
||||
<string name="allow_your_contacts_to_send_voice_messages">상대가 음성 메시지를 보내는 것을 허용하기.</string>
|
||||
<string name="both_you_and_your_contacts_can_delete">나와 대화 상대 모두 메시지를 영구 삭제할 수 있어요.</string>
|
||||
<string name="both_you_and_your_contact_can_send_voice">나와 대화 상대 모두 음성 메시지를 보낼 수 있어요.</string>
|
||||
<string name="contacts_can_mark_messages_for_deletion">상대가 메시지에 삭제 표시를 할 수 있습니다. 그러나 삭제 표시된 메시지 내용은 여전히 볼 수 있습니다.</string>
|
||||
<string name="allow_to_delete_messages">모두에게서 메시지 영구 삭제 허용하기.</string>
|
||||
<string name="feature_cancelled_item">%s 취소됨</string>
|
||||
<string name="v4_2_auto_accept_contact_requests">대화 상대의 요청 자동 수락</string>
|
||||
<string name="v4_5_transport_isolation_descr">채팅 프로필(기본값) 또는 연결(베타).</string>
|
||||
<string name="v4_4_verify_connection_security_desc">대화 상대와 보안 코드를 비교해 보세요.</string>
|
||||
<string name="v4_6_chinese_spanish_interface">중국어 및 스페인어 인터페이스</string>
|
||||
<string name="about_simplex">SimpleX에 대하여</string>
|
||||
<string name="accept">수락</string>
|
||||
<string name="share_one_time_link">일회용 초대 링크 생성</string>
|
||||
<string name="create_address">주소 생성</string>
|
||||
<string name="chat_item_ttl_day">1일</string>
|
||||
<string name="about_simplex_chat"><xliff:g id="appNameFull">SimpleX</xliff:g>에 대하여</string>
|
||||
<string name="color_primary">강조 색상</string>
|
||||
<string name="accept_call_on_lock_screen">응답</string>
|
||||
<string name="accept_connection_request__question">연결 요청을 수락할까요\?</string>
|
||||
<string name="accept_feature">수락</string>
|
||||
<string name="network_enable_socks_info">SOCKS 프록시(포트 9050)를 통해 서버에 액세스할까요\? 이 설정을 활성화하기 전에 프록시를 시작해야 해요.</string>
|
||||
<string name="smp_servers_add_to_another_device">다른 기기에 추가</string>
|
||||
<string name="v4_3_improved_server_configuration_desc">QR 코드 스캔으로 서버 추가</string>
|
||||
<string name="button_add_welcome_message">환영 메시지 추가</string>
|
||||
<string name="group_member_role_admin">관리자</string>
|
||||
<string name="v4_2_group_links_desc">관리자는 그룹 가입을 위한 링크를 만들 수 있어요.</string>
|
||||
<string name="allow_to_send_disappearing">자동 삭제되는 메시지 허용하기.</string>
|
||||
<string name="users_delete_all_chats_deleted">모든 채팅과 메시지가 삭제돼요. 삭제 후 되돌릴 수 없어요!</string>
|
||||
<string name="allow_to_send_voice">음성 메시지 허용하기.</string>
|
||||
<string name="allow_voice_messages_question">음성 메시지를 허용하겠습니까\?</string>
|
||||
<string name="allow_disappearing_messages_only_if">상대도 허용하는 경우에만 자동 삭제되는 메시지를 사용할 수 있어요.</string>
|
||||
<string name="allow_direct_messages">그룹 멤버에게 1:1 채팅 허용하기.</string>
|
||||
<string name="all_group_members_will_remain_connected">모든 그룹 멤버는 연결 상태가 계속 유지돼요.</string>
|
||||
<string name="allow_irreversible_message_deletion_only_if">상대도 허용한 경우에만 모두에게서 메시지 영구 삭제가 가능해요.</string>
|
||||
<string name="all_your_contacts_will_remain_connected">모든 연락처와 연결 상태가 계속 유지돼요.</string>
|
||||
<string name="notifications_mode_service">항상 켜기</string>
|
||||
<string name="keychain_is_storing_securely">안드로이드 암호 저장소는 비밀번호를 안전하게 저장하는 데 사용되고 알림이 작동하도록 해요.</string>
|
||||
<string name="keychain_allows_to_receive_ntfs">안드로이드 암호 저장소는 앱을 다시 시작하거나 비밀번호 변경을 하고 나서 비밀번호를 안전하게 저장하는 데 사용되고 알림이 작동되도록 해요.</string>
|
||||
<string name="notifications_mode_off_desc">앱이 실행 중일 때만 알림을 받을 수 있고 백그라운드에서 실행되지 않아요.</string>
|
||||
<string name="full_backup">앱 데이터 백업</string>
|
||||
<string name="settings_section_title_icon">앱 아이콘</string>
|
||||
<string name="incognito_random_profile_from_contact_description">링크를 보낸 사람한테 랜덤으로 만들어진 익명 프로필이 보내져요</string>
|
||||
<string name="network_session_mode_user_description">별도로 분리된 TCP 연결(그리고 SOCKS 자격 증명)이 <b>각각의 채팅 프로필</b>에 사용될 거예요.</string>
|
||||
<string name="network_session_mode_entity_description">별도로 분리된 TCP 연결(및 SOCKS 자격 증명)이 <b>각각의 연락처 및 그룹 구성원</b>에게 사용될 거예요.
|
||||
\n<b>참고</b>: 연결이 많은 경우 배터리 및 트래픽 소비가 엄청 높을 수 있고 일부 연결이 실패할 수 있어요.</string>
|
||||
<string name="icon_descr_asked_to_receive">이미지 수신 요청됨</string>
|
||||
<string name="v4_6_audio_video_calls">음성 및 영상 전화</string>
|
||||
<string name="audio_call_no_encryption">음성 전화 (종단간 암호화 X)</string>
|
||||
<string name="auth_unavailable">인증할 수 없어요</string>
|
||||
<string name="turning_off_service_and_periodic">새 메시지를 수신하기 위해 배터리 최적화 설정을 바꿉니다. 설정에서 언제든지 다시 바꿀 수 있습니다.</string>
|
||||
<string name="onboarding_notifications_mode_off_desc"><b>배터리에 가장 좋음</b>. 앱이 실행 중일 때만 알림을 받게 되며 백그라운드에서 실행되지 않습니다.</string>
|
||||
<string name="it_can_disabled_via_settings_notifications_still_shown"><b>설정을 통해 비활성화할 수 있어요.</b> – 앱이 실행되는 동안 알림이 표시되요.</string>
|
||||
<string name="both_you_and_your_contact_can_send_disappearing">나와 대화 상대 모두 자동 삭제되는 메시지를 보낼 수 있어요.</string>
|
||||
<string name="scan_QR_code_to_connect_to_contact_who_shows_QR_code"><b>QR 코드 스캔</b>: QR 코드를 보여주는 사람과 연결해요.</string>
|
||||
<string name="cannot_access_keychain">데이터베이스 암호를 저장하고 있는 암호키 저장소에 접근할 수 없습니다</string>
|
||||
<string name="onboarding_notifications_mode_service_desc"><b>배터리 많이 사용</b>! 백그라운드에서 항상 실행돼요. 메시지를 수신하자마자 알림이 떠요.</string>
|
||||
<string name="callstatus_ended">통화 종료됨 <xliff:g id="duration" example="01:15">%1$s</xliff:g></string>
|
||||
<string name="callstatus_calling">전화 중…</string>
|
||||
<string name="icon_descr_call_progress">전화 연결 중</string>
|
||||
<string name="icon_descr_cancel_link_preview">링크 미리보기 취소</string>
|
||||
<string name="icon_descr_cancel_image_preview">이미지 미리보기 취소</string>
|
||||
<string name="rcv_group_event_changed_member_role">%s 역할에서 %s 역할로 변경되었습니다</string>
|
||||
<string name="chat_database_section">채팅 데이터베이스</string>
|
||||
<string name="alert_title_cant_invite_contacts">대화 상대를 초대할 수 없습니다!</string>
|
||||
<string name="change_verb">변경</string>
|
||||
<string name="chat_archive_header">채팅 기록 보관함</string>
|
||||
<string name="change_role">역할 바꾸기</string>
|
||||
<string name="chat_database_deleted">채팅 데이터베이스를 삭제했어요</string>
|
||||
<string name="chat_is_stopped">채팅 기능이 멈췄어요</string>
|
||||
<string name="chat_is_stopped_indication">채팅 기능이 멈췄어요</string>
|
||||
<string name="chat_preferences">채팅 설정</string>
|
||||
<string name="chat_with_developers">개발자와 대화</string>
|
||||
<string name="connect_via_link_verb">연결</string>
|
||||
<string name="display_name_connecting">연결 중…</string>
|
||||
<string name="icon_descr_close_button">닫기 버튼</string>
|
||||
<string name="connect_button">연결</string>
|
||||
<string name="group_member_status_introduced">연결 중 (도입)</string>
|
||||
<string name="connection_error">연결 오류</string>
|
||||
<string name="connection_local_display_name">연결 <xliff:g id="connection ID" example="1">%1$d</xliff:g></string>
|
||||
<string name="connect_via_contact_link">링크를 통해 연결하겠습니까\?</string>
|
||||
<string name="delete_contact_all_messages_deleted_cannot_undo_warning">대화 상대와 메시지가 삭제돼요. 삭제 후 되돌릴 수 없어요!</string>
|
||||
<string name="status_contact_has_e2e_encryption">대화 상대와 종단간 암호화됨</string>
|
||||
<string name="alert_title_contact_connection_pending">대화 상대와 아직 연결되지 않았어요!</string>
|
||||
<string name="core_build_timestamp">코어 빌드: %s</string>
|
||||
<string name="archive_created_on_ts"><xliff:g id="archive_ts">%1$s</xliff:g>에 생성 완료</string>
|
||||
<string name="create_one_time_link">일회용 초대 링크 생성</string>
|
||||
<string name="create_secret_group_title">비밀 그룹 생성</string>
|
||||
<string name="accept_contact_incognito_button">익명 수락</string>
|
||||
<string name="chat_item_ttl_month">1개월</string>
|
||||
<string name="chat_item_ttl_week">1주</string>
|
||||
<string name="a_plus_b">a + b</string>
|
||||
<string name="deleted_description">삭제됨</string>
|
||||
<string name="simplex_link_mode_description">설명</string>
|
||||
<string name="smp_server_test_delete_queue">대기열 삭제</string>
|
||||
<string name="delete_verb">삭제</string>
|
||||
<string name="delete_message__question">메시지를 삭제할까요\?</string>
|
||||
<string name="for_me_only">나에게서만 삭제</string>
|
||||
<string name="delete_member_message__question">멤버의 메시지를 삭제할까요\?</string>
|
||||
<string name="maximum_supported_file_size">현재 지원되는 최대 파일 크기는 <xliff:g id="maxFileSize">%1$s</xliff:g>입니다.</string>
|
||||
<string name="image_decoding_exception_title">디코딩 오류</string>
|
||||
<string name="button_delete_contact">대화 상대 삭제</string>
|
||||
<string name="delete_contact_question">연락처를 삭제할까요\?</string>
|
||||
<string name="desktop_scan_QR_code_from_app_via_scan_QR_code">💻 데스크톱: <b>QR 코드 스캔</b>을 통해 앱에서 표시된 QR 코드를 스캔해 주세요.</string>
|
||||
<string name="delete_contact_menu_action">삭제</string>
|
||||
<string name="delete_group_menu_action">삭제</string>
|
||||
<string name="delete_pending_connection__question">대기 중인 연결을 삭제할까요\?</string>
|
||||
<string name="clear_verification">인증 취소</string>
|
||||
<string name="database_passphrase_and_export">데이터베이스 비밀번호 & 내보내기</string>
|
||||
<string name="smp_servers_delete_server">서버 삭제</string>
|
||||
<string name="delete_address">주소 삭제</string>
|
||||
<string name="delete_address__question">주소를 삭제할까요\?</string>
|
||||
<string name="delete_image">이미지 삭제</string>
|
||||
<string name="decentralized">탈중앙화</string>
|
||||
<string name="settings_section_title_develop">개발</string>
|
||||
<string name="settings_developer_tools">개발자 도구</string>
|
||||
<string name="settings_section_title_device">기기</string>
|
||||
<string name="database_passphrase">데이터베이스 비밀번호</string>
|
||||
<string name="delete_files_and_media_for_all_users">모든 채팅 프로필 파일 삭제</string>
|
||||
<string name="database_error">데이터베이스 에러</string>
|
||||
<string name="passphrase_is_different">데이터베이스 비밀번호가 암호 저장소에 저장된 것과 일치하지 않습니다.</string>
|
||||
<string name="database_passphrase_is_required">채팅을 열려면 데이터베이스 비밀번호가 필요해요.</string>
|
||||
<string name="delete_archive">보관된 채팅 삭제</string>
|
||||
<string name="delete_chat_archive_question">보관된 채팅을 삭제할까요\?</string>
|
||||
<string name="num_contacts_selected">%d 개의 연락처가 선택되었습니다.</string>
|
||||
<string name="info_row_database_id">데이터베이스 아이디</string>
|
||||
<string name="users_delete_profile_for">다음 채팅 프로필 삭제</string>
|
||||
<string name="theme_dark">어둡게</string>
|
||||
<string name="delete_after">다음 기간 이후 자동 삭제</string>
|
||||
<string name="above_then_preposition_continuation">위 다음 :</string>
|
||||
<string name="delete_database">데이터베이스 삭제</string>
|
||||
<string name="set_password_to_export_desc">데이터베이스는 임의의 비밀번호로 암호화되었습니다. 내보내기 기능 사용 전 비밀번호를 변경해 주세요.</string>
|
||||
<string name="delete_files_and_media_question">파일과 미디어를 삭제할까요\?</string>
|
||||
<string name="current_passphrase">현재 비밀번호…</string>
|
||||
<string name="database_encrypted">데이터베이스 암호화 완료!</string>
|
||||
<string name="database_passphrase_will_be_updated">데이터베이스 비밀번호가 업데이트되요.</string>
|
||||
<string name="encrypted_with_random_passphrase">데이터베이스는 임의의 비밀번호로 암호화되었고, 원하시면 비밀번호를 변경할 수 있어요.</string>
|
||||
<string name="database_will_be_encrypted">데이터베이스는 암호화될 거예요.</string>
|
||||
<string name="delete_messages">메시지 삭제</string>
|
||||
<string name="delete_messages_after">다음 기간 이후 자동 삭제</string>
|
||||
<string name="rcv_group_event_group_deleted">삭제된 그룹</string>
|
||||
<string name="delete_link">링크 삭제</string>
|
||||
<string name="delete_link_question">링크를 삭제할까요\?</string>
|
||||
<string name="chat_preferences_default">기본값 (%s)</string>
|
||||
<string name="ttl_day">%d일</string>
|
||||
<string name="ttl_d">%d일</string>
|
||||
<string name="ttl_days">%d일</string>
|
||||
<string name="button_delete_group">그룹 삭제</string>
|
||||
<string name="rcv_conn_event_switch_queue_phase_completed">주소가 변경되었습니다.</string>
|
||||
<string name="database_encryption_will_be_updated">데이터베이스 비밀번호가 업데이트되고 암호 저장소에 보관됩니다.</string>
|
||||
<string name="database_will_be_encrypted_and_passphrase_stored">데이터베이스는 암호화되고, 비밀번호는 암호 저장소에 보관될 거에요.</string>
|
||||
<string name="users_delete_question">채팅 프로필을 삭제할까요\?</string>
|
||||
<string name="delete_files_and_media_all">모든 파일 삭제</string>
|
||||
<string name="delete_chat_profile_question">채팅 프로필을 삭제할까요\?</string>
|
||||
<string name="full_deletion">모두에게서 삭제</string>
|
||||
<string name="delete_group_question">그룹을 삭제할까요\?</string>
|
||||
<string name="failed_to_create_user_duplicate_title">표시 이름이 중복되어요!</string>
|
||||
<string name="smp_server_test_disconnect">연결 끊기</string>
|
||||
<string name="auth_device_authentication_is_disabled_turning_off">기기 인증이 비활성화되어 SimpleX 잠금 기능이 작동하지 않아요.</string>
|
||||
<string name="auth_disable_simplex_lock">SimpleX 잠금 비활성화</string>
|
||||
<string name="icon_descr_server_status_disconnected">연결 끊김</string>
|
||||
<string name="add_contact">일회용 초대 링크</string>
|
||||
<string name="add_contact_or_create_group">새로운 채팅 시작</string>
|
||||
<string name="display_name__field">표시 이름</string>
|
||||
<string name="display_name_cannot_contain_whitespace">표시 이름에는 공백문자가 쓰일 수 없어요.</string>
|
||||
<string name="display_name">표시 이름</string>
|
||||
<string name="encrypted_audio_call">종단간 암호화된 음성 전화</string>
|
||||
<string name="encrypted_video_call">종단간 암호화된 영상 전화</string>
|
||||
<string name="no_call_on_lock_screen">비활성화</string>
|
||||
<string name="status_e2e_encrypted">종단간 암호화</string>
|
||||
<string name="integrity_msg_duplicate">중복된 메시지</string>
|
||||
<string name="accept_feature_set_1_day">1일로 설정</string>
|
||||
<string name="v4_4_disappearing_messages">자동 삭제되는 메시지</string>
|
||||
<string name="total_files_count_and_size">전체 크기가 %s인 %d개의 파일</string>
|
||||
<string name="conn_level_desc_direct">다이렉트</string>
|
||||
<string name="disappearing_prohibited_in_this_chat">이 채팅에서는 자동 삭제되는 메시지를 사용할 수 없어요.</string>
|
||||
<string name="disappearing_messages_are_prohibited">이 그룹에서는 자동 삭제되는 메시지를 사용할 수 없어요.</string>
|
||||
<string name="ttl_m">%d분</string>
|
||||
<string name="ttl_months">%d 개월</string>
|
||||
<string name="ttl_min">%d 분</string>
|
||||
<string name="ttl_month">%d 개월</string>
|
||||
<string name="ttl_week">%d 주</string>
|
||||
<string name="downgrade_and_open_chat">다운그레이드하고 채팅 열기</string>
|
||||
<string name="direct_messages">1:1 메시지</string>
|
||||
<string name="timed_messages">자동 삭제되는 메시지</string>
|
||||
<string name="direct_messages_are_prohibited_in_chat">이 그룹에서는 멤버들의 1:1 채팅이 금지되어 있어요.</string>
|
||||
<string name="ttl_s">%d초</string>
|
||||
<string name="ttl_sec">%d 초</string>
|
||||
<string name="ttl_h">%d시</string>
|
||||
<string name="ttl_mth">%d개월</string>
|
||||
<string name="ttl_w">%d주</string>
|
||||
<string name="ttl_weeks">%d 주</string>
|
||||
<string name="confirm_database_upgrades">데이터베이스 업그레이드 확인</string>
|
||||
<string name="auth_device_authentication_is_not_enabled_you_can_turn_on_in_settings_once_enabled">기기 인증을 하고 있지 않아요. 기기 인증을 켜면 설정에서 SimpleX 잠금 기능을 사용할 수 있어요.</string>
|
||||
<string name="ttl_hour">%d 시간</string>
|
||||
<string name="ttl_hours">%d 시간</string>
|
||||
<string name="mtr_error_different">앱/데이터베이스의 다른 마이그레이션: %s / %s</string>
|
||||
<string name="v4_5_multiple_chat_profiles_descr">다른 이름, 아바타 그리고 전송 격리.</string>
|
||||
<string name="dont_show_again">다시 보지 않기</string>
|
||||
<string name="connected_to_server_to_receive_messages_from_contact">이 대화 상대로부터의 메시지를 수신할 서버와 연결되었어요.</string>
|
||||
<string name="app_name"><xliff:g id="appName">SimpleX</xliff:g></string>
|
||||
<string name="contact_developers">앱 업데이트 후 개발자에게 연락해 주세요.</string>
|
||||
<string name="connection_error_auth_desc">대화 상대가 나갔거나 초대 링크가 이미 사용된 경우가 아니면 버그일 수 있어요. 이 경우 개발자에게 알려주세요.
|
||||
\n대화 상대에게 다른 초대 링크 만들도록 부탁하고 네트워크 연결이 안정적인지 확인하세요.</string>
|
||||
<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_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>
|
||||
<string name="callstate_starting">시작…</string>
|
||||
<string name="callstate_waiting_for_answer">응답 대기 중…</string>
|
||||
<string name="callstate_waiting_for_confirmation">확인 대기 중…</string>
|
||||
<string name="alert_title_skipped_messages">읽지 않는 메시지</string>
|
||||
<string name="alert_title_cant_invite_contacts_descr">이 그룹에서 익명 프로필을 사용하고 있어요. 내 원래 프로필이 노출되는 걸 방지하기 위해 대화 상대 초대가 허용되지 않아요.</string>
|
||||
<string name="button_remove_member">멤버 삭제하기</string>
|
||||
<string name="chat_item_ttl_seconds">%s 초</string>
|
||||
<string name="alert_message_group_invitation_expired">이 링크로 참여할 수 없어요. 이미 삭제된 링크에요.</string>
|
||||
<string name="alert_message_no_group">존재하지 않는 그룹이에요.</string>
|
||||
<string name="alert_title_no_group">그룹을 찾을 수 없어요!</string>
|
||||
<string name="button_add_members">맴버 초대하기</string>
|
||||
<string name="button_welcome_message">환영 메시지</string>
|
||||
<string name="button_edit_group_profile">그룹 프로필 수정</string>
|
||||
<string name="button_leave_group">그룹 나가기</string>
|
||||
<string name="button_send_direct_message">1:1 채팅 시작하기</string>
|
||||
<string name="conn_stats_section_title_servers">서버</string>
|
||||
<string name="conn_level_desc_indirect">인다이렉트 (<xliff:g id="conn_level">%1$s</xliff:g>)</string>
|
||||
<string name="chat_preferences_you_allow">허용함</string>
|
||||
<string name="chat_preferences_off">꺼짐</string>
|
||||
<string name="chat_preferences_on">켜짐</string>
|
||||
<string name="chat_preferences_no">아니요</string>
|
||||
<string name="ask_your_contact_to_enable_voice">대화 상대에게 음성 메시지 기능을 활성화 해달라고 부탁해보세요.</string>
|
||||
<string name="chat_help_tap_button">탭 버튼</string>
|
||||
<string name="connection_you_accepted_will_be_cancelled">수락한 연결이 취소됩니다!</string>
|
||||
<string name="chat_lock">SimpleX 잠금</string>
|
||||
<string name="callstatus_rejected">거절된 전화</string>
|
||||
<string name="callstate_ended">종료됨</string>
|
||||
<string name="call_connection_peer_to_peer">P2P</string>
|
||||
<string name="call_connection_via_relay">릴레이를 경유</string>
|
||||
<string name="alert_title_group_invitation_expired">만료된 초대 링크에요!</string>
|
||||
<string name="chat_preferences_yes">네</string>
|
||||
<string name="contact_wants_to_connect_via_call"><xliff:g id="contactName" example="Alice">%1$s</xliff:g>님이 다음을 통해 연결하려고 해요 :</string>
|
||||
<string name="allow_accepting_calls_from_lock_screen">설정에서 잠금 화면에서 바로 전화를 받을 수 있도록 설정할 수 있어요.</string>
|
||||
<string name="alert_text_connection_pending_they_need_to_be_online_can_delete_and_retry">연결을 완료하려면 대화 상대가 온라인 상태여야 해요.
|
||||
\n연결 요청을 취소하고 대화 상대를 삭제할 수 있어요 (그리고 새 링크로 재시도).</string>
|
||||
<string name="alert_text_skipped_messages_it_can_happen_when">다음과 같은 경우에 발생할 수 있어요.
|
||||
\n1. 대화 상대가 메시지를 보낸 지 30일 지나서 서버에서 삭제된 경우
|
||||
\n2. 메시지를 수신하는 데 사용된 서버가 업데이트되고 재부팅된 경우
|
||||
\n3. 침해된 연결의 경우
|
||||
\n서버 업데이트를 받으려면 설정을 통해 개발자에게 연락해 주세요.
|
||||
\n저희 개발팀은 메시지 손실을 방지하기 위해 중복된 서버를 추가할 예정이에요.</string>
|
||||
<string name="auth_simplex_lock_turned_on">SimpleX 잠금 켜짐</string>
|
||||
<string name="callstate_received_answer">응답됨…</string>
|
||||
<string name="callstate_received_confirmation">확인 받음…</string>
|
||||
<string name="callstatus_missed">부재 중 전화</string>
|
||||
<string name="chat_item_ttl_none">사용 안 함</string>
|
||||
<string name="chat_with_the_founder">질문이나 아이디어 보내기</string>
|
||||
<string name="connect_via_link_or_qr_from_clipboard_or_in_person">(스캔하거나 클립보드에서 붙여넣기)</string>
|
||||
<string name="contact_sent_large_file">대화 상대가 현재 지원되는 최대 크기(<xliff:g id="maxFileSize">%1$s</xliff:g>)보다 큰 파일을 보냈습니다.</string>
|
||||
<string name="display_name_invited_to_connect">초대를 받았어요.</string>
|
||||
<string name="failed_to_create_user_title">프로필 생성 오류!</string>
|
||||
<string name="description_via_group_link_incognito">그룹 링크로 익명 채팅</string>
|
||||
<string name="description_via_group_link">그룹 링크로 채팅</string>
|
||||
<string name="description_via_one_time_link">일회용 링크로 채팅</string>
|
||||
<string name="description_you_shared_one_time_link_incognito">일회용 익명 연락처를 공유했어요.</string>
|
||||
<string name="description_you_shared_one_time_link">일회용 프로필 연락처를 공유했어요.</string>
|
||||
<string name="description_via_contact_address_link_incognito">상대의 연락처 링크로 익명 채팅</string>
|
||||
<string name="description_via_contact_address_link">상대의 연락처 링크로 채팅</string>
|
||||
<string name="description_via_one_time_link_incognito">일회용 연락처로 익명 채팅</string>
|
||||
<string name="ensure_smp_server_address_are_correct_format_and_unique">SMP 서버 주소가 올바른 형식이고 줄로 구분되어 있고 중복이 없는지 확인해 주세요.</string>
|
||||
<string name="error_saving_smp_servers">SMP 서버 저장 오류</string>
|
||||
<string name="error_setting_network_config">네트워크 설정 업데이트 오류</string>
|
||||
<string name="failed_to_active_user_title">프로필 변경 오류!</string>
|
||||
<string name="failed_to_create_user_duplicate_desc">동일한 표시 이름을 가진 채팅 프로필이 있어요. 다른 이름을 선택해 주세요.</string>
|
||||
<string name="failed_to_parse_chats_title">채팅 불러오기 실패</string>
|
||||
<string name="failed_to_parse_chat_title">채팅 불러오기 실패</string>
|
||||
<string name="error_adding_members">멤버 추가 오류</string>
|
||||
<string name="error_joining_group">그룹 참여 오류</string>
|
||||
<string name="error_sending_message">메시지 전송 오류</string>
|
||||
<string name="error_creating_address">주소 생성 오류</string>
|
||||
<string name="error_receiving_file">파일 다운로드 오류</string>
|
||||
<string name="error_accepting_contact_request">상대 요청 수락 오류</string>
|
||||
<string name="error_changing_address">주소 변경 오류</string>
|
||||
<string name="error_deleting_contact">연락처 삭제 오류</string>
|
||||
<string name="error_deleting_contact_request">대화 요청 삭제 오류</string>
|
||||
<string name="error_deleting_group">그룹 삭제 오류</string>
|
||||
<string name="error_deleting_pending_contact_connection">대기 중 대화 요청 삭제 오류</string>
|
||||
<string name="error_smp_test_certificate">서버 주소의 인증서의 지문(fingerprint)이 잘못되었을 수도 있어요.</string>
|
||||
<string name="error_smp_test_failed_at_step">테스트가 %s단계에서 실패했어요.</string>
|
||||
<string name="error_smp_test_server_auth">서버는 대기열을 생성하고 비밀번호를 확인하려면 인증이 필요해요.</string>
|
||||
<string name="enter_passphrase_notification_desc">알림을 받으려면 데이터베이스 암호를 입력해 주세요.</string>
|
||||
<string name="enter_passphrase_notification_title">비밀번호가 필요해요.</string>
|
||||
<string name="error_deleting_user">프로필 삭제 오류</string>
|
||||
<string name="error_updating_user_privacy">사용자 개인정보 업데이트 오류</string>
|
||||
<string name="database_initialization_error_desc">데이터베이스가 올바르게 작동하지 안하요. 자세히 알아보려면 탭하세요.</string>
|
||||
<string name="edit_verb">수정하기</string>
|
||||
<string name="delete_message_cannot_be_undone_warning">메시지가 삭제돼요. 삭제 후 복구할 수 없어요!</string>
|
||||
<string name="delete_message_mark_deleted_warning">메시지가 삭제 표시될 거예요. 대화 상대는 여전히 삭제된 내용을 볼 수 있어요.</string>
|
||||
<string name="ensure_ICE_server_address_are_correct_format_and_unique">WebRTC ICE 서버 주소가 올바른 형식이고 줄로 구분되고 중복이 없는지 확인해 주세요.</string>
|
||||
<string name="enter_one_ICE_server_per_line">ICE 서버(한 줄에 하나씩)</string>
|
||||
<string name="error_saving_ICE_servers">ICE 서버 저장 오류</string>
|
||||
<string name="core_simplexmq_version">simplexmq: v%s (%2s)</string>
|
||||
<string name="exit_without_saving">저장하지 않고 나가기</string>
|
||||
<string name="encrypt_database">암호화</string>
|
||||
<string name="encrypted_database">암호화된 데이터베이스</string>
|
||||
<string name="feature_off">꺼짐</string>
|
||||
<string name="feature_enabled_for_you">나에게 켜짐</string>
|
||||
<string name="feature_enabled_for_contact">대화 상대에게 켜짐</string>
|
||||
<string name="feature_enabled">켜짐</string>
|
||||
<string name="feature_received_prohibited">수신됨, 금지됨</string>
|
||||
<string name="export_database">데이터베이스 내보내기</string>
|
||||
<string name="enable_automatic_deletion_question">자동 삭제되는 메시지를 사용할까요\?</string>
|
||||
<string name="error_changing_message_deletion">설정 변경 오류</string>
|
||||
<string name="enable_automatic_deletion_message">이 작업은 되돌릴 수 없어요. 선택한 시간보다 일찍 보내거나 받은 메시지는 삭제돼요. 이는 몇 분 걸릴 수 있어요.</string>
|
||||
<string name="error_with_info">오류: %s</string>
|
||||
<string name="enter_correct_passphrase">올바른 비밀번호를 입력해 주세요.</string>
|
||||
<string name="database_backup_can_be_restored">데이터베이스 비밀번호 변경이 완료되지 않았어요.</string>
|
||||
<string name="database_restore_error">데이터베이스 오류 복구</string>
|
||||
<string name="error_creating_link_for_group">그룹 링크 생성 오류</string>
|
||||
<string name="error_updating_link_for_group">그룹 링크 업데이트 오류</string>
|
||||
<string name="error_changing_role">역할 변경 오류</string>
|
||||
<string name="error_removing_member">멤버 삭제 오류</string>
|
||||
<string name="database_downgrade">데이터베이스 다운그레이드</string>
|
||||
<string name="database_migrations">마이그레이션: %s</string>
|
||||
<string name="delete_group_for_all_members_cannot_undo_warning">모든 멤버에게서 그룹이 삭제돼요. 삭제 후 복구할 수 없어요!</string>
|
||||
<string name="delete_group_for_self_cannot_undo_warning">나에게서만 그룹이 삭제되요. 삭제 후 복구할 수 없어요!</string>
|
||||
<string name="file_not_found">파일을 찾을 수 없음</string>
|
||||
<string name="error_saving_user_password">사용자 비밀번호 저장 오류</string>
|
||||
<string name="error_stopping_chat">채팅 정지하기 오류</string>
|
||||
<string name="error_exporting_chat_database">채팅 데이터베이스 내보내기 오류</string>
|
||||
<string name="database_is_not_encrypted">채팅 데이터베이스가 암호화되지 않았어요. 비밀번호를 설정하여 보호해 주세요.</string>
|
||||
<string name="enter_passphrase">비밀번호를 입력해 주세요…</string>
|
||||
<string name="enter_password_to_show">검색에 비밀번호 입력</string>
|
||||
<string name="edit_image">이미지 수정하기</string>
|
||||
<string name="delete_chat_profile_action_cannot_be_undone_warning">이 작업은 실행 취소될 수 없어요. 프로필, 연락처, 메시지 및 파일이 영구적으로 손실돼요.</string>
|
||||
<string name="error_importing_database">채팅 데이터베이스 가져오기 오류</string>
|
||||
<string name="encrypt_database_question">데이터베이스를 암호화할까요\?</string>
|
||||
<string name="developer_options">데이터베이스 ID 및 전송 격리 옵션.</string>
|
||||
<string name="error_starting_chat">채팅 시작하기 오류</string>
|
||||
<string name="error_encrypting_database">데이터베이스 암호화 오류</string>
|
||||
<string name="enter_correct_current_passphrase">올바른 현재 비밀번호를 입력해 주세요.</string>
|
||||
<string name="delete_chat_profile">채팅 프로필 삭제</string>
|
||||
<string name="delete_profile">프로필 삭제</string>
|
||||
<string name="database_downgrade_warning">경고: 일부 데이터가 손실될 수 있어요!</string>
|
||||
<string name="database_upgrade">데이터베이스 업그레이드</string>
|
||||
<string name="delete_files_and_media_desc">이 작업은 실행 취소될 수 없어요. 수신 및 전송된 모든 파일과 미디어가 삭제돼요. 저해상도 사진만 삭제되지 않아요.</string>
|
||||
<string name="error_deleting_database">채팅 데이터베이스 삭제 오류</string>
|
||||
<string name="error_deleting_link_for_group">그룹 링크 삭제 오류</string>
|
||||
<string name="error_saving_file">파일 저장 오류</string>
|
||||
<string name="error_saving_group_profile">그룹 프로필 저장 오류</string>
|
||||
<string name="feature_offered_item">%s 제안</string>
|
||||
<string name="feature_offered_item_with_param">%s 제안: %2s</string>
|
||||
<string name="icon_descr_instant_notifications">즉시 알림</string>
|
||||
<string name="hide_notification">숨김</string>
|
||||
<string name="hide_verb">숨기기</string>
|
||||
<string name="for_everybody">모두에게</string>
|
||||
<string name="icon_descr_edited">수정됨</string>
|
||||
<string name="icon_descr_image_snd_complete">이미지 보냄</string>
|
||||
<string name="full_name__field">이름 :</string>
|
||||
<string name="hide_profile">프로필 숨기기</string>
|
||||
<string name="icon_descr_flip_camera">카메라 전환</string>
|
||||
<string name="icon_descr_hang_up">전화 끊기</string>
|
||||
<string name="file_with_path">파일 : %s</string>
|
||||
<string name="group_invitation_tap_to_join">탭하여 참여</string>
|
||||
<string name="group_invitation_tap_to_join_incognito">탭하여 익명으로 참여</string>
|
||||
<string name="group_member_status_left">나감</string>
|
||||
<string name="group_member_role_member">멤버</string>
|
||||
<string name="group_member_role_owner">소유자</string>
|
||||
<string name="group_member_status_group_deleted">그룹 삭제됨</string>
|
||||
<string name="group_member_status_invited">초대됨</string>
|
||||
<string name="group_member_status_removed">삭제됨</string>
|
||||
<string name="icon_descr_expand_role">역할 선택지 펼치기</string>
|
||||
<string name="files_and_media_section">파일 & 미디어</string>
|
||||
<string name="group_invitation_item_description">그룹으로 초대 <xliff:g id="group_name">%1$s</xliff:g></string>
|
||||
<string name="group_link">그룹 링크</string>
|
||||
<string name="group_welcome_title">환영 메시지</string>
|
||||
<string name="group_display_name_field">보여지는 그룹 이름</string>
|
||||
<string name="group_full_name_field">그룹 이름 :</string>
|
||||
<string name="group_is_decentralized">그룹은 완전히 탈중앙화되어 있으며 구성원만 그룹을 볼 수 있어요.</string>
|
||||
<string name="group_unsupported_incognito_main_profile_sent">여기에서는 시크릿 모드가 지원되지 않아요. 기본 프로필이 그룹 멤버들에게 전송될 거예요.</string>
|
||||
<string name="group_main_profile_sent">프로필이 그룹 구성원에게 전송될 거예요.</string>
|
||||
<string name="group_profile_is_stored_on_members_devices">그룹 프로필은 서버가 아닌 멤버들의 기기에 저장되어요.</string>
|
||||
<string name="group_preferences">그룹 설정</string>
|
||||
<string name="group_members_can_send_disappearing">그룹 구성원은 자동 삭제되는 메시지를 보낼 수 있어요.</string>
|
||||
<string name="group_members_can_send_dms">그룹 멤버들끼리 1:1 채팅을 할 수 있어요.</string>
|
||||
<string name="icon_descr_add_members">멤버 초대하기</string>
|
||||
<string name="icon_descr_group_inactive">비활성 그룹</string>
|
||||
<string name="group_member_role_observer">관찰자</string>
|
||||
<string name="group_info_member_you">나 : <xliff:g id="group_info_you">%1$s</xliff:g></string>
|
||||
<string name="group_info_section_title_num_members"><xliff:g id="num_members">%1$s</xliff:g> 멤버</string>
|
||||
<string name="file_saved">파일 저장됨</string>
|
||||
<string name="file_will_be_received_when_contact_completes_uploading">대화 상대가 업로드를 완료하면 파일이 저장되어요.</string>
|
||||
<string name="file_will_be_received_when_contact_is_online">대화 상대가 온라인 상태일 때 파일이 전송되어요. 대화 상대가 온라인이 되기를 기다리거나 나중에 다시 확인해 주세요!</string>
|
||||
<string name="icon_descr_record_voice_message">음성 메시지 녹화하기</string>
|
||||
<string name="from_gallery_button">갤러리에서</string>
|
||||
<string name="icon_descr_profile_image_placeholder">프로필 이미지 플레이스 홀더</string>
|
||||
<string name="icon_descr_address"><xliff:g id="appName">SimpleX</xliff:g> 주소</string>
|
||||
<string name="how_to">설명서</string>
|
||||
<string name="how_to_use_your_servers">내 서버 사용법</string>
|
||||
<string name="how_to_use_markdown">마크다운 사용법</string>
|
||||
<string name="how_simplex_works"><xliff:g id="appName">SimpleX</xliff:g> 작동 방식</string>
|
||||
<string name="group_invitation_expired">그룹 초대가 만료되었어요.</string>
|
||||
<string name="group_members_can_delete">그룹 멤버는 보낸 메시지를 영구 삭제할 수 있어요.</string>
|
||||
<string name="group_members_can_send_voice">그룹 멤버는 음성 메시지를 보낼 수 있어요.</string>
|
||||
<string name="hidden_profile_password">숨긴 프로필 비밀번호</string>
|
||||
<string name="full_name_optional__prompt">이름 (선택 사항)</string>
|
||||
<string name="how_it_works">작동 방식</string>
|
||||
<string name="hide_dev_options">숨기기 :</string>
|
||||
<string name="cancel_file__question">파일 전송을 취소할까요\?</string>
|
||||
<string name="file_transfer_will_be_cancelled_warning">파일 전송이 취소될 거예요. 이미 전송이 시작되었다면 중지될 거예요.</string>
|
||||
<string name="icon_descr_sent_msg_status_sent">보냄</string>
|
||||
<string name="group_preview_join_as">%s(으)로 참여</string>
|
||||
<string name="group_preview_you_are_invited">그룹에 초대되었어요.</string>
|
||||
<string name="icon_descr_received_msg_status_unread">잃지 않음</string>
|
||||
<string name="icon_descr_sent_msg_status_send_failed">보내기 실패</string>
|
||||
<string name="icon_descr_sent_msg_status_unauthorized_send">비인증 전송</string>
|
||||
<string name="icon_descr_help">도움말</string>
|
||||
<string name="first_platform_without_user_ids">개인을 식별할 수 있는 어떠한 정보(임의의 숫자 포함)도 없는 첫 번째 플랫폼. 단순히 약속이 아니라 프로그램 설계상 완전한 익명성을 제공해요.</string>
|
||||
<string name="icon_descr_call_rejected">거절된 전화</string>
|
||||
<string name="icon_descr_call_pending_sent">대기 중인 전화</string>
|
||||
<string name="icon_descr_call_missed">부재중 전화</string>
|
||||
<string name="icon_descr_file">파일</string>
|
||||
<string name="icon_descr_more_button">더 보기</string>
|
||||
<string name="icon_descr_send_message">메시지 보내기</string>
|
||||
<string name="icon_descr_server_status_error">오류</string>
|
||||
<string name="how_to_use_simplex_chat">사용법</string>
|
||||
<string name="icon_descr_email">이메일</string>
|
||||
<string name="icon_descr_server_status_pending">대기 중</string>
|
||||
<string name="icon_descr_settings">설정</string>
|
||||
<string name="icon_descr_waiting_for_image">이미지 기다리는 중</string>
|
||||
<string name="image_decoding_exception_desc">이미지를 디코딩할 수 없어요. 다른 이미지를 시도하거나 개발자에게 문의해 주세요.</string>
|
||||
<string name="image_descr">이미지</string>
|
||||
<string name="image_saved">갤러리에 사진 저장됨</string>
|
||||
<string name="images_limit_desc">동시에 최대 10개까지만 이미지를 보낼 수 있어요.</string>
|
||||
<string name="images_limit_title">이미지 수가 너무 많아요!</string>
|
||||
<string name="if_you_choose_to_reject_the_sender_will_not_be_notified">거절해도 상대에게 알림이 전송되지 않아요.</string>
|
||||
<string name="if_you_cannot_meet_in_person_show_QR_in_video_call_or_via_another_channel">직접 만날 수 없다면 <b>영상 통화에서 QR 코드를 보여주거나</b> 링크를 공유해 주세요.</string>
|
||||
<string name="icon_descr_video_call">영상 전화</string>
|
||||
<string name="icon_descr_video_off">영상 끄기</string>
|
||||
<string name="icon_descr_speaker_on">스피커 켜기</string>
|
||||
<string name="icon_descr_video_on">영상 켜기</string>
|
||||
<string name="icon_descr_speaker_off">스피커 끄기</string>
|
||||
<string name="import_database">데이터베이스 가져오기</string>
|
||||
<string name="import_database_confirmation">가져오기</string>
|
||||
<string name="incognito">익명 모드</string>
|
||||
<string name="incognito_info_find">익명 채팅에 사용되는 프로필을 찾으려면 채팅 상단에 있는 연락처 또는 그룹 이름을 탭하세요.</string>
|
||||
<string name="image_will_be_received_when_contact_completes_uploading">대화 상대가 업로드를 완료하면 이미지가 수신될 거예요.</string>
|
||||
<string name="image_descr_profile_image">프로필 이미지</string>
|
||||
<string name="incognito_info_allows">하나의 프로필로 여러 사람과 연락할 필요 없이 무수히 많은 익명 프로필로 연락할 수 있어요.</string>
|
||||
<string name="immune_to_spam_and_abuse">스팸 및 남용에 면역</string>
|
||||
<string name="ignore">무시하기</string>
|
||||
<string name="if_you_received_simplex_invitation_link_you_can_open_in_browser"><xliff:g id="appName">SimpleX Chat</xliff:g> 초대 링크를 받으면 브라우저에서 참여할 수 있어요 :</string>
|
||||
<string name="image_descr_link_preview">링크 미리보기 이미지</string>
|
||||
<string name="image_descr_qr_code">QR 코드</string>
|
||||
<string name="icon_descr_simplex_team"><xliff:g id="appName">SimpleX</xliff:g> 팀</string>
|
||||
<string name="if_you_cannot_meet_in_person_scan_QR_in_video_call_or_ask_for_invitation_link">직접 만날 수 없다면 <b>영상 통화에서 QR 코드를 스캔</b>하거나 상대에게 초대 링크를 공유할 수 있어요.</string>
|
||||
<string name="icon_descr_video_snd_complete">동영상 보내짐</string>
|
||||
<string name="icon_descr_video_asked_to_receive">동영상 수신 요청됨</string>
|
||||
<string name="icon_descr_waiting_for_video">동영상 기다리는 중</string>
|
||||
<string name="image_descr_simplex_logo"><xliff:g id="appName">SimpleX</xliff:g> 로고</string>
|
||||
<string name="image_will_be_received_when_contact_is_online">대화 상대가 온라인 상태일 때 이미지가 수신될 거예요. 기다리거나 나중에 확인하세요!</string>
|
||||
<string name="import_database_question">채팅 데이터베이스를 가져올까요\?</string>
|
||||
<string name="server_error">오류</string>
|
||||
<string name="invalid_chat">유효하지 않는 채팅</string>
|
||||
<string name="invalid_data">잘못된 데이터</string>
|
||||
<string name="invalid_message_format">잘못된 메시지 형식</string>
|
||||
<string name="invalid_connection_link">잘못된 연결 링크</string>
|
||||
<string name="notifications">알림</string>
|
||||
<string name="integrity_msg_skipped"><xliff:g id="connection ID" example="1">%1$d</xliff:g> 읽지 않은 메시지</string>
|
||||
<string name="keychain_error">키체인 오류</string>
|
||||
<string name="invite_to_group_button">그룹에 초대하기</string>
|
||||
<string name="info_row_local_name">로컬 네임</string>
|
||||
<string name="join_group_button">참여</string>
|
||||
<string name="join_group_question">그룹에 참여할까요\?</string>
|
||||
<string name="invite_prohibited_description">이 그룹에서는 기본 프로필을 사용하는 중인데 반해, 익명 프로필로 연락하고 있는 대화 상대를 초대하려고 하셨어요.</string>
|
||||
<string name="initial_member_role">초기 역할</string>
|
||||
<string name="info_row_group">그룹</string>
|
||||
<string name="incompatible_database_version">호환되지 않는 데이터베이스 버전</string>
|
||||
<string name="joining_group">그룹에 참여 중</string>
|
||||
<string name="incognito_info_protects">익명 모드는 기본 프로필 이름과 사진과 같은 개인 정보를 보호해줘요. 새 대화 상대마다 새로운 랜덤 프로필이 만들어져요.</string>
|
||||
<string name="is_verified">%s 은(는) 인증되었어요.</string>
|
||||
<string name="italic">기울게</string>
|
||||
<string name="incognito_info_share">익명 프로필 사용 중 초대받은 그룹에 참여하면, 그 그룹에서도 동일한 익명 프로필이 사용되어요.</string>
|
||||
<string name="incognito_random_profile">내 랜덤 프로필</string>
|
||||
<string name="incoming_audio_call">음성 전화 옴</string>
|
||||
<string name="is_not_verified">%s은(는) 인증되지 않았어요.</string>
|
||||
<string name="install_simplex_chat_for_terminal">터미널용 <xliff:g id="appNameFull">SimpleX Chat</xliff:g>를 설치하세요</string>
|
||||
<string name="incoming_video_call">영상 전화 옴</string>
|
||||
<string name="invalid_migration_confirmation">잘못된 마이그레이션 확인</string>
|
||||
<string name="join_group_incognito_button">익명 모드로 참여</string>
|
||||
<string name="invalid_QR_code">잘못된 QR 코드</string>
|
||||
<string name="incorrect_code">잘못된 보안 코드!</string>
|
||||
<string name="invalid_contact_link">잘못된 링크!</string>
|
||||
</resources>
|
||||
@@ -577,7 +577,7 @@
|
||||
<string name="old_database_archive">Oud database archief</string>
|
||||
<string name="enter_correct_current_passphrase">Voer het juiste huidige wachtwoord in.</string>
|
||||
<string name="group_member_role_owner">Eigenaar</string>
|
||||
<string name="network_option_ping_count">PING telling</string>
|
||||
<string name="network_option_ping_count">PING count</string>
|
||||
<string name="network_option_ping_interval">PING interval</string>
|
||||
<string name="v4_5_message_draft_descr">Bewaar het laatste berichtconcept, met bijlagen.</string>
|
||||
<string name="v4_5_private_filenames">Privé bestandsnamen</string>
|
||||
@@ -1021,4 +1021,40 @@
|
||||
<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>
|
||||
<string name="mtr_error_different">verschillende migratie in de app/database: %s / %s</string>
|
||||
<string name="downgrade_and_open_chat">Downgraden en chat openen</string>
|
||||
<string name="database_migrations">Migraties: %s</string>
|
||||
<string name="database_downgrade_warning">Waarschuwing: u kunt sommige gegevens verliezen!</string>
|
||||
<string name="database_upgrade">Database upgrade</string>
|
||||
<string name="confirm_database_upgrades">Bevestig database upgrades</string>
|
||||
<string name="mtr_error_no_down_migration">database versie is nieuwer dan de app, maar geen down migratie voor: %s</string>
|
||||
<string name="incompatible_database_version">Incompatibele database versie</string>
|
||||
<string name="file_will_be_received_when_contact_completes_uploading">Het bestand wordt ontvangen wanneer uw contactpersoon het uploaden heeft voltooid.</string>
|
||||
<string name="image_will_be_received_when_contact_completes_uploading">De afbeelding wordt ontvangen wanneer uw contactpersoon het uploaden heeft voltooid.</string>
|
||||
<string name="show_dev_options">Toon:</string>
|
||||
<string name="developer_options">Database ID\'s en Transport isolatie optie.</string>
|
||||
<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>
|
||||
<string name="profile_password">Profiel wachtwoord</string>
|
||||
<string name="unhide_chat_profile">Chat profiel zichtbaar maken</string>
|
||||
<string name="unhide_profile">Profiel zichtbaar maken</string>
|
||||
<string name="delete_chat_profile">Chat profiel verwijderen\?</string>
|
||||
<string name="icon_descr_video_asked_to_receive">Gevraagd om de video te ontvangen</string>
|
||||
<string name="videos_limit_desc">Er kunnen slechts 10 video\'s tegelijk worden verzonden</string>
|
||||
<string name="videos_limit_title">Te veel video\'s!</string>
|
||||
<string name="icon_descr_video_snd_complete">Video verzonden</string>
|
||||
<string name="video_will_be_received_when_contact_is_online">De video wordt ontvangen wanneer uw contact online is, even geduld a.u.b. of kijk later!</string>
|
||||
<string name="icon_descr_waiting_for_video">Wachten op video</string>
|
||||
<string name="waiting_for_video">Wachten op video</string>
|
||||
<string name="video_descr">Video</string>
|
||||
<string name="video_will_be_received_when_contact_completes_uploading">De video wordt ontvangen wanneer uw contactpersoon het uploaden heeft voltooid.</string>
|
||||
</resources>
|
||||
@@ -6,22 +6,22 @@
|
||||
<string name="connect_via_contact_link">Соединиться через ссылку-контакт?</string>
|
||||
<string name="connect_via_invitation_link">Соединиться через ссылку-приглашение?</string>
|
||||
<string name="connect_via_group_link">Соединиться через ссылку группы?</string>
|
||||
<string name="profile_will_be_sent_to_contact_sending_link">Ваш профиль будет отправлен контакту, от которого вы получили эту ссылку.</string>
|
||||
<string name="profile_will_be_sent_to_contact_sending_link">Ваш профиль будет отправлен контакту, от которого Вы получили эту ссылку.</string>
|
||||
<string name="you_will_join_group">Вы вступите в группу, на которую ссылается эта ссылка.</string>
|
||||
<string name="connect_via_link_verb">Соединиться</string>
|
||||
<!-- Server info - ChatModel.kt -->
|
||||
<string name="server_connected">соединено</string>
|
||||
<string name="server_error">ошибка</string>
|
||||
<string name="server_connecting">соединяется</string>
|
||||
<string name="connected_to_server_to_receive_messages_from_contact">Установлено соединение с сервером, через который вы получаете сообщения от этого контакта.</string>
|
||||
<string name="trying_to_connect_to_server_to_receive_messages_with_error">Устанавливается соединение с сервером, через который вы получаете сообщения от этого контакта (ошибка: <xliff:g id="errorMsg">%1$s</xliff:g>).</string>
|
||||
<string name="trying_to_connect_to_server_to_receive_messages">Устанавливается соединение с сервером, через который вы получаете сообщения от этого контакта.</string>
|
||||
<string name="connected_to_server_to_receive_messages_from_contact">Установлено соединение с сервером, через который Вы получаете сообщения от этого контакта.</string>
|
||||
<string name="trying_to_connect_to_server_to_receive_messages_with_error">Устанавливается соединение с сервером, через который Вы получаете сообщения от этого контакта (ошибка: <xliff:g id="errorMsg">%1$s</xliff:g>).</string>
|
||||
<string name="trying_to_connect_to_server_to_receive_messages">Устанавливается соединение с сервером, через который Вы получаете сообщения от этого контакта.</string>
|
||||
<!-- Item Content - ChatModel.kt -->
|
||||
<string name="deleted_description">удалено</string>
|
||||
<string name="marked_deleted_description">помечено к удалению</string>
|
||||
<string name="sending_files_not_yet_supported">отправка файлов не поддерживается</string>
|
||||
<string name="receiving_files_not_yet_supported">получение файлов не поддерживается</string>
|
||||
<string name="sender_you_pronoun">вы</string>
|
||||
<string name="sender_you_pronoun">Вы</string>
|
||||
<string name="unknown_message_format">неизвестный формат сообщения</string>
|
||||
<string name="invalid_message_format">неверный формат сообщения</string>
|
||||
<!-- PendingContactConnection - ChatModel.kt -->
|
||||
@@ -29,8 +29,8 @@
|
||||
<string name="display_name_connection_established">соединение установлено</string>
|
||||
<string name="display_name_invited_to_connect">приглашение соединиться</string>
|
||||
<string name="display_name_connecting">соединяется…</string>
|
||||
<string name="description_you_shared_one_time_link">вы создали одноразовую ссылку</string>
|
||||
<string name="description_you_shared_one_time_link_incognito">вы создали одноразовую ссылку инкогнито</string>
|
||||
<string name="description_you_shared_one_time_link">Вы создали одноразовую ссылку</string>
|
||||
<string name="description_you_shared_one_time_link_incognito">Вы создали одноразовую ссылку инкогнито</string>
|
||||
<string name="description_via_group_link">через ссылку группы</string>
|
||||
<string name="description_via_group_link_incognito">инкогнито через ссылку группы</string>
|
||||
<string name="description_via_contact_address_link">через ссылку-контакт</string>
|
||||
@@ -54,7 +54,7 @@
|
||||
<!-- API Error Responses - SimpleXAPI.kt -->
|
||||
<string name="connection_timeout">Превышено время соединения</string>
|
||||
<string name="connection_error">Ошибка соединения</string>
|
||||
<string name="network_error_desc">Пожалуйста, проверьте ваше соединение с сервером <xliff:g id="serverHost" example="smp.simplex.im">%1$s</xliff:g> и попробуйте еще раз.</string>
|
||||
<string name="network_error_desc">Пожалуйста, проверьте Ваше соединение с сервером <xliff:g id="serverHost" example="smp.simplex.im">%1$s</xliff:g> и попробуйте еще раз.</string>
|
||||
<string name="error_sending_message">Ошибка при отправке сообщения</string>
|
||||
<string name="error_adding_members">Ошибка при добавлении членов группы</string>
|
||||
<string name="error_joining_group">Ошибка при вступлении в группу</string>
|
||||
@@ -65,9 +65,10 @@
|
||||
<string name="contact_already_exists">Существующий контакт</string>
|
||||
<string name="you_are_already_connected_to_vName_via_this_link">Вы уже соединены с контактом <xliff:g id="contactName" example="Alice">%1$s!</xliff:g>.</string>
|
||||
<string name="invalid_connection_link">Ошибка в ссылке контакта</string>
|
||||
<string name="please_check_correct_link_and_maybe_ask_for_a_new_one">Пожалуйста, проверьте, что вы использовали правильную ссылку, или попросите ваш контакт отправить вам новую.</string>
|
||||
<string name="please_check_correct_link_and_maybe_ask_for_a_new_one">Пожалуйста, проверьте, что Вы использовали правильную ссылку, или попросите Ваш контакт отправить Вам новую.</string>
|
||||
<string name="connection_error_auth">Ошибка соединения (AUTH)</string>
|
||||
<string name="connection_error_auth_desc">Возможно, ваш контакт удалил ссылку, или она уже была использована. Если это не так, то это может быть ошибкой - пожалуйста, сообщите нам об этом.\nЧтобы установить соединение, попросите ваш контакт создать еще одну ссылку и проверьте ваше соединение с сетью.</string>
|
||||
<string name="connection_error_auth_desc">Возможно, Ваш контакт удалил ссылку, или она уже была использована. Если это не так, то это может быть ошибкой - пожалуйста, сообщите нам об этом.
|
||||
\nЧтобы установить соединение, попросите Ваш контакт создать еще одну ссылку и проверьте Ваше соединение с сетью.</string>
|
||||
<string name="error_accepting_contact_request">Ошибка при принятии запроса на соединение</string>
|
||||
<string name="sender_may_have_deleted_the_connection_request">Отправитель мог удалить запрос на соединение.</string>
|
||||
<string name="error_deleting_contact">Ошибка при удалении контакта</string>
|
||||
@@ -87,13 +88,13 @@
|
||||
<string name="icon_descr_instant_notifications">Мгновенные уведомления</string>
|
||||
<string name="service_notifications">Мгновенные уведомления!</string>
|
||||
<string name="service_notifications_disabled">Мгновенные уведомления выключены!</string>
|
||||
<string name="to_preserve_privacy_simplex_has_background_service_instead_of_push_notifications_it_uses_a_few_pc_battery">Чтобы защитить ваши личные данные, вместо уведомлений от сервера приложение запускает <b>фоновый сервис <xliff:g id="appName">SimpleX</xliff:g></b>, который потребляет несколько процентов батареи в день.</string>
|
||||
<string name="it_can_disabled_via_settings_notifications_still_shown"><b>Он может быть выключен через Настройки</b> – вы продолжите получать уведомления о сообщениях пока приложение запущено.</string>
|
||||
<string name="to_preserve_privacy_simplex_has_background_service_instead_of_push_notifications_it_uses_a_few_pc_battery">Чтобы защитить Ваши личные данные, вместо уведомлений от сервера приложение запускает <b>фоновый сервис <xliff:g id="appName">SimpleX</xliff:g></b>, который потребляет несколько процентов батареи в день.</string>
|
||||
<string name="it_can_disabled_via_settings_notifications_still_shown"><b>Он может быть выключен через Настройки</b> – Вы продолжите получать уведомления о сообщениях пока приложение запущено.</string>
|
||||
<string name="turn_off_battery_optimization">Для использования этой функции, пожалуйста, отключите оптимизацию батареи для <xliff:g id="appName">SimpleX</xliff:g> в следующем диалоге. Иначе уведомления будут выключены.</string>
|
||||
<string name="turning_off_service_and_periodic">Оптимизация батареи включена, поэтому сервис уведомлений выключен. Вы можете снова включить его через Настройки.</string>
|
||||
<string name="periodic_notifications">Периодические уведомления</string>
|
||||
<string name="periodic_notifications_disabled">Периодические уведомления выключены!</string>
|
||||
<string name="periodic_notifications_desc">Приложение периодически получает новые сообщения — это потребляет несколько процентов батареи в день. Приложение не использует push уведомления — данные не отправляются с вашего устройства на сервер.</string>
|
||||
<string name="periodic_notifications_desc">Приложение периодически получает новые сообщения — это потребляет несколько процентов батареи в день. Приложение не использует push уведомления — данные не отправляются с Вашего устройства на сервер.</string>
|
||||
<string name="enter_passphrase_notification_title">Введите пароль</string>
|
||||
<string name="enter_passphrase_notification_desc">Для получения уведомлений, пожалуйста, введите пароль от базы данных</string>
|
||||
<string name="database_initialization_error_title">Ошибка базы данных</string>
|
||||
@@ -127,7 +128,8 @@
|
||||
<string name="notification_contact_connected">Соединен(а)</string>
|
||||
<!-- local authentication notice - SimpleXAPI.kt -->
|
||||
<string name="la_notice_title_simplex_lock">Блокировка SimpleX</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">Чтобы защитить вашу информацию, включите блокировку <xliff:g id="appNameFull">SimpleX Chat</xliff:g>.\nВам будет нужно пройти аутентификацию для включения блокировки.</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">Чтобы защитить Вашу информацию, включите блокировку <xliff:g id="appNameFull">SimpleX Chat</xliff:g>.
|
||||
\nВам будет нужно пройти аутентификацию для включения блокировки.</string>
|
||||
<string name="la_notice_turn_on">Включить</string>
|
||||
<!-- LocalAuthentication.kt -->
|
||||
<string name="auth_simplex_lock_turned_on">Блокировка SimpleX включена</string>
|
||||
@@ -144,7 +146,7 @@
|
||||
<string name="auth_open_chat_console">Открыть консоль</string>
|
||||
<!-- Chat Alerts - ChatItemView.kt -->
|
||||
<string name="message_delivery_error_title">Ошибка доставки сообщения</string>
|
||||
<string name="message_delivery_error_desc">Скорее всего, этот контакт удалил соединение с вами.</string>
|
||||
<string name="message_delivery_error_desc">Скорее всего, этот контакт удалил соединение с Вами.</string>
|
||||
<!-- Chat Actions - ChatItemView.kt (and general) -->
|
||||
<string name="reply_verb">Ответить</string>
|
||||
<string name="share_verb">Поделиться</string>
|
||||
@@ -172,12 +174,12 @@
|
||||
<string name="this_text_is_available_in_settings">Этот текст можно найти в Настройках</string>
|
||||
<string name="your_chats">Ваши чаты</string>
|
||||
<string name="contact_connection_pending">соединяется…</string>
|
||||
<string name="group_preview_you_are_invited">вы приглашены в группу</string>
|
||||
<string name="group_preview_you_are_invited">Вы приглашены в группу</string>
|
||||
<string name="group_preview_join_as">вступить как %s</string>
|
||||
<string name="group_connection_pending">соединяется…</string>
|
||||
<string name="tap_to_start_new_chat">Нажмите, чтобы начать чат</string>
|
||||
<string name="chat_with_developers">Соединиться с разработчиками</string>
|
||||
<string name="you_have_no_chats">У вас нет чатов</string>
|
||||
<string name="you_have_no_chats">У Вас нет чатов</string>
|
||||
<!-- ShareListView.kt -->
|
||||
<string name="share_message">Отправить сообщение…</string>
|
||||
<string name="share_image">Отправить изображение…</string>
|
||||
@@ -197,7 +199,7 @@
|
||||
<string name="icon_descr_asked_to_receive">Предложено получить изображение</string>
|
||||
<string name="icon_descr_image_snd_complete">Изображение отправлено</string>
|
||||
<string name="waiting_for_image">Ожидается прием изображения</string>
|
||||
<string name="image_will_be_received_when_contact_is_online">Изображение будет принято, когда ваш контакт будет в сети, подождите или проверьте позже!</string>
|
||||
<string name="image_will_be_received_when_contact_is_online">Изображение будет принято, когда Ваш контакт будет в сети, подождите или проверьте позже!</string>
|
||||
<string name="image_saved">Изображение сохранено в Галерею</string>
|
||||
<!-- Files - CIFileView.kt -->
|
||||
<string name="icon_descr_file">Файл</string>
|
||||
@@ -205,7 +207,7 @@
|
||||
<string name="contact_sent_large_file">Ваш контакт отправил файл, размер которого превышает поддерживаемый в настоящее время максимальный размер (<xliff:g id="maxFileSize">%1$s</xliff:g>).</string>
|
||||
<string name="maximum_supported_file_size">В настоящее время максимальный поддерживаемый размер файла составляет <xliff:g id="maxFileSize">%1$s</xliff:g>.</string>
|
||||
<string name="waiting_for_file">Ожидается прием файла</string>
|
||||
<string name="file_will_be_received_when_contact_is_online">Файл будет принят, когда ваш контакт будет в сети, подождите или проверьте позже!</string>
|
||||
<string name="file_will_be_received_when_contact_is_online">Файл будет принят, когда Ваш контакт будет в сети, подождите или проверьте позже!</string>
|
||||
<string name="file_saved">Файл сохранен</string>
|
||||
<string name="file_not_found">Файл не найден</string>
|
||||
<string name="error_saving_file">Ошибка сохранения файла</string>
|
||||
@@ -225,14 +227,14 @@
|
||||
<string name="icon_descr_server_status_error">Ошибка соединения с сервером</string>
|
||||
<string name="icon_descr_server_status_pending">Ожидается соединение с сервером</string>
|
||||
<string name="switch_receiving_address_question">Переключить адрес получения?</string>
|
||||
<string name="switch_receiving_address_desc">Это экспериментальная функция! Она будет работать, только если на другом клиенте установлена версия 4.2. После завершения смены адреса вы увидите сообщение — убедитесь, что вы все еще можете получать сообщения от этого контакта (или члена группы).</string>
|
||||
<string name="switch_receiving_address_desc">Это экспериментальная функция! Она будет работать, только если на другом клиенте установлена версия 4.2. После завершения смены адреса Вы увидите сообщение — убедитесь, что Вы все еще можете получать сообщения от этого контакта (или члена группы).</string>
|
||||
<!-- Message Actions - SendMsgView.kt -->
|
||||
<string name="icon_descr_send_message">Отправить сообщение</string>
|
||||
<string name="icon_descr_record_voice_message">Записать голосовое сообщение</string>
|
||||
<string name="allow_voice_messages_question">Разрешить голосовые сообщения?</string>
|
||||
<string name="you_need_to_allow_to_send_voice">Чтобы включить отправку голосовых сообщений, разрешите их вашему контакту.</string>
|
||||
<string name="you_need_to_allow_to_send_voice">Чтобы включить отправку голосовых сообщений, разрешите их Вашему контакту.</string>
|
||||
<string name="voice_messages_prohibited">Голосовые сообщения запрещены!</string>
|
||||
<string name="ask_your_contact_to_enable_voice">Попросите вашего контакта разрешить отправку голосовых сообщений.</string>
|
||||
<string name="ask_your_contact_to_enable_voice">Попросите Вашего контакта разрешить отправку голосовых сообщений.</string>
|
||||
<string name="only_group_owners_can_enable_voice">Только владельцы группы могут разрешить голосовые сообщения.</string>
|
||||
<!-- General Actions / Responses -->
|
||||
<string name="back">Назад</string>
|
||||
@@ -249,7 +251,7 @@
|
||||
<string name="connect_via_link_or_qr">Соединиться через ссылку / QR код</string>
|
||||
<string name="scan_QR_code">Сканировать\nQR код</string>
|
||||
<string name="create_group">Создать секретную группу</string>
|
||||
<string name="to_share_with_your_contact">(чтобы отправить вашему контакту)</string>
|
||||
<string name="to_share_with_your_contact">(чтобы отправить Вашему контакту)</string>
|
||||
<string name="connect_via_link_or_qr_from_clipboard_or_in_person">(сканировать или вставить из буфера)</string>
|
||||
<string name="only_stored_on_members_devices">(хранится только у членов группы)</string>
|
||||
<!-- GetImageView -->
|
||||
@@ -263,21 +265,21 @@
|
||||
<string name="to_start_a_new_chat_help_header">Чтобы начать новый чат</string>
|
||||
<string name="chat_help_tap_button">Нажмите кнопку</string>
|
||||
<string name="above_then_preposition_continuation">сверху, затем:</string>
|
||||
<string name="add_new_contact_to_create_one_time_QR_code"><b>Добавить новый контакт</b>: чтобы создать одноразовый QR код/ссылку для вашего контакта.</string>
|
||||
<string name="scan_QR_code_to_connect_to_contact_who_shows_QR_code"><b>Сканировать QR код</b>: чтобы соединиться с контактом, который показывает вам QR код.</string>
|
||||
<string name="add_new_contact_to_create_one_time_QR_code"><b>Добавить новый контакт</b>: чтобы создать одноразовый QR код/ссылку для Вашего контакта.</string>
|
||||
<string name="scan_QR_code_to_connect_to_contact_who_shows_QR_code"><b>Сканировать QR код</b>: чтобы соединиться с контактом, который показывает Вам QR код.</string>
|
||||
<string name="to_connect_via_link_title">Чтобы соединиться через ссылку</string>
|
||||
<string name="if_you_received_simplex_invitation_link_you_can_open_in_browser">Если вы получили ссылку с приглашением из <xliff:g id="appName">SimpleX Chat</xliff:g>, вы можете открыть ее в браузере:</string>
|
||||
<string name="if_you_received_simplex_invitation_link_you_can_open_in_browser">Если Вы получили ссылку с приглашением из <xliff:g id="appName">SimpleX Chat</xliff:g>, Вы можете открыть ее в браузере:</string>
|
||||
<string name="desktop_scan_QR_code_from_app_via_scan_QR_code">💻 на компьютере: сосканируйте показанный QR код из приложения через <b>Сканировать QR код</b>.</string>
|
||||
<string name="mobile_tap_open_in_mobile_app_then_tap_connect_in_app">📱 на мобильном: намжите кнопку <b>Open in mobile app</b> на веб странице, затем нажмите <b>Соединиться</b> в приложении.</string>
|
||||
<!-- Contact Request Alert Dialogue - CharListNavLinkView.kt -->
|
||||
<string name="accept_connection_request__question">Принять запрос на соединение?</string>
|
||||
<string name="if_you_choose_to_reject_the_sender_will_not_be_notified">Отправителю НЕ будет послано уведомление, если вы отклоните запрос на соединение.</string>
|
||||
<string name="if_you_choose_to_reject_the_sender_will_not_be_notified">Отправителю НЕ будет послано уведомление, если Вы отклоните запрос на соединение.</string>
|
||||
<string name="accept_contact_button">Принять</string>
|
||||
<string name="accept_contact_incognito_button">Принять инкогнито</string>
|
||||
<string name="reject_contact_button">Отклонить</string>
|
||||
<!-- Clear Chat - ChatListNavLinkView.kt -->
|
||||
<string name="clear_chat_question">Очистить чат?</string>
|
||||
<string name="clear_chat_warning">Все сообщения будут удалены - это действие нельзя отменить! Сообщения будут удалены только для вас.</string>
|
||||
<string name="clear_chat_warning">Все сообщения будут удалены - это действие нельзя отменить! Сообщения будут удалены только для Вас.</string>
|
||||
<string name="clear_verb">Очистить</string>
|
||||
<string name="clear_chat_button">Очистить чат</string>
|
||||
<string name="clear_chat_menu_action">Очистить</string>
|
||||
@@ -290,16 +292,16 @@
|
||||
<string name="mute_chat">Без звука</string>
|
||||
<string name="unmute_chat">Уведомлять</string>
|
||||
<!-- Pending contact connection alert dialogues -->
|
||||
<string name="you_invited_your_contact">Вы пригласили ваш контакт</string>
|
||||
<string name="you_invited_your_contact">Вы пригласили Ваш контакт</string>
|
||||
<string name="you_accepted_connection">Вы приняли приглашение соединиться</string>
|
||||
<string name="delete_pending_connection__question">Удалить ожидаемое соединение?</string>
|
||||
<string name="contact_you_shared_link_with_wont_be_able_to_connect">Контакт, которому вы отправили эту ссылку, не сможет соединиться!</string>
|
||||
<string name="contact_you_shared_link_with_wont_be_able_to_connect">Контакт, которому Вы отправили эту ссылку, не сможет соединиться!</string>
|
||||
<string name="connection_you_accepted_will_be_cancelled">Подтвержденное соединение будет отменено!</string>
|
||||
<!-- Connection Pending Alert Dialogue - ChatListNavLinkView.kt -->
|
||||
<string name="alert_title_contact_connection_pending">Соединение еще не установлено!</string>
|
||||
<string name="alert_text_connection_pending_they_need_to_be_online_can_delete_and_retry">Ваш контакт должен быть в сети чтобы установить соединение.\nВы можете отменить соединение и удалить контакт (и попробовать позже с другой ссылкой).</string>
|
||||
<!-- Contact Request Information - ContactRequestView.kt -->
|
||||
<string name="contact_wants_to_connect_with_you">хочет соединиться с вами!</string>
|
||||
<string name="contact_wants_to_connect_with_you">хочет соединиться с Вами!</string>
|
||||
<!-- Image Placeholder - ChatInfoImage.kt -->
|
||||
<string name="icon_descr_profile_image_placeholder">аватар не установлен</string>
|
||||
<string name="image_descr_profile_image">аватар</string>
|
||||
@@ -324,15 +326,16 @@
|
||||
<string name="this_link_is_not_a_valid_connection_link">Эта ссылка не является ссылкой-приглашением!</string>
|
||||
<string name="connection_request_sent">Запрос на соединение послан!</string>
|
||||
<string name="you_will_be_connected_when_group_host_device_is_online">Соединение с группой будет установлено, когда хост группы будет онлайн. Пожалуйста, подождите или проверьте позже!</string>
|
||||
<string name="you_will_be_connected_when_your_connection_request_is_accepted">Соединение будет установлено, когда ваш запрос будет принят. Пожалуйста, подождите или проверьте позже!</string>
|
||||
<string name="you_will_be_connected_when_your_contacts_device_is_online">Соединение будет установлено, когда ваш контакт будет онлайн. Пожалуйста, подождите или проверьте позже!</string>
|
||||
<string name="you_will_be_connected_when_your_connection_request_is_accepted">Соединение будет установлено, когда Ваш запрос будет принят. Пожалуйста, подождите или проверьте позже!</string>
|
||||
<string name="you_will_be_connected_when_your_contacts_device_is_online">Соединение будет установлено, когда Ваш контакт будет онлайн. Пожалуйста, подождите или проверьте позже!</string>
|
||||
<string name="show_QR_code_for_your_contact_to_scan_from_the_app__multiline">Ваш контакт может сосканировать QR код в приложении.</string>
|
||||
<string name="if_you_cannot_meet_in_person_show_QR_in_video_call_or_via_another_channel">Если вы не можете встретиться лично, вы можете <b>показать QR код во время видеозвонка</b> или поделиться ссылкой.</string>
|
||||
<string name="your_chat_profile_will_be_sent_to_your_contact">Ваш профиль будет отправлен\nвашему контакту</string>
|
||||
<string name="if_you_cannot_meet_in_person_scan_QR_in_video_call_or_ask_for_invitation_link">Если вы не можете встретиться лично, вы можете <b>сосканировать QR код во время видеозвонка</b>, или ваш контакт может отправить вам ссылку.</string>
|
||||
<string name="if_you_cannot_meet_in_person_show_QR_in_video_call_or_via_another_channel">Если Вы не можете встретиться лично, Вы можете <b>показать QR код во время видеозвонка</b> или поделиться ссылкой.</string>
|
||||
<string name="your_chat_profile_will_be_sent_to_your_contact">Ваш профиль будет отправлен
|
||||
\nВашему контакту</string>
|
||||
<string name="if_you_cannot_meet_in_person_scan_QR_in_video_call_or_ask_for_invitation_link">Если Вы не можете встретиться лично, Вы можете <b>сосканировать QR код во время видеозвонка</b>, или Ваш контакт может отправить Вам ссылку.</string>
|
||||
<string name="share_invitation_link">Поделиться ссылкой</string>
|
||||
<string name="paste_connection_link_below_to_connect">Чтобы соединиться, вставьте в это поле ссылку, полученную от вашего контакта.</string>
|
||||
<string name="your_profile_will_be_sent">Ваш профиль будет отправлен вашему контакту</string>
|
||||
<string name="paste_connection_link_below_to_connect">Чтобы соединиться, вставьте в это поле ссылку, полученную от Вашего контакта.</string>
|
||||
<string name="your_profile_will_be_sent">Ваш профиль будет отправлен Вашему контакту</string>
|
||||
<!-- PasteToConnect.kt -->
|
||||
<string name="connect_button">Соединиться</string>
|
||||
<string name="paste_button">Вставить</string>
|
||||
@@ -365,7 +368,7 @@
|
||||
<string name="smp_servers_enter_manually">Ввести сервер вручную</string>
|
||||
<string name="smp_servers_preset_server">Сервер по умолчанию</string>
|
||||
<string name="smp_servers_your_server">Ваш сервер</string>
|
||||
<string name="smp_servers_your_server_address">Адрес вашего сервера</string>
|
||||
<string name="smp_servers_your_server_address">Адрес Вашего сервера</string>
|
||||
<string name="smp_servers_use_server">Использовать сервер</string>
|
||||
<string name="smp_servers_use_server_for_new_conn">Использовать для новых соединений</string>
|
||||
<string name="smp_servers_add_to_another_device">Добавить на другое устройство</string>
|
||||
@@ -395,7 +398,7 @@
|
||||
<string name="network_enable_socks">Использовать SOCKS прокси?</string>
|
||||
<string name="network_enable_socks_info">Соединяться с серверами через SOCKS прокси через порт 9050? Прокси должен быть запущен до включения этой опции.</string>
|
||||
<string name="network_disable_socks">Использовать прямое соединение с Интернет?</string>
|
||||
<string name="network_disable_socks_info">Если вы подтвердите, серверы смогут видеть ваш IP адрес, а провайдер - с какими серверами вы соединяетесь.</string>
|
||||
<string name="network_disable_socks_info">Если Вы подтвердите, серверы смогут видеть Ваш IP адрес, а провайдер - с какими серверами Вы соединяетесь.</string>
|
||||
<string name="update_onion_hosts_settings_question">Обновить настройки .onion хостов?</string>
|
||||
<string name="network_use_onion_hosts">Использовать .onion хосты</string>
|
||||
<string name="network_use_onion_hosts_prefer">Когда возможно</string>
|
||||
@@ -412,7 +415,7 @@
|
||||
<string name="create_address">Создать адрес</string>
|
||||
<string name="delete_address__question">Удалить адрес?</string>
|
||||
<string name="all_your_contacts_will_remain_connected">Все контакты, которые соединились через этот адрес, сохранятся.</string>
|
||||
<string name="you_can_share_your_address_anybody_will_be_able_to_connect">Вы можете использовать ваш адрес как ссылку или как QR код - кто угодно сможет соединиться с вами. Вы сможете удалить адрес, сохранив контакты, которые через него соединились.</string>
|
||||
<string name="you_can_share_your_address_anybody_will_be_able_to_connect">Вы можете использовать Ваш адрес как ссылку или как QR код - кто угодно сможет соединиться с Вами. Вы сможете удалить адрес, сохранив контакты, которые через него соединились.</string>
|
||||
<string name="share_link">Поделиться\nссылкой</string>
|
||||
<string name="delete_address">Удалить\nадрес</string>
|
||||
<!-- AcceptRequestsView.kt -->
|
||||
@@ -424,7 +427,9 @@
|
||||
<string name="display_name__field">Имя профиля:</string>
|
||||
<string name="full_name__field">"Полное имя:</string>
|
||||
<string name="your_current_profile">Ваш активный профиль</string>
|
||||
<string name="your_profile_is_stored_on_device_and_shared_only_with_contacts_simplex_cannot_see_it">Ваш профиль хранится на вашем устройстве и отправляется только вашим контактам.\n\n<xliff:g id="appName">SimpleX</xliff:g> серверы не могут получить доступ к вашему профилю.</string>
|
||||
<string name="your_profile_is_stored_on_device_and_shared_only_with_contacts_simplex_cannot_see_it">Ваш профиль хранится на Вашем устройстве и отправляется только Вашим контактам.
|
||||
\n
|
||||
\n<xliff:g id="appName">SimpleX</xliff:g> серверы не могут получить доступ к Вашему профилю.</string>
|
||||
<string name="edit_image">Поменять аватар</string>
|
||||
<string name="delete_image">Удалить аватар</string>
|
||||
<string name="save_preferences_question">Сохранить предпочтения?</string>
|
||||
@@ -433,12 +438,12 @@
|
||||
<string name="save_and_notify_group_members">Сохранить и уведомить членов группы</string>
|
||||
<string name="exit_without_saving">Выйти без сохранения</string>
|
||||
<!-- Welcome Prompts - WelcomeView.kt -->
|
||||
<string name="you_control_your_chat">Вы котролируете ваш чат!</string>
|
||||
<string name="the_messaging_and_app_platform_protecting_your_privacy_and_security">Платформа для сообщений и приложений, которая защищает вашу личную информацию и безопасность.</string>
|
||||
<string name="we_do_not_store_contacts_or_messages_on_servers">Мы не храним ваши контакты и сообщения (после доставки) на серверах.</string>
|
||||
<string name="you_control_your_chat">Вы котролируете Ваш чат!</string>
|
||||
<string name="the_messaging_and_app_platform_protecting_your_privacy_and_security">Платформа для сообщений и приложений, которая защищает Вашу личную информацию и безопасность.</string>
|
||||
<string name="we_do_not_store_contacts_or_messages_on_servers">Мы не храним Ваши контакты и сообщения (после доставки) на серверах.</string>
|
||||
<string name="create_profile">Создать профиль</string>
|
||||
<string name="your_profile_is_stored_on_your_device">Ваш профиль, контакты и доставленные сообщения хранятся на вашем устройстве.</string>
|
||||
<string name="profile_is_only_shared_with_your_contacts">Профиль отправляется только вашим контактам.</string>
|
||||
<string name="your_profile_is_stored_on_your_device">Ваш профиль, контакты и доставленные сообщения хранятся на Вашем устройстве.</string>
|
||||
<string name="profile_is_only_shared_with_your_contacts">Профиль отправляется только Вашим контактам.</string>
|
||||
<string name="display_name_cannot_contain_whitespace">Имя профиля не может содержать пробелы.</string>
|
||||
<string name="display_name">Имя профиля</string>
|
||||
<string name="full_name_optional__prompt">Полное имя (не обязательно)</string>
|
||||
@@ -455,7 +460,7 @@
|
||||
<string name="secret">секрет</string>
|
||||
<string name="connect_via_link">Соединиться через ссылку</string>
|
||||
<string name="this_string_is_not_a_connection_link">Эта строка не является ссылкой-приглашением!</string>
|
||||
<string name="you_can_also_connect_by_clicking_the_link">Вы также можете соединиться, открыв ссылку там, где вы её получили. Если ссылка откроется в браузере, нажмите кнопку <b>Открыть в приложении</b>.</string>
|
||||
<string name="you_can_also_connect_by_clicking_the_link">Вы также можете соединиться, открыв ссылку там, где Вы её получили. Если ссылка откроется в браузере, нажмите кнопку <b>Открыть в приложении</b>.</string>
|
||||
<!-- CICallStatus -->
|
||||
<string name="callstatus_calling">входящий звонок…</string>
|
||||
<string name="callstatus_missed">пропущенный звонок</string>
|
||||
@@ -479,7 +484,7 @@
|
||||
<string name="privacy_redefined">Более конфиденциальный</string>
|
||||
<string name="first_platform_without_user_ids">Первая в мире платформа без идентификаторов пользователей.</string>
|
||||
<string name="immune_to_spam_and_abuse">Защищен от спама</string>
|
||||
<string name="people_can_connect_only_via_links_you_share">С вами можно соединиться только через созданные вами ссылки.</string>
|
||||
<string name="people_can_connect_only_via_links_you_share">С Вами можно соединиться только через созданные Вами ссылки.</string>
|
||||
<string name="decentralized">Децентрализованный</string>
|
||||
<string name="opensource_protocol_and_code_anybody_can_run_servers">Открытый протокол и код - кто угодно может запустить сервер.</string>
|
||||
<string name="create_your_profile">Создать профиль</string>
|
||||
@@ -488,8 +493,8 @@
|
||||
<!-- How SimpleX Works -->
|
||||
<string name="how_simplex_works">Как <xliff:g id="appName">SimpleX</xliff:g> работает</string>
|
||||
<string name="many_people_asked_how_can_it_deliver">Много пользователей спросили: <i>как <xliff:g id="appName">SimpleX</xliff:g> доставляет сообщения без идентификаторов пользователей?</i></string>
|
||||
<string name="to_protect_privacy_simplex_has_ids_for_queues">Чтобы защитить вашу конфиденциальность, вместо ID пользователей, которые есть в других платформах, <xliff:g id="appName">SimpleX</xliff:g> использует ID для очередей сообщений, разные для каждого контакта.</string>
|
||||
<string name="you_control_servers_to_receive_your_contacts_to_send">Вы определяете через какие серверы вы <b>получаете сообщения</b>, ваши контакты - серверы, которые вы используете для отправки.</string>
|
||||
<string name="to_protect_privacy_simplex_has_ids_for_queues">Чтобы защитить Вашу конфиденциальность, вместо ID пользователей, которые есть в других платформах, <xliff:g id="appName">SimpleX</xliff:g> использует ID для очередей сообщений, разные для каждого контакта.</string>
|
||||
<string name="you_control_servers_to_receive_your_contacts_to_send">Вы определяете через какие серверы Вы <b>получаете сообщения</b>, Ваши контакты - серверы, которые Вы используете для отправки.</string>
|
||||
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages">Только пользовательские устройства хранят контакты, группы и сообщения, которые отправляются <b>с двухуровневым end-to-end шифрованием</b>.</string>
|
||||
<string name="read_more_in_github">Узнайте больше из нашего GitHub репозитория.</string>
|
||||
<string name="read_more_in_github_with_link">Узнайте больше из нашего <font color="#0088ff">GitHub репозитория</font>.</string>
|
||||
@@ -500,7 +505,7 @@
|
||||
<!-- Call -->
|
||||
<string name="incoming_video_call">Входящий видеозвонок</string>
|
||||
<string name="incoming_audio_call">Входящий аудиозвонок</string>
|
||||
<string name="contact_wants_to_connect_via_call"><xliff:g id="contactName" example="Alice">%1$s</xliff:g> хочет связаться с вами через </string>
|
||||
<string name="contact_wants_to_connect_via_call"><xliff:g id="contactName" example="Alice">%1$s</xliff:g> хочет связаться с Вами через </string>
|
||||
<string name="video_call_no_encryption">видеозвонок (не e2e зашифрованный)</string>
|
||||
<string name="encrypted_video_call">e2e зашифрованный видеозвонок</string>
|
||||
<string name="audio_call_no_encryption">аудиозвонок (не e2e зашифрованный)</string>
|
||||
@@ -521,8 +526,8 @@
|
||||
<string name="no_call_on_lock_screen">Выключить</string>
|
||||
<string name="your_ice_servers">Ваши ICE серверы</string>
|
||||
<string name="webrtc_ice_servers">WebRTC ICE серверы</string>
|
||||
<string name="relay_server_protects_ip">Relay сервер защищает ваш IP адрес, но может отслеживать продолжительность звонка.</string>
|
||||
<string name="relay_server_if_necessary">Relay сервер используется только при необходимости. Другая сторона может видеть ваш IP адрес.</string>
|
||||
<string name="relay_server_protects_ip">Relay сервер защищает Ваш IP адрес, но может отслеживать продолжительность звонка.</string>
|
||||
<string name="relay_server_if_necessary">Relay сервер используется только при необходимости. Другая сторона может видеть Ваш IP адрес.</string>
|
||||
<!-- Call Lock Screen -->
|
||||
<string name="open_simplex_chat_to_accept_call">Откройте <xliff:g id="appNameFull">SimpleX Chat</xliff:g>\nчтобы принять звонок</string>
|
||||
<string name="allow_accepting_calls_from_lock_screen">Вы можете разрешить принимать звонки на экране блокировки через Настройки.</string>
|
||||
@@ -556,7 +561,12 @@
|
||||
<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. Сервер удалил сообщения, если они не были доставлены в течение 30 дней.
|
||||
\n2. Сервер, через который Вы получаете сообщения от контакта, был обновлён и перезапущен.
|
||||
\n3. Соединение компроментировано.
|
||||
\nПожалуйста, соединитесь с девелоперами через Настройки, чтобы получать уведомления о серверах.
|
||||
\nМы планируем добавить избыточную доставку сообщений, чтобы не терять сообщения.</string>
|
||||
<!-- Privacy settings -->
|
||||
<string name="privacy_and_security">Конфиденциальность</string>
|
||||
<string name="your_privacy">Конфиденциальность</string>
|
||||
@@ -601,17 +611,18 @@
|
||||
<string name="error_stopping_chat">Ошибка при остановке чата</string>
|
||||
<string name="error_exporting_chat_database">Ошибка при экспорте архива чата</string>
|
||||
<string name="import_database_question">Импортировать архив чата?</string>
|
||||
<string name="your_current_chat_database_will_be_deleted_and_replaced_with_the_imported_one">Текущие данные вашего чата будет УДАЛЕНЫ и ЗАМЕНЕНЫ импортированными.\nЭто действие нельзя отменить — ваш профиль, контакты, сообщения и файлы будут безвозвратно утеряны.</string>
|
||||
<string name="your_current_chat_database_will_be_deleted_and_replaced_with_the_imported_one">Текущие данные Вашего чата будет УДАЛЕНЫ и ЗАМЕНЕНЫ импортированными.
|
||||
\nЭто действие нельзя отменить — ваш профиль, контакты, сообщения и файлы будут безвозвратно утеряны.</string>
|
||||
<string name="import_database_confirmation">Импортировать</string>
|
||||
<string name="error_deleting_database">Ошибка при удалении данных чата</string>
|
||||
<string name="error_importing_database">Ошибка при импорте архива чата</string>
|
||||
<string name="chat_database_imported">Архив чата импортирован</string>
|
||||
<string name="restart_the_app_to_use_imported_chat_database">Перезапустите приложение, чтобы использовать импортированные данные чата.</string>
|
||||
<string name="delete_chat_profile_question">Удалить профиль?</string>
|
||||
<string name="delete_chat_profile_action_cannot_be_undone_warning">Это действие нельзя отменить — ваш профиль, контакты, сообщения и файлы будут безвозвратно утеряны.</string>
|
||||
<string name="delete_chat_profile_action_cannot_be_undone_warning">Это действие нельзя отменить — Ваш профиль, контакты, сообщения и файлы будут безвозвратно утеряны.</string>
|
||||
<string name="chat_database_deleted">Данные чата удалены</string>
|
||||
<string name="restart_the_app_to_create_a_new_chat_profile">Перезапустите приложение, чтобы создать новый профиль.</string>
|
||||
<string name="you_must_use_the_most_recent_version_of_database">Используйте самую последнюю версию архива чата и ТОЛЬКО на одном устройстве, иначе вы можете перестать получать сообщения от некоторых контактов.</string>
|
||||
<string name="you_must_use_the_most_recent_version_of_database">Используйте самую последнюю версию архива чата и ТОЛЬКО на одном устройстве, иначе Вы можете перестать получать сообщения от некоторых контактов.</string>
|
||||
<string name="stop_chat_to_enable_database_actions">Остановите чат, чтобы разблокировать операции с архивом чата.</string>
|
||||
<string name="delete_files_and_media_for_all_users">Удалить файлы во всех профилях чата</string>
|
||||
<string name="delete_files_and_media_all">Удалить все файлы</string>
|
||||
@@ -643,20 +654,20 @@
|
||||
<string name="confirm_new_passphrase">Подтвердите новый пароль…</string>
|
||||
<string name="update_database_passphrase">Поменять пароль</string>
|
||||
<string name="enter_correct_current_passphrase">Пожалуйста, введите правильный пароль.</string>
|
||||
<string name="database_is_not_encrypted">База данных НЕ зашифрована. Установите пароль, чтобы защитить ваши данные.</string>
|
||||
<string name="database_is_not_encrypted">База данных НЕ зашифрована. Установите пароль, чтобы защитить Ваши данные.</string>
|
||||
<string name="keychain_is_storing_securely">Android Keystore используется для безопасного хранения пароля - это позволяет стабильно получать уведомления в фоновом режиме.</string>
|
||||
<string name="encrypted_with_random_passphrase">База данных зашифрована случайным паролем, вы можете его поменять.</string>
|
||||
<string name="impossible_to_recover_passphrase"><b>Внимание</b>: вы не сможете восстановить или поменять пароль, если потеряете его.</string>
|
||||
<string name="encrypted_with_random_passphrase">База данных зашифрована случайным паролем, Вы можете его поменять.</string>
|
||||
<string name="impossible_to_recover_passphrase"><b>Внимание</b>: Вы не сможете восстановить или поменять пароль, если потеряете его.</string>
|
||||
<string name="keychain_allows_to_receive_ntfs">Пароль базы данных будет безопасно сохранен в Android Keystore после запуска чата или изменения пароля - это позволит стабильно получать уведомления.</string>
|
||||
<string name="you_have_to_enter_passphrase_every_time">Пароль не сохранен на устройстве — вы будете должны ввести его при каждом запуске чата.</string>
|
||||
<string name="you_have_to_enter_passphrase_every_time">Пароль не сохранен на устройстве — Вы будете должны ввести его при каждом запуске чата.</string>
|
||||
<string name="encrypt_database_question">Зашифровать базу данных?</string>
|
||||
<string name="change_database_passphrase_question">Поменять пароль базы данных?</string>
|
||||
<string name="database_will_be_encrypted">База данных будет зашифрована.</string>
|
||||
<string name="database_will_be_encrypted_and_passphrase_stored">База данных будет зашифрована и пароль сохранен в Keystore.</string>
|
||||
<string name="database_encryption_will_be_updated">Пароль базы данных будет изменен и сохранен в Keystore.</string>
|
||||
<string name="database_passphrase_will_be_updated">Пароль базы данных будет изменен.</string>
|
||||
<string name="store_passphrase_securely">Пожалуйста, надежно сохраните пароль, вы НЕ сможете его поменять, если потеряете.</string>
|
||||
<string name="store_passphrase_securely_without_recover">Пожалуйста, надежно сохраните пароль, вы НЕ сможете открыть чат, если потеряете его.</string>
|
||||
<string name="store_passphrase_securely">Пожалуйста, надежно сохраните пароль, Вы НЕ сможете его поменять, если потеряете.</string>
|
||||
<string name="store_passphrase_securely_without_recover">Пожалуйста, надежно сохраните пароль, Вы НЕ сможете открыть чат, если потеряете его.</string>
|
||||
<!-- DatabaseErrorView.kt -->
|
||||
<string name="wrong_passphrase">Неправильный пароль базы данных</string>
|
||||
<string name="encrypted_database">База данных зашифрована</string>
|
||||
@@ -680,7 +691,7 @@
|
||||
<string name="restore_database_alert_desc">Введите предыдущий пароль после восстановления резервной копии. Это действие нельзя отменить.</string>
|
||||
<string name="restore_database_alert_confirm">Восстановить</string>
|
||||
<string name="database_restore_error">Ошибка при восстановлении базы данных</string>
|
||||
<string name="restore_passphrase_not_found_desc">Пароль не найден в Keystore, пожалуйста, введите его вручную. Это могло произойти, если вы восстановили данные приложения с помощью инструмента резервного копирования. Если это не так, пожалуйста, свяжитесь с разработчиками.</string>
|
||||
<string name="restore_passphrase_not_found_desc">Пароль не найден в Keystore, пожалуйста, введите его вручную. Это могло произойти, если Вы восстановили данные приложения с помощью инструмента резервного копирования. Если это не так, пожалуйста, свяжитесь с разработчиками.</string>
|
||||
<!-- ChatModel.chatRunning interactions -->
|
||||
<string name="chat_is_stopped_indication">Чат остановлен</string>
|
||||
<string name="you_can_start_chat_via_setting_or_by_restarting_the_app">Вы можете запустить чат через Настройки приложения или перезапустив приложение.</string>
|
||||
@@ -709,7 +720,7 @@
|
||||
<string name="alert_title_no_group">Группа не найдена!</string>
|
||||
<string name="alert_message_no_group">Эта группа больше не существует.</string>
|
||||
<string name="alert_title_cant_invite_contacts">Нельзя пригласить контакты!</string>
|
||||
<string name="alert_title_cant_invite_contacts_descr">Вы используете инкогнито профиль для этой группы - чтобы предотвратить раскрытие вашего основного профиля, приглашать контакты не разрешено</string>
|
||||
<string name="alert_title_cant_invite_contacts_descr">Вы используете инкогнито профиль для этой группы - чтобы предотвратить раскрытие Вашего основного профиля, приглашать контакты не разрешено</string>
|
||||
<!-- CIGroupInvitationView.kt -->
|
||||
<string name="you_sent_group_invitation">Вы отправили приглашение в группу</string>
|
||||
<string name="you_are_invited_to_group">Вы приглашены в группу</string>
|
||||
@@ -723,23 +734,23 @@
|
||||
<string name="rcv_group_event_member_connected">соединен(а)</string>
|
||||
<string name="rcv_group_event_member_left">покинул(а) группу</string>
|
||||
<string name="rcv_group_event_changed_member_role">поменял(а) роль члена %s на: %s</string>
|
||||
<string name="rcv_group_event_changed_your_role">поменял(а) вашу роль на: %s</string>
|
||||
<string name="rcv_group_event_changed_your_role">поменял(а) Вашу роль на: %s</string>
|
||||
<string name="rcv_group_event_member_deleted">удалил(а) <xliff:g id="member profile" example="alice (Alice)">%1$s</xliff:g></string>
|
||||
<string name="rcv_group_event_user_deleted">удалил(а) вас из группы</string>
|
||||
<string name="rcv_group_event_user_deleted">удалил(а) Вас из группы</string>
|
||||
<string name="rcv_group_event_group_deleted">удалил(а) группу</string>
|
||||
<string name="rcv_group_event_updated_group_profile">обновил(а) профиль группы</string>
|
||||
<string name="rcv_group_event_invited_via_your_group_link">приглашен(а) через вашу ссылку группы</string>
|
||||
<string name="snd_group_event_changed_member_role">вы поменяли роль члена %s на: %s</string>
|
||||
<string name="snd_group_event_changed_role_for_yourself">вы поменяли роль себе на: %s</string>
|
||||
<string name="snd_group_event_member_deleted">вы удалили <xliff:g id="member profile" example="alice (Alice)">%1$s</xliff:g></string>
|
||||
<string name="snd_group_event_user_left">вы покинули группу</string>
|
||||
<string name="rcv_group_event_invited_via_your_group_link">приглашен(а) через Вашу ссылку группы</string>
|
||||
<string name="snd_group_event_changed_member_role">Вы поменяли роль члена %s на: %s</string>
|
||||
<string name="snd_group_event_changed_role_for_yourself">Вы поменяли роль себе на: %s</string>
|
||||
<string name="snd_group_event_member_deleted">Вы удалили <xliff:g id="member profile" example="alice (Alice)">%1$s</xliff:g></string>
|
||||
<string name="snd_group_event_user_left">Вы покинули группу</string>
|
||||
<string name="snd_group_event_group_profile_updated">профиль группы обновлен</string>
|
||||
<!-- Conn event chat items -->
|
||||
<string name="rcv_conn_event_switch_queue_phase_completed">поменял(а) адрес для вас</string>
|
||||
<string name="rcv_conn_event_switch_queue_phase_completed">поменял(а) адрес для Вас</string>
|
||||
<string name="rcv_conn_event_switch_queue_phase_changing">смена адреса…</string>
|
||||
<string name="snd_conn_event_switch_queue_phase_completed_for_member">вы поменяли адрес для %s</string>
|
||||
<string name="snd_conn_event_switch_queue_phase_completed_for_member">Вы поменяли адрес для %s</string>
|
||||
<string name="snd_conn_event_switch_queue_phase_changing_for_member">смена адреса для %s…</string>
|
||||
<string name="snd_conn_event_switch_queue_phase_completed">вы поменяли адрес</string>
|
||||
<string name="snd_conn_event_switch_queue_phase_completed">Вы поменяли адрес</string>
|
||||
<string name="snd_conn_event_switch_queue_phase_changing">смена адреса…</string>
|
||||
<!-- GroupMemberRole -->
|
||||
<string name="group_member_role_member">член группы</string>
|
||||
@@ -770,15 +781,15 @@
|
||||
<string name="num_contacts_selected">Выбрано контактов: %d</string>
|
||||
<string name="no_contacts_selected">Контакты не выбраны</string>
|
||||
<string name="invite_prohibited">Нельзя пригласить контакт!</string>
|
||||
<string name="invite_prohibited_description">Вы пытаетесь пригласить инкогнито контакт в группу, где вы используете свой основной профиль</string>
|
||||
<string name="invite_prohibited_description">Вы пытаетесь пригласить инкогнито контакт в группу, где Вы используете свой основной профиль</string>
|
||||
<!-- GroupChatInfoView.kt -->
|
||||
<string name="button_add_members">Пригласить членов группы</string>
|
||||
<string name="group_info_section_title_num_members">ЧЛЕНОВ ГРУППЫ: <xliff:g id="num_members">%1$s</xliff:g></string>
|
||||
<string name="group_info_member_you">вы: <xliff:g id="group_info_you">%1$s</xliff:g></string>
|
||||
<string name="group_info_member_you">Вы: <xliff:g id="group_info_you">%1$s</xliff:g></string>
|
||||
<string name="button_delete_group">Удалить группу</string>
|
||||
<string name="delete_group_question">Удалить группу?</string>
|
||||
<string name="delete_group_for_all_members_cannot_undo_warning">Группа будет удалена для всех членов - это действие нельзя отменить!</string>
|
||||
<string name="delete_group_for_self_cannot_undo_warning">Группа будет удалена для вас - это действие нельзя отменить!</string>
|
||||
<string name="delete_group_for_self_cannot_undo_warning">Группа будет удалена для Вас - это действие нельзя отменить!</string>
|
||||
<string name="button_leave_group">Выйти из группы</string>
|
||||
<string name="button_edit_group_profile">Редактировать профиль группы</string>
|
||||
<string name="group_link">Ссылка группы</string>
|
||||
@@ -824,7 +835,7 @@
|
||||
<string name="group_is_decentralized">Группа полностью децентрализована — она видна только членам.</string>
|
||||
<string name="group_display_name_field">Имя группы:</string>
|
||||
<string name="group_full_name_field">Полное имя:</string>
|
||||
<string name="group_unsupported_incognito_main_profile_sent">Режим Инкогнито здесь не поддерживается - ваш основной профиль будет отправлен членам группы</string>
|
||||
<string name="group_unsupported_incognito_main_profile_sent">Режим Инкогнито здесь не поддерживается - Ваш основной профиль будет отправлен членам группы</string>
|
||||
<string name="group_main_profile_sent">Ваш профиль чата будет отправлен членам группы</string>
|
||||
<!-- GroupProfileView.kt -->
|
||||
<string name="group_profile_is_stored_on_members_devices">Профиль группы хранится на устройствах членов, а не на серверах.</string>
|
||||
@@ -846,10 +857,10 @@
|
||||
<string name="incognito">Инкогнито</string>
|
||||
<string name="incognito_random_profile">Случайный профиль</string>
|
||||
<string name="incognito_random_profile_description">Вашему контакту будет отправлен случайный профиль</string>
|
||||
<string name="incognito_random_profile_from_contact_description">Контакту, от которого вы получили эту ссылку, будет отправлен случайный профиль</string>
|
||||
<string name="incognito_info_protects">Режим Инкогнито защищает конфиденциальность имени и изображения вашего основного профиля — для каждого нового контакта создается новый случайный профиль.</string>
|
||||
<string name="incognito_random_profile_from_contact_description">Контакту, от которого Вы получили эту ссылку, будет отправлен случайный профиль</string>
|
||||
<string name="incognito_info_protects">Режим Инкогнито защищает конфиденциальность имени и изображения Вашего основного профиля — для каждого нового контакта создается новый случайный профиль.</string>
|
||||
<string name="incognito_info_allows">Это позволяет иметь много анонимных соединений без общих данных между ними в одном профиле пользователя.</string>
|
||||
<string name="incognito_info_share">Когда вы соединены с контактом инкогнито, тот же самый инкогнито профиль будет использоваться для групп с этим контактом.</string>
|
||||
<string name="incognito_info_share">Когда Вы соединены с контактом инкогнито, тот же самый инкогнито профиль будет использоваться для групп с этим контактом.</string>
|
||||
<string name="incognito_info_find">Чтобы найти инкогнито профиль, используемый в разговоре, нажмите на имя контакта или группы в верхней части чата.</string>
|
||||
<!-- Default themes -->
|
||||
<string name="theme_system">Системная</string>
|
||||
@@ -878,23 +889,23 @@
|
||||
<string name="full_deletion">Удаление для всех</string>
|
||||
<string name="voice_messages">Голосовые сообщения</string>
|
||||
<string name="feature_enabled">включено</string>
|
||||
<string name="feature_enabled_for_you">включено для вас</string>
|
||||
<string name="feature_enabled_for_you">включено для Вас</string>
|
||||
<string name="feature_enabled_for_contact">включено для контакта</string>
|
||||
<string name="feature_off">выключено</string>
|
||||
<string name="feature_received_prohibited">получено, не разрешено</string>
|
||||
<string name="allow_your_contacts_irreversibly_delete">Разрешить вашим контактам необратимо удалять отправленные сообщения.</string>
|
||||
<string name="allow_irreversible_message_deletion_only_if">Разрешить необратимое удаление сообщений, только если ваш контакт разрешает это вам.</string>
|
||||
<string name="contacts_can_mark_messages_for_deletion">Контакты могут помечать сообщения для удаления; вы сможете просмотреть их.</string>
|
||||
<string name="allow_your_contacts_to_send_voice_messages">Разрешить вашим контактам отправлять голосовые сообщения.</string>
|
||||
<string name="allow_voice_messages_only_if">Разрешить голосовые сообщения, только если их разрешает ваш контакт.</string>
|
||||
<string name="allow_your_contacts_irreversibly_delete">Разрешить Вашим контактам необратимо удалять отправленные сообщения.</string>
|
||||
<string name="allow_irreversible_message_deletion_only_if">Разрешить необратимое удаление сообщений, только если Ваш контакт разрешает это Вам.</string>
|
||||
<string name="contacts_can_mark_messages_for_deletion">Контакты могут помечать сообщения для удаления; Вы сможете просмотреть их.</string>
|
||||
<string name="allow_your_contacts_to_send_voice_messages">Разрешить Вашим контактам отправлять голосовые сообщения.</string>
|
||||
<string name="allow_voice_messages_only_if">Разрешить голосовые сообщения, только если их разрешает Ваш контакт.</string>
|
||||
<string name="prohibit_sending_voice_messages">Запретить отправлять голосовые сообщений.</string>
|
||||
<string name="both_you_and_your_contacts_can_delete">Вы и ваш контакт можете необратимо удалять отправленные сообщения.</string>
|
||||
<string name="only_you_can_delete_messages">Только вы можете необратимо удалять сообщения (ваш контакт может помечать их на удаление).</string>
|
||||
<string name="only_your_contact_can_delete">Только ваш контакт может необратимо удалять сообщения (вы можете помечать их на удаление).</string>
|
||||
<string name="both_you_and_your_contacts_can_delete">Вы и Ваш контакт можете необратимо удалять отправленные сообщения.</string>
|
||||
<string name="only_you_can_delete_messages">Только Вы можете необратимо удалять сообщения (Ваш контакт может помечать их на удаление).</string>
|
||||
<string name="only_your_contact_can_delete">Только Ваш контакт может необратимо удалять сообщения (Вы можете помечать их на удаление).</string>
|
||||
<string name="message_deletion_prohibited">Необратимое удаление сообщений запрещено в этой группе.</string>
|
||||
<string name="both_you_and_your_contact_can_send_voice">Вы и ваш контакт можете отправлять голосовые сообщения.</string>
|
||||
<string name="only_you_can_send_voice">Только вы можете отправлять голосовые сообщения.</string>
|
||||
<string name="only_your_contact_can_send_voice">Только ваш контакт может отправлять голосовые сообщения.</string>
|
||||
<string name="both_you_and_your_contact_can_send_voice">Вы и Ваш контакт можете отправлять голосовые сообщения.</string>
|
||||
<string name="only_you_can_send_voice">Только Вы можете отправлять голосовые сообщения.</string>
|
||||
<string name="only_your_contact_can_send_voice">Только Ваш контакт может отправлять голосовые сообщения.</string>
|
||||
<string name="voice_prohibited_in_this_chat">Голосовые сообщения запрещены в этом чате.</string>
|
||||
<string name="allow_direct_messages">Разрешить посылать прямые сообщения членам группы.</string>
|
||||
<string name="prohibit_direct_messages">Запретить посылать прямые сообщения членам группы.</string>
|
||||
@@ -937,18 +948,18 @@
|
||||
<string name="timed_messages">Исчезающие сообщения</string>
|
||||
<string name="view_security_code">Показать код безопасности</string>
|
||||
<string name="verify_security_code">Подтвердить код безопасности</string>
|
||||
<string name="both_you_and_your_contact_can_send_disappearing">Вы и ваш контакт можете отправлять исчезающие сообщения.</string>
|
||||
<string name="only_you_can_send_disappearing">Только вы можете отправлять исчезающие сообщения.</string>
|
||||
<string name="only_your_contact_can_send_disappearing">Только ваш контакт может отправлять исчезающие сообщения.</string>
|
||||
<string name="both_you_and_your_contact_can_send_disappearing">Вы и Ваш контакт можете отправлять исчезающие сообщения.</string>
|
||||
<string name="only_you_can_send_disappearing">Только Вы можете отправлять исчезающие сообщения.</string>
|
||||
<string name="only_your_contact_can_send_disappearing">Только Ваш контакт может отправлять исчезающие сообщения.</string>
|
||||
<string name="disappearing_prohibited_in_this_chat">Исчезающие сообщения запрещены в этом чате.</string>
|
||||
<string name="allow_to_send_disappearing">Разрешить посылать исчезающие сообщения.</string>
|
||||
<string name="contact_developers">Пожалуйста, обновите приложение и свяжитесь с разработчиками.</string>
|
||||
<string name="allow_your_contacts_to_send_disappearing_messages">Разрешить вашим контактам отправлять исчезающие сообщения.</string>
|
||||
<string name="allow_your_contacts_to_send_disappearing_messages">Разрешить Вашим контактам отправлять исчезающие сообщения.</string>
|
||||
<string name="failed_to_parse_chat_title">Не удалось открыть чат</string>
|
||||
<string name="failed_to_parse_chats_title">Не удалось открыть чаты</string>
|
||||
<string name="incorrect_code">Неправильный код безопасности!</string>
|
||||
<string name="scan_code">Сканировать код</string>
|
||||
<string name="send_live_message_desc">Отправить живое сообщение — оно будет обновляться для получателей по мере того, как вы его вводите</string>
|
||||
<string name="send_live_message_desc">Отправить живое сообщение — оно будет обновляться для получателей по мере того, как Вы его вводите</string>
|
||||
<string name="create_group_link">Создать ссылку группы</string>
|
||||
<string name="prohibit_sending_disappearing_messages">Запретить отправлять исчезающие сообщения.</string>
|
||||
<string name="disappearing_messages_are_prohibited">Исчезающие сообщения запрещены в этой группе.</string>
|
||||
@@ -956,13 +967,13 @@
|
||||
<string name="ttl_d">%dд</string>
|
||||
<string name="ttl_weeks">%d нед.</string>
|
||||
<string name="ttl_days">%d дней</string>
|
||||
<string name="to_verify_compare">Чтобы подтвердить безопасность end-to-end шифрования с вашим контактом сравните (или сканируйте) код на ваших устройствах.</string>
|
||||
<string name="to_verify_compare">Чтобы подтвердить безопасность end-to-end шифрования с Вашим контактом сравните (или сканируйте) код на ваших устройствах.</string>
|
||||
<string name="is_verified">%s подтверждён</string>
|
||||
<string name="is_not_verified">%s не подтверждён</string>
|
||||
<string name="security_code">Код безопасности</string>
|
||||
<string name="mark_code_verified">Подтвердить</string>
|
||||
<string name="clear_verification">Сбросить подтверждение</string>
|
||||
<string name="allow_disappearing_messages_only_if">Разрешить исчезающие сообщения, только если ваш контакт разрешает их вам.</string>
|
||||
<string name="allow_disappearing_messages_only_if">Разрешить исчезающие сообщения, только если Ваш контакт разрешает их Вам.</string>
|
||||
<string name="prohibit_sending_disappearing">Запретить посылать исчезающие сообщения.</string>
|
||||
<string name="group_members_can_send_disappearing">Члены группы могут посылать исчезающие сообщения.</string>
|
||||
<string name="whats_new">Новые функции</string>
|
||||
@@ -980,9 +991,9 @@
|
||||
<string name="v4_4_disappearing_messages_desc">Отправленные сообщения будут удалены через заданное время.</string>
|
||||
<string name="v4_3_improved_server_configuration">Улучшенная конфигурация серверов</string>
|
||||
<string name="v4_4_live_messages">\"Живые\" сообщения</string>
|
||||
<string name="v4_4_live_messages_desc">Получатели видят их в то время как вы их набираете.</string>
|
||||
<string name="v4_4_live_messages_desc">Получатели видят их в то время как Вы их набираете.</string>
|
||||
<string name="v4_4_verify_connection_security">Проверить безопасность соединения</string>
|
||||
<string name="v4_4_verify_connection_security_desc">Сравните код безопасности с вашими контактами.</string>
|
||||
<string name="v4_4_verify_connection_security_desc">Сравните код безопасности с Вашими контактами.</string>
|
||||
<string name="invalid_chat">ошибка чата</string>
|
||||
<string name="accept_feature">Принять</string>
|
||||
<string name="accept_feature_set_1_day">Установить 1 день</string>
|
||||
@@ -1006,24 +1017,24 @@
|
||||
<string name="files_and_media_section">Файлы и медиа</string>
|
||||
<string name="users_delete_data_only">Только локальные данные профиля</string>
|
||||
<string name="messages_section_title">Сообщения</string>
|
||||
<string name="smp_servers_per_user">Серверы для новых соединений вашего текущего профиля чата</string>
|
||||
<string name="smp_servers_per_user">Серверы для новых соединений Вашего текущего профиля чата</string>
|
||||
<string name="your_chat_profiles">Ваши профили чата</string>
|
||||
<string name="users_delete_all_chats_deleted">Все чаты и сообщения будут удалены - это нельзя отменить!</string>
|
||||
<string name="app_version_code">Сборка приложения: %s</string>
|
||||
<string name="app_version_name">Версия приложения: v%s</string>
|
||||
<string name="network_session_mode_entity_description">Отдельное TCP-соединение (и авторизация SOCKS) будет использоваться <b>для каждого контакта и члена группы</b>.
|
||||
\n<b>Обратите внимание</b>: если у вас много контактов, потребление батареи и трафика может быть значительно выше, и некоторые соединения могут не работать.</string>
|
||||
<string name="network_session_mode_user_description">Отдельное TCP-соединение (и авторизация SOCKS) будет использоваться <b>для каждого профиля чата, который вы имеете в приложении</b>.</string>
|
||||
\n<b>Обратите внимание</b>: если у Вас много контактов, потребление батареи и трафика может быть значительно выше, и некоторые соединения могут не работать.</string>
|
||||
<string name="network_session_mode_user_description">Отдельное TCP-соединение (и авторизация SOCKS) будет использоваться <b>для каждого профиля чата, который Вы имеете в приложении</b>.</string>
|
||||
<string name="core_build_timestamp">Ядро скомпилировано: %s</string>
|
||||
<string name="core_version">Версия ядра: v%s</string>
|
||||
<string name="users_delete_question">Удалить профиль чата\?</string>
|
||||
<string name="users_delete_profile_for">Удалить профиль чата для</string>
|
||||
<string name="messages_section_description">Эта настройка применяется к сообщениям в вашем текущем профиле чата</string>
|
||||
<string name="messages_section_description">Эта настройка применяется к сообщениям в Вашем текущем профиле чата</string>
|
||||
<string name="network_session_mode_transport_isolation">Отдельные сессии для</string>
|
||||
<string name="update_network_session_mode_question">Обновить режим отдельных сессий\?</string>
|
||||
<string name="failed_to_create_user_duplicate_title">Имя профиля уже используется</string>
|
||||
<string name="failed_to_create_user_title">Ошибка создания профиля!</string>
|
||||
<string name="failed_to_create_user_duplicate_desc">У вас уже есть профиль с таким именем. Пожалуйста, выберите другое имя.</string>
|
||||
<string name="failed_to_create_user_duplicate_desc">У Вас уже есть профиль с таким именем. Пожалуйста, выберите другое имя.</string>
|
||||
<string name="failed_to_active_user_title">Ошибка выбора профиля!</string>
|
||||
<string name="v4_5_transport_isolation_descr">По профилю чата или по соединению (БЕТА)</string>
|
||||
<string name="v4_4_french_interface_descr">Благодаря пользователям – добавьте переводы через Weblate!</string>
|
||||
@@ -1034,7 +1045,7 @@
|
||||
<string name="v4_5_message_draft_descr">Сохранить последний черновик, вместе с вложениями.</string>
|
||||
<string name="v4_5_private_filenames">Защищенные имена файлов</string>
|
||||
<string name="v4_5_italian_interface_descr">Благодаря пользователям – добавьте переводы через Weblate!</string>
|
||||
<string name="v4_5_private_filenames_descr">Чтобы защитить ваш часовой пояс, файлы картинок и голосовых сообщений используют UTC.</string>
|
||||
<string name="v4_5_private_filenames_descr">Чтобы защитить Ваш часовой пояс, файлы картинок и голосовых сообщений используют UTC.</string>
|
||||
<string name="v4_4_french_interface">Французский интерфейс</string>
|
||||
<string name="v4_5_reduced_battery_usage_descr">Дополнительные улучшения скоро!</string>
|
||||
<string name="v4_5_reduced_battery_usage">Уменьшенное потребление батареи</string>
|
||||
@@ -1085,7 +1096,7 @@
|
||||
<string name="v4_6_group_moderation_descr">Теперь админы могут:
|
||||
\n- удалять сообщения членов.
|
||||
\n- приостанавливать членов (роль \"наблюдатель\")</string>
|
||||
<string name="v4_6_hidden_chat_profiles_descr">Защитите ваши профили чата паролем!</string>
|
||||
<string name="v4_6_hidden_chat_profiles_descr">Защитите Ваши профили чата паролем!</string>
|
||||
<string name="user_unhide">Раскрыть</string>
|
||||
<string name="v4_6_audio_video_calls_descr">Поддержка bluetooth и другие улучшения.</string>
|
||||
<string name="save_welcome_message_question">Сохранить приветственное сообщение\?</string>
|
||||
@@ -1094,4 +1105,40 @@
|
||||
<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>
|
||||
<string name="confirm_database_upgrades">Подтвердить обновление базы данных</string>
|
||||
<string name="database_downgrade">Откат базы данных</string>
|
||||
<string name="incompatible_database_version">Несовместимая версия базы данных</string>
|
||||
<string name="invalid_migration_confirmation">Ошибка подтверждения миграции</string>
|
||||
<string name="upgrade_and_open_chat">Обновить и открыть чат</string>
|
||||
<string name="show_dev_options">Показать:</string>
|
||||
<string name="database_migrations">Миграции: %s</string>
|
||||
<string name="mtr_error_no_down_migration">версия базы данных новее чем приложения, но нет миграции для отката: %s</string>
|
||||
<string name="mtr_error_different">разная миграция в приложении/базе данных: %s / %s</string>
|
||||
<string name="downgrade_and_open_chat">Откатить версию и открыть чат</string>
|
||||
<string name="database_downgrade_warning">Предупреждение: Вы можете потерять какие то данные!</string>
|
||||
<string name="cancel_file__question">Прекратить передачу файла\?</string>
|
||||
<string name="file_transfer_will_be_cancelled_warning">Передача файла будет прекращена. Если она в процессе, она будет остановлена.</string>
|
||||
<string name="developer_options">ID базы данных и опция Отдельные транспортные сессии.</string>
|
||||
<string name="show_developer_options">Показать опции для девелоперов</string>
|
||||
<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>
|
||||
<string name="icon_descr_video_snd_complete">Видео отправлено</string>
|
||||
<string name="icon_descr_waiting_for_video">Ожидание видео</string>
|
||||
<string name="waiting_for_video">Ожидание видео</string>
|
||||
<string name="video_will_be_received_when_contact_completes_uploading">Видео будет получено когда Ваш контакт загрузит его.</string>
|
||||
<string name="hide_dev_options">Скрыть:</string>
|
||||
<string name="settings_section_title_experimenta">ЭКСПЕРИМЕНТАЛЬНЫЕ</string>
|
||||
<string name="videos_limit_desc">Только 10 видео могут быть отправлены одновременно</string>
|
||||
<string name="unhide_profile">Раскрыть профиль</string>
|
||||
<string name="video_will_be_received_when_contact_is_online">Видео будет получено, когда Ваш контакт будет онлайн, пожалуйста, подождите или проверьте позже!</string>
|
||||
<string name="unhide_chat_profile">Раскрыть профиль чата</string>
|
||||
</resources>
|
||||
@@ -1012,7 +1012,7 @@
|
||||
<string name="save_welcome_message_question">保存欢迎信息?</string>
|
||||
<string name="tap_to_activate_profile">点击以激活个人资料。</string>
|
||||
<string name="should_be_at_least_one_profile">应该至少有一个用户资料。</string>
|
||||
<string name="user_unhide">解除隐藏</string>
|
||||
<string name="user_unhide">取消隐藏</string>
|
||||
<string name="v4_6_group_welcome_message_descr">设置向新成员显示的消息!</string>
|
||||
<string name="v4_6_audio_video_calls_descr">支持蓝牙和其他改进。</string>
|
||||
<string name="v4_6_chinese_spanish_interface_descr">感谢用户——通过 Weblate 做出贡献!</string>
|
||||
@@ -1022,4 +1022,40 @@
|
||||
<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>
|
||||
<string name="mtr_error_different">应用程序/数据库中的不同迁移:%s / %s</string>
|
||||
<string name="developer_options">数据库 ID 和传输隔离选项。</string>
|
||||
<string name="database_downgrade">数据库降级</string>
|
||||
<string name="mtr_error_no_down_migration">数据库版本比应用程序更新,但无法降级迁移:%s</string>
|
||||
<string name="downgrade_and_open_chat">降级并打开聊天</string>
|
||||
<string name="hide_dev_options">隐藏:</string>
|
||||
<string name="file_will_be_received_when_contact_completes_uploading">文件将在您的联系人完成上传后收到。</string>
|
||||
<string name="incompatible_database_version">数据库版本不兼容</string>
|
||||
<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>
|
||||
<string name="show_dev_options">显示:</string>
|
||||
<string name="delete_profile">删除个人资料</string>
|
||||
<string name="profile_password">个人资料密码</string>
|
||||
<string name="unhide_chat_profile">取消隐藏聊天资料</string>
|
||||
<string name="cancel_file__question">取消文件传输?</string>
|
||||
<string name="delete_chat_profile">删除聊天资料</string>
|
||||
<string name="unhide_profile">取消隐藏个人资料</string>
|
||||
<string name="file_transfer_will_be_cancelled_warning">文件传输将被取消。文件传输将被终止如果它正在进行中。</string>
|
||||
<string name="videos_limit_desc">同一时间只能发送10个视频</string>
|
||||
<string name="videos_limit_title">过多视频!</string>
|
||||
<string name="video_descr">视频</string>
|
||||
<string name="icon_descr_waiting_for_video">等待视频中</string>
|
||||
<string name="video_will_be_received_when_contact_is_online">视频将在您的联系人在线时收到,请稍等或稍后查看!</string>
|
||||
<string name="waiting_for_video">等待视频中</string>
|
||||
<string name="icon_descr_video_snd_complete">视频已发送</string>
|
||||
<string name="icon_descr_video_asked_to_receive">要求接收视频</string>
|
||||
<string name="video_will_be_received_when_contact_completes_uploading">视频将在您的联系人完成上传后收到。</string>
|
||||
</resources>
|
||||
@@ -1026,4 +1026,5 @@
|
||||
<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>
|
||||
</resources>
|
||||
@@ -227,7 +227,9 @@
|
||||
<string name="icon_descr_cancel_image_preview">Cancel image preview</string>
|
||||
<string name="icon_descr_cancel_file_preview">Cancel file preview</string>
|
||||
<string name="images_limit_title">Too many images!</string>
|
||||
<string name="videos_limit_title">Too many videos!</string>
|
||||
<string name="images_limit_desc">Only 10 images can be sent at the same time</string>
|
||||
<string name="videos_limit_desc">Only 10 videos can be sent at the same time</string>
|
||||
<string name="image_decoding_exception_title">Decoding error</string>
|
||||
<string name="image_decoding_exception_desc">The image cannot be decoded. Please, try a different image or contact developers.</string>
|
||||
<string name="you_are_observer">you are observer</string>
|
||||
@@ -244,6 +246,15 @@
|
||||
<string name="image_will_be_received_when_contact_is_online">Image will be received when your contact is online, please wait or check later!</string>
|
||||
<string name="image_saved">Image saved to Gallery</string>
|
||||
|
||||
<!-- Videos - chat.simplex.app.views.chat.item.CIVideoView.kt -->
|
||||
<string name="video_descr">Video</string>
|
||||
<string name="icon_descr_waiting_for_video">Waiting for video</string>
|
||||
<string name="icon_descr_video_asked_to_receive">Asked to receive the video</string>
|
||||
<string name="icon_descr_video_snd_complete">Video sent</string>
|
||||
<string name="waiting_for_video">Waiting for video</string>
|
||||
<string name="video_will_be_received_when_contact_completes_uploading">Video will be received when your contact completes uploading it.</string>
|
||||
<string name="video_will_be_received_when_contact_is_online">Video will be received when your contact is online, please wait or check later!</string>
|
||||
|
||||
<!-- Files - CIFileView.kt -->
|
||||
<string name="icon_descr_file">File</string>
|
||||
<string name="large_file">Large file!</string>
|
||||
@@ -725,7 +736,7 @@
|
||||
<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 files via XFTP</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 -->
|
||||
|
||||
@@ -40,7 +40,8 @@ class AudioRecorder {
|
||||
AVEncoderBitRateKey: 12000,
|
||||
AVNumberOfChannelsKey: 1
|
||||
]
|
||||
audioRecorder = try AVAudioRecorder(url: getAppFilePath(fileName), settings: settings)
|
||||
let url = getAppFilePath(fileName)
|
||||
audioRecorder = try AVAudioRecorder(url: url, settings: settings)
|
||||
audioRecorder?.record(forDuration: MAX_VOICE_MESSAGE_LENGTH)
|
||||
|
||||
await MainActor.run {
|
||||
@@ -102,7 +103,8 @@ class AudioPlayer: NSObject, AVAudioPlayerDelegate {
|
||||
}
|
||||
|
||||
func start(fileName: String) {
|
||||
audioPlayer = try? AVAudioPlayer(contentsOf: getAppFilePath(fileName))
|
||||
let url = getAppFilePath(fileName)
|
||||
audioPlayer = try? AVAudioPlayer(contentsOf: url)
|
||||
audioPlayer?.delegate = self
|
||||
audioPlayer?.prepareToPlay()
|
||||
audioPlayer?.play()
|
||||
|
||||
@@ -33,8 +33,6 @@ final class ChatModel: ObservableObject {
|
||||
// items in the terminal view
|
||||
@Published var terminalItems: [TerminalItem] = []
|
||||
@Published var userAddress: UserContactLink?
|
||||
@Published var userSMPServers: [ServerCfg]?
|
||||
@Published var presetSMPServers: [String]?
|
||||
@Published var chatItemTTL: ChatItemTTL = .none
|
||||
@Published var appOpenUrl: URL?
|
||||
@Published var deviceToken: DeviceToken?
|
||||
@@ -55,13 +53,13 @@ final class ChatModel: ObservableObject {
|
||||
// currently showing QR code
|
||||
@Published var connReqInv: String?
|
||||
// audio recording and playback
|
||||
@Published var stopPreviousRecPlay: Bool = false // value is not taken into account, only the fact it switches
|
||||
@Published var stopPreviousRecPlay: URL? = nil // coordinates currently playing source
|
||||
@Published var draft: ComposeState?
|
||||
@Published var draftChatId: String?
|
||||
|
||||
var messageDelivery: Dictionary<Int64, () -> Void> = [:]
|
||||
|
||||
var filesToDelete: [String] = []
|
||||
var filesToDelete: Set<URL> = []
|
||||
|
||||
static let shared = ChatModel()
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
import Foundation
|
||||
import SimpleXChat
|
||||
import SwiftUI
|
||||
import AVKit
|
||||
|
||||
func getLoadedFilePath(_ file: CIFile?) -> String? {
|
||||
if let fileName = getLoadedFileName(file) {
|
||||
@@ -42,6 +43,17 @@ func getLoadedImage(_ file: CIFile?) -> UIImage? {
|
||||
return nil
|
||||
}
|
||||
|
||||
func getLoadedVideo(_ file: CIFile?) -> URL? {
|
||||
let loadedFilePath = getLoadedFilePath(file)
|
||||
if loadedFilePath != nil, let fileName = file?.filePath {
|
||||
let filePath = getAppFilePath(fileName)
|
||||
if FileManager.default.fileExists(atPath: filePath.path) {
|
||||
return filePath
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func saveAnimImage(_ image: UIImage) -> String? {
|
||||
let fileName = generateNewFileName("IMG", "gif")
|
||||
guard let imageData = image.imageData else { return nil }
|
||||
@@ -164,6 +176,20 @@ func saveFileFromURL(_ url: URL) -> String? {
|
||||
return savedFile
|
||||
}
|
||||
|
||||
func saveFileFromURLWithoutLoad(_ url: URL) -> String? {
|
||||
let savedFile: String?
|
||||
do {
|
||||
let fileName = uniqueCombine(url.lastPathComponent)
|
||||
try FileManager.default.moveItem(at: url, to: getAppFilePath(fileName))
|
||||
ChatModel.shared.filesToDelete.remove(url)
|
||||
savedFile = fileName
|
||||
} catch {
|
||||
logger.error("FileUtils.saveFileFromURLWithoutLoad error: \(error.localizedDescription)")
|
||||
savedFile = nil
|
||||
}
|
||||
return savedFile
|
||||
}
|
||||
|
||||
func generateNewFileName(_ prefix: String, _ ext: String) -> String {
|
||||
uniqueCombine("\(prefix)_\(getTimestamp()).\(ext)")
|
||||
}
|
||||
@@ -204,6 +230,18 @@ private func dropPrefix(_ s: String, _ prefix: String) -> String {
|
||||
s.hasPrefix(prefix) ? String(s.dropFirst(prefix.count)) : s
|
||||
}
|
||||
|
||||
extension AVAsset {
|
||||
func generatePreview() -> (UIImage, Int)? {
|
||||
let generator = AVAssetImageGenerator(asset: self)
|
||||
generator.appliesPreferredTrackTransform = true
|
||||
var actualTime = CMTimeMake(value: 0, timescale: 0)
|
||||
if let image = try? generator.copyCGImage(at: CMTimeMakeWithSeconds(0.0, preferredTimescale: 1), actualTime: &actualTime) {
|
||||
return (UIImage(cgImage: image), Int(duration.seconds))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
extension UIImage {
|
||||
func replaceColor(_ from: UIColor, _ to: UIColor) -> UIImage {
|
||||
if let cgImage = cgImage {
|
||||
|
||||
@@ -391,30 +391,22 @@ func apiDeleteToken(token: DeviceToken) async throws {
|
||||
try await sendCommandOkResp(.apiDeleteToken(token: token))
|
||||
}
|
||||
|
||||
func getUserSMPServers() throws -> ([ServerCfg], [String]) {
|
||||
let userId = try currentUserId("getUserSMPServers")
|
||||
return try userSMPServersResponse(chatSendCmdSync(.apiGetUserSMPServers(userId: userId)))
|
||||
}
|
||||
|
||||
func getUserSMPServersAsync() async throws -> ([ServerCfg], [String]) {
|
||||
let userId = try currentUserId("getUserSMPServersAsync")
|
||||
return try userSMPServersResponse(await chatSendCmd(.apiGetUserSMPServers(userId: userId)))
|
||||
}
|
||||
|
||||
private func userSMPServersResponse(_ r: ChatResponse) throws -> ([ServerCfg], [String]) {
|
||||
if case let .userSMPServers(_, smpServers, presetServers) = r { return (smpServers, presetServers) }
|
||||
func getUserProtoServers(_ serverProtocol: ServerProtocol) throws -> UserProtoServers {
|
||||
let userId = try currentUserId("getUserProtoServers")
|
||||
let r = chatSendCmdSync(.apiGetUserProtoServers(userId: userId, serverProtocol: serverProtocol))
|
||||
if case let .userProtoServers(_, servers) = r { return servers }
|
||||
throw r
|
||||
}
|
||||
|
||||
func setUserSMPServers(smpServers: [ServerCfg]) async throws {
|
||||
let userId = try currentUserId("setUserSMPServers")
|
||||
try await sendCommandOkResp(.apiSetUserSMPServers(userId: userId, smpServers: smpServers))
|
||||
func setUserProtoServers(_ serverProtocol: ServerProtocol, servers: [ServerCfg]) async throws {
|
||||
let userId = try currentUserId("setUserProtoServers")
|
||||
try await sendCommandOkResp(.apiSetUserProtoServers(userId: userId, serverProtocol: serverProtocol, servers: servers))
|
||||
}
|
||||
|
||||
func testSMPServer(smpServer: String) async throws -> Result<(), SMPTestFailure> {
|
||||
let userId = try currentUserId("testSMPServer")
|
||||
let r = await chatSendCmd(.apiTestSMPServer(userId: userId, smpServer: smpServer))
|
||||
if case let .smpTestResult(_, testFailure) = r {
|
||||
func testProtoServer(server: String) async throws -> Result<(), ProtocolTestFailure> {
|
||||
let userId = try currentUserId("testProtoServer")
|
||||
let r = await chatSendCmd(.apiTestProtoServer(userId: userId, server: server))
|
||||
if case let .serverTestResult(_, _, testFailure) = r {
|
||||
if let t = testFailure {
|
||||
return .failure(t)
|
||||
}
|
||||
@@ -1098,7 +1090,6 @@ func changeActiveUserAsync_(_ userId: Int64, viewPwd: String?) async throws {
|
||||
func getUserChatData() throws {
|
||||
let m = ChatModel.shared
|
||||
m.userAddress = try apiGetUserAddress()
|
||||
(m.userSMPServers, m.presetSMPServers) = try getUserSMPServers()
|
||||
m.chatItemTTL = try getChatItemTTL()
|
||||
let chats = try apiGetChats()
|
||||
m.chats = chats.map { Chat.init($0) }
|
||||
@@ -1106,13 +1097,11 @@ func getUserChatData() throws {
|
||||
|
||||
private func getUserChatDataAsync() async throws {
|
||||
let userAddress = try await apiGetUserAddressAsync()
|
||||
let servers = try await getUserSMPServersAsync()
|
||||
let chatItemTTL = try await getChatItemTTLAsync()
|
||||
let chats = try await apiGetChatsAsync()
|
||||
await MainActor.run {
|
||||
let m = ChatModel.shared
|
||||
m.userAddress = userAddress
|
||||
(m.userSMPServers, m.presetSMPServers) = servers
|
||||
m.chatItemTTL = chatItemTTL
|
||||
m.chats = chats.map { Chat.init($0) }
|
||||
}
|
||||
@@ -1359,6 +1348,12 @@ func processReceivedMsg(_ res: ChatResponse) async {
|
||||
chatItemSimpleUpdate(user, aChatItem)
|
||||
case let .sndFileCompleteXFTP(user, aChatItem, _):
|
||||
chatItemSimpleUpdate(user, aChatItem)
|
||||
let cItem = aChatItem.chatItem
|
||||
let mc = cItem.content.msgContent
|
||||
if case .file = mc,
|
||||
let fileName = cItem.file?.filePath {
|
||||
removeFile(fileName)
|
||||
}
|
||||
case let .callInvitation(invitation):
|
||||
m.callInvitations[invitation.contact.id] = invitation
|
||||
activateCall(invitation)
|
||||
|
||||
@@ -24,7 +24,7 @@ struct CIImageView: View {
|
||||
if let uiImage = getLoadedImage(file) {
|
||||
imageView(uiImage)
|
||||
.fullScreenCover(isPresented: $showFullScreenImage) {
|
||||
FullScreenImageView(chatItem: chatItem, image: uiImage, showView: $showFullScreenImage, scrollProxy: scrollProxy)
|
||||
FullScreenMediaView(chatItem: chatItem, image: uiImage, showView: $showFullScreenImage, scrollProxy: scrollProxy)
|
||||
}
|
||||
.onTapGesture { showFullScreenImage = true }
|
||||
} else if let data = Data(base64Encoded: dropImagePrefix(image)),
|
||||
@@ -90,29 +90,27 @@ struct CIImageView: View {
|
||||
case .xftp: progressView()
|
||||
case .smp: EmptyView()
|
||||
}
|
||||
case .sndTransfer:
|
||||
progressView()
|
||||
case .sndComplete:
|
||||
Image(systemName: "checkmark")
|
||||
.resizable()
|
||||
.aspectRatio(contentMode: .fit)
|
||||
.frame(width: 10, height: 10)
|
||||
.foregroundColor(.white)
|
||||
.padding(13)
|
||||
case .rcvAccepted:
|
||||
Image(systemName: "ellipsis")
|
||||
.resizable()
|
||||
.aspectRatio(contentMode: .fit)
|
||||
.frame(width: 14, height: 14)
|
||||
.foregroundColor(.white)
|
||||
.padding(11)
|
||||
case .rcvTransfer:
|
||||
progressView()
|
||||
case .sndTransfer: progressView()
|
||||
case .sndComplete: fileIcon("checkmark", 10, 13)
|
||||
case .sndCancelled: 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)
|
||||
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)
|
||||
|
||||
@@ -0,0 +1,334 @@
|
||||
//
|
||||
// CIVideoView.swift
|
||||
// SimpleX
|
||||
//
|
||||
// Created by Avently on 30/03/2023.
|
||||
// Copyright © 2023 SimpleX Chat. All rights reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import AVKit
|
||||
import SimpleXChat
|
||||
|
||||
struct CIVideoView: View {
|
||||
@Environment(\.colorScheme) var colorScheme
|
||||
private let chatItem: ChatItem
|
||||
private let image: String
|
||||
@State private var duration: Int
|
||||
@State private var progress: Int = 0
|
||||
@State private var videoPlaying: Bool = false
|
||||
private let maxWidth: CGFloat
|
||||
@Binding private var videoWidth: CGFloat?
|
||||
@State private var scrollProxy: ScrollViewProxy?
|
||||
@State private var preview: UIImage? = nil
|
||||
@State private var player: AVPlayer?
|
||||
@State private var url: URL?
|
||||
@State private var showFullScreenPlayer = false
|
||||
@State private var timeObserver: Any? = nil
|
||||
@State private var fullScreenTimeObserver: Any? = nil
|
||||
|
||||
init(chatItem: ChatItem, image: String, duration: Int, maxWidth: CGFloat, videoWidth: Binding<CGFloat?>, scrollProxy: ScrollViewProxy?) {
|
||||
self.chatItem = chatItem
|
||||
self.image = image
|
||||
self._duration = State(initialValue: duration)
|
||||
self.maxWidth = maxWidth
|
||||
self._videoWidth = videoWidth
|
||||
self.scrollProxy = scrollProxy
|
||||
if let url = getLoadedVideo(chatItem.file) {
|
||||
self._player = State(initialValue: VideoPlayerView.getOrCreatePlayer(url, false))
|
||||
self._url = State(initialValue: url)
|
||||
}
|
||||
if let data = Data(base64Encoded: dropImagePrefix(image)),
|
||||
let uiImage = UIImage(data: data) {
|
||||
self._preview = State(initialValue: uiImage)
|
||||
}
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
let file = chatItem.file
|
||||
ZStack {
|
||||
ZStack(alignment: .topLeading) {
|
||||
if let file = file, let preview = preview, let player = player, let url = url {
|
||||
videoView(player, url, file, preview, duration)
|
||||
} else if let data = Data(base64Encoded: dropImagePrefix(image)),
|
||||
let uiImage = UIImage(data: data) {
|
||||
imageView(uiImage)
|
||||
.onTapGesture {
|
||||
if let file = file {
|
||||
switch file.fileStatus {
|
||||
case .rcvInvitation:
|
||||
receiveFileIfValidSize(file: file, receiveFile: receiveFile)
|
||||
case .rcvAccepted:
|
||||
switch file.fileProtocol {
|
||||
case .xftp:
|
||||
AlertManager.shared.showAlertMsg(
|
||||
title: "Waiting for video",
|
||||
message: "Video will be received when your contact completes uploading it."
|
||||
)
|
||||
case .smp:
|
||||
AlertManager.shared.showAlertMsg(
|
||||
title: "Waiting for video",
|
||||
message: "Video will be received when your contact is online, please wait or check later!"
|
||||
)
|
||||
}
|
||||
case .rcvTransfer: () // ?
|
||||
case .rcvComplete: () // ?
|
||||
case .rcvCancelled: () // TODO
|
||||
default: ()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
durationProgress()
|
||||
}
|
||||
if let file = file, case .rcvInvitation = file.fileStatus {
|
||||
Button {
|
||||
receiveFileIfValidSize(file: file, receiveFile: receiveFile)
|
||||
} label: {
|
||||
playPauseIcon("play.fill")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func videoView(_ player: AVPlayer, _ url: URL, _ file: CIFile, _ preview: UIImage, _ duration: Int) -> some View {
|
||||
let w = preview.size.width <= preview.size.height ? maxWidth * 0.75 : maxWidth
|
||||
DispatchQueue.main.async { videoWidth = w }
|
||||
return ZStack(alignment: .topTrailing) {
|
||||
ZStack(alignment: .center) {
|
||||
VideoPlayerView(player: player, url: url, showControls: false)
|
||||
.frame(width: w, height: w * preview.size.height / preview.size.width)
|
||||
.onChange(of: ChatModel.shared.stopPreviousRecPlay) { playingUrl in
|
||||
if playingUrl != url {
|
||||
player.pause()
|
||||
videoPlaying = false
|
||||
}
|
||||
}
|
||||
.fullScreenCover(isPresented: $showFullScreenPlayer) {
|
||||
fullScreenPlayer(url)
|
||||
}
|
||||
.onTapGesture {
|
||||
switch player.timeControlStatus {
|
||||
case .playing:
|
||||
player.pause()
|
||||
videoPlaying = false
|
||||
case .paused:
|
||||
showFullScreenPlayer = true
|
||||
default: ()
|
||||
}
|
||||
}
|
||||
if !videoPlaying {
|
||||
Button {
|
||||
ChatModel.shared.stopPreviousRecPlay = url
|
||||
player.play()
|
||||
} label: {
|
||||
playPauseIcon("play.fill")
|
||||
}
|
||||
}
|
||||
}
|
||||
loadingIndicator()
|
||||
}
|
||||
.onAppear {
|
||||
addObserver(player, url)
|
||||
}
|
||||
.onDisappear {
|
||||
removeObserver()
|
||||
player.pause()
|
||||
videoPlaying = false
|
||||
}
|
||||
}
|
||||
|
||||
private func playPauseIcon(_ image: String, _ color: Color = .white) -> some View {
|
||||
Image(systemName: image)
|
||||
.resizable()
|
||||
.aspectRatio(contentMode: .fit)
|
||||
.frame(width: 12, height: 12)
|
||||
.foregroundColor(color)
|
||||
.padding(.leading, 4)
|
||||
.frame(width: 40, height: 40)
|
||||
.background(Color.black.opacity(0.35))
|
||||
.clipShape(Circle())
|
||||
}
|
||||
|
||||
private func durationProgress() -> some View {
|
||||
HStack {
|
||||
Text("\(durationText(videoPlaying ? progress : duration))")
|
||||
.foregroundColor(.white)
|
||||
.font(.caption)
|
||||
.padding(.vertical, 3)
|
||||
.padding(.horizontal, 6)
|
||||
.background(Color.black.opacity(0.35))
|
||||
.cornerRadius(10)
|
||||
.padding([.top, .leading], 6)
|
||||
|
||||
if let file = chatItem.file, !videoPlaying {
|
||||
Text("\(ByteCountFormatter.string(fromByteCount: file.fileSize, countStyle: .binary))")
|
||||
.foregroundColor(.white)
|
||||
.font(.caption)
|
||||
.padding(.vertical, 3)
|
||||
.padding(.horizontal, 6)
|
||||
.background(Color.black.opacity(0.35))
|
||||
.cornerRadius(10)
|
||||
.padding(.top, 6)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func imageView(_ img: UIImage) -> some View {
|
||||
let w = img.size.width <= img.size.height ? maxWidth * 0.75 : .infinity
|
||||
DispatchQueue.main.async { videoWidth = w }
|
||||
return ZStack(alignment: .topTrailing) {
|
||||
Image(uiImage: img)
|
||||
.resizable()
|
||||
.scaledToFit()
|
||||
.frame(maxWidth: w)
|
||||
loadingIndicator()
|
||||
}
|
||||
}
|
||||
|
||||
@ViewBuilder private func loadingIndicator() -> some View {
|
||||
if let file = chatItem.file {
|
||||
switch file.fileStatus {
|
||||
case .sndStored:
|
||||
switch file.fileProtocol {
|
||||
case .xftp: progressView()
|
||||
case .smp: EmptyView()
|
||||
}
|
||||
case let .sndTransfer(sndProgress, sndTotal):
|
||||
switch file.fileProtocol {
|
||||
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 let .rcvTransfer(rcvProgress, rcvTotal):
|
||||
if file.fileProtocol == .xftp && rcvProgress < rcvTotal {
|
||||
progressCircle(rcvProgress, rcvTotal)
|
||||
} else {
|
||||
progressView()
|
||||
}
|
||||
default: EmptyView()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func progressView() -> some View {
|
||||
ProgressView()
|
||||
.progressViewStyle(.circular)
|
||||
.frame(width: 16, height: 16)
|
||||
.tint(.white)
|
||||
.padding(11)
|
||||
}
|
||||
|
||||
private func progressCircle(_ progress: Int64, _ total: Int64) -> some View {
|
||||
Circle()
|
||||
.trim(from: 0, to: Double(progress) / Double(total))
|
||||
.stroke(
|
||||
Color(uiColor: .white),
|
||||
style: StrokeStyle(lineWidth: 2)
|
||||
)
|
||||
.rotationEffect(.degrees(-90))
|
||||
.frame(width: 16, height: 16)
|
||||
.padding([.trailing, .top], 11)
|
||||
}
|
||||
|
||||
private func receiveFileIfValidSize(file: CIFile, receiveFile: @escaping (User, Int64) async -> Void) {
|
||||
Task {
|
||||
if let user = ChatModel.shared.currentUser {
|
||||
await receiveFile(user, file.fileId)
|
||||
}
|
||||
// TODO image accepted alert?
|
||||
}
|
||||
}
|
||||
|
||||
private func fullScreenPlayer(_ url: URL) -> some View {
|
||||
ZStack {
|
||||
Color.black.edgesIgnoringSafeArea(.all)
|
||||
VideoPlayer(player: createFullScreenPlayerAndPlay(url)) {
|
||||
}
|
||||
.overlay(alignment: .topLeading, content: {
|
||||
Button(action: { showFullScreenPlayer = false },
|
||||
label: {
|
||||
Image(systemName: "multiply")
|
||||
.resizable()
|
||||
.tint(.white)
|
||||
.frame(width: 15, height: 15)
|
||||
.padding(.leading, 15)
|
||||
.padding(.top, 13)
|
||||
}
|
||||
)
|
||||
})
|
||||
.gesture(
|
||||
DragGesture(minimumDistance: 80)
|
||||
.onChanged { gesture in
|
||||
let t = gesture.translation
|
||||
let w = abs(t.width)
|
||||
if t.height > 60 && t.height > w * 2 {
|
||||
showFullScreenPlayer = false
|
||||
}
|
||||
}
|
||||
)
|
||||
.onDisappear {
|
||||
if let fullScreenTimeObserver = fullScreenTimeObserver {
|
||||
NotificationCenter.default.removeObserver(fullScreenTimeObserver)
|
||||
}
|
||||
fullScreenTimeObserver = nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func createFullScreenPlayerAndPlay(_ url: URL) -> AVPlayer {
|
||||
let player = AVPlayer(url: url)
|
||||
DispatchQueue.main.asyncAfter(deadline: .now()) {
|
||||
ChatModel.shared.stopPreviousRecPlay = url
|
||||
player.play()
|
||||
fullScreenTimeObserver = NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: player.currentItem, queue: .main) { _ in
|
||||
player.seek(to: CMTime.zero)
|
||||
player.play()
|
||||
}
|
||||
}
|
||||
return player
|
||||
}
|
||||
|
||||
private func addObserver(_ player: AVPlayer, _ url: URL) {
|
||||
timeObserver = player.addPeriodicTimeObserver(forInterval: CMTime(seconds: 0.01, preferredTimescale: CMTimeScale(NSEC_PER_SEC)), queue: .main) { time in
|
||||
if let item = player.currentItem {
|
||||
let dur = CMTimeGetSeconds(item.duration)
|
||||
if !dur.isInfinite && !dur.isNaN {
|
||||
duration = Int(dur)
|
||||
}
|
||||
progress = Int(CMTimeGetSeconds(player.currentTime()))
|
||||
// `if` prevents showing Play button while the playback seeks to start and then plays
|
||||
if player.currentTime() != player.currentItem?.duration && player.currentTime() != .zero {
|
||||
videoPlaying = player.timeControlStatus == .playing || player.timeControlStatus == .waitingToPlayAtSpecifiedRate
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func removeObserver() {
|
||||
if let timeObserver = timeObserver {
|
||||
player?.removeTimeObserver(timeObserver)
|
||||
}
|
||||
timeObserver = nil
|
||||
}
|
||||
}
|
||||
@@ -203,7 +203,7 @@ struct VoiceMessagePlayer: View {
|
||||
|
||||
private func startPlayback(_ recordingFileName: String) {
|
||||
startingPlayback = true
|
||||
chatModel.stopPreviousRecPlay.toggle()
|
||||
chatModel.stopPreviousRecPlay = getAppFilePath(recordingFileName)
|
||||
audioPlayer = AudioPlayer(
|
||||
onTimer: { playbackTime = $0 },
|
||||
onFinishPlayback: {
|
||||
|
||||
@@ -23,6 +23,7 @@ struct FramedItemView: View {
|
||||
@State var scrollProxy: ScrollViewProxy? = nil
|
||||
@State var msgWidth: CGFloat = 0
|
||||
@State var imgWidth: CGFloat? = nil
|
||||
@State var videoWidth: CGFloat? = nil
|
||||
@State var metaColor = Color.secondary
|
||||
@State var showFullScreenImage = false
|
||||
|
||||
@@ -64,7 +65,7 @@ struct FramedItemView: View {
|
||||
.overlay(DetermineWidth())
|
||||
}
|
||||
}
|
||||
.background(chatItemFrameColorMaybeImage(chatItem, colorScheme))
|
||||
.background(chatItemFrameColorMaybeImageOrVideo(chatItem, colorScheme))
|
||||
.cornerRadius(18)
|
||||
.onPreferenceChange(DetermineWidth.Key.self) { msgWidth = $0 }
|
||||
|
||||
@@ -103,6 +104,19 @@ struct FramedItemView: View {
|
||||
} else {
|
||||
ciMsgContentView (chatItem, showMember)
|
||||
}
|
||||
case let .video(text, image, duration):
|
||||
CIVideoView(chatItem: chatItem, image: image, duration: duration, maxWidth: maxWidth, videoWidth: $videoWidth, scrollProxy: scrollProxy)
|
||||
.overlay(DetermineWidth())
|
||||
if text == "" && !chatItem.meta.isLive {
|
||||
Color.clear
|
||||
.frame(width: 0, height: 0)
|
||||
.preference(
|
||||
key: MetaColorPreferenceKey.self,
|
||||
value: .white
|
||||
)
|
||||
} else {
|
||||
ciMsgContentView (chatItem, showMember)
|
||||
}
|
||||
case let .voice(text, duration):
|
||||
FramedCIVoiceView(chatItem: chatItem, recordingFile: chatItem.file, duration: duration)
|
||||
.overlay(DetermineWidth())
|
||||
@@ -152,8 +166,8 @@ struct FramedItemView: View {
|
||||
.overlay(DetermineWidth())
|
||||
.frame(minWidth: msgWidth, alignment: .leading)
|
||||
.background(chatItemFrameContextColor(chatItem, colorScheme))
|
||||
if let imgWidth = imgWidth, imgWidth < maxWidth {
|
||||
v.frame(maxWidth: imgWidth, alignment: .leading)
|
||||
if let mediaWidth = maxMediaWidth(), mediaWidth < maxWidth {
|
||||
v.frame(maxWidth: mediaWidth, alignment: .leading)
|
||||
} else {
|
||||
v
|
||||
}
|
||||
@@ -175,6 +189,19 @@ struct FramedItemView: View {
|
||||
} else {
|
||||
ciQuotedMsgView(qi)
|
||||
}
|
||||
case let .video(_, image, _):
|
||||
if let data = Data(base64Encoded: dropImagePrefix(image)),
|
||||
let uiImage = UIImage(data: data) {
|
||||
ciQuotedMsgView(qi)
|
||||
.padding(.trailing, 70).frame(minWidth: msgWidth, alignment: .leading)
|
||||
Image(uiImage: uiImage)
|
||||
.resizable()
|
||||
.aspectRatio(contentMode: .fill)
|
||||
.frame(width: 68, height: 68)
|
||||
.clipped()
|
||||
} else {
|
||||
ciQuotedMsgView(qi)
|
||||
}
|
||||
case .file:
|
||||
ciQuotedMsgView(qi)
|
||||
.padding(.trailing, 20).frame(minWidth: msgWidth, alignment: .leading)
|
||||
@@ -190,9 +217,9 @@ struct FramedItemView: View {
|
||||
.overlay(DetermineWidth())
|
||||
.frame(minWidth: msgWidth, alignment: .leading)
|
||||
.background(chatItemFrameContextColor(chatItem, colorScheme))
|
||||
|
||||
if let imgWidth = imgWidth, imgWidth < maxWidth {
|
||||
v.frame(maxWidth: imgWidth, alignment: .leading)
|
||||
|
||||
if let mediaWidth = maxMediaWidth(), mediaWidth < maxWidth {
|
||||
v.frame(maxWidth: mediaWidth, alignment: .leading)
|
||||
} else {
|
||||
v
|
||||
}
|
||||
@@ -243,9 +270,9 @@ struct FramedItemView: View {
|
||||
.overlay(DetermineWidth())
|
||||
.frame(minWidth: 0, alignment: .leading)
|
||||
.textSelection(.enabled)
|
||||
|
||||
if let imgWidth = imgWidth, imgWidth < maxWidth {
|
||||
v.frame(maxWidth: imgWidth, alignment: .leading)
|
||||
|
||||
if let mediaWidth = maxMediaWidth(), mediaWidth < maxWidth {
|
||||
v.frame(maxWidth: mediaWidth, alignment: .leading)
|
||||
} else {
|
||||
v
|
||||
}
|
||||
@@ -258,6 +285,16 @@ struct FramedItemView: View {
|
||||
ciMsgContentView (chatItem, showMember)
|
||||
}
|
||||
}
|
||||
|
||||
private func maxMediaWidth() -> CGFloat? {
|
||||
if let imgWidth = imgWidth, let videoWidth = videoWidth {
|
||||
return imgWidth > videoWidth ? imgWidth : videoWidth
|
||||
} else if let imgWidth = imgWidth {
|
||||
return imgWidth
|
||||
} else {
|
||||
return videoWidth
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func isRightToLeft(_ s: String) -> Bool {
|
||||
@@ -274,15 +311,17 @@ private struct MetaColorPreferenceKey: PreferenceKey {
|
||||
}
|
||||
}
|
||||
|
||||
func onlyImage(_ ci: ChatItem) -> Bool {
|
||||
func onlyImageOrVideo(_ ci: ChatItem) -> Bool {
|
||||
if case let .image(text, _) = ci.content.msgContent {
|
||||
return ci.meta.itemDeleted == nil && !ci.meta.isLive && ci.quotedItem == nil && text == ""
|
||||
} else if case let .video(text, _, _) = ci.content.msgContent {
|
||||
return ci.meta.itemDeleted == nil && !ci.meta.isLive && ci.quotedItem == nil && text == ""
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func chatItemFrameColorMaybeImage(_ ci: ChatItem, _ colorScheme: ColorScheme) -> Color {
|
||||
onlyImage(ci)
|
||||
func chatItemFrameColorMaybeImageOrVideo(_ ci: ChatItem, _ colorScheme: ColorScheme) -> Color {
|
||||
onlyImageOrVideo(ci)
|
||||
? Color.clear
|
||||
: chatItemFrameColor(ci, colorScheme)
|
||||
}
|
||||
|
||||
+69
-11
@@ -9,36 +9,61 @@
|
||||
import SwiftUI
|
||||
import SimpleXChat
|
||||
import SwiftyGif
|
||||
import AVKit
|
||||
|
||||
struct FullScreenImageView: View {
|
||||
struct FullScreenMediaView: View {
|
||||
@EnvironmentObject var m: ChatModel
|
||||
@State var chatItem: ChatItem
|
||||
@State var image: UIImage
|
||||
@State var image: UIImage?
|
||||
@State var player: AVPlayer? = nil
|
||||
@State var url: URL? = nil
|
||||
@Binding var showView: Bool
|
||||
@State var scrollProxy: ScrollViewProxy?
|
||||
@State private var showNext = false
|
||||
@State private var nextImage: UIImage?
|
||||
@State private var nextPlayer: AVPlayer?
|
||||
@State private var nextURL: URL?
|
||||
@State private var scrolling = false
|
||||
@State private var offset: CGFloat = 0
|
||||
@State private var nextOffset: CGFloat = 0
|
||||
|
||||
var body: some View {
|
||||
GeometryReader(content: imageScrollView)
|
||||
GeometryReader(content: mediaScrollView)
|
||||
}
|
||||
|
||||
func imageScrollView(_ g: GeometryProxy) -> some View {
|
||||
func mediaScrollView(_ g: GeometryProxy) -> some View {
|
||||
ZStack {
|
||||
Color.black.edgesIgnoringSafeArea(.all)
|
||||
if showNext, let nextImage = nextImage {
|
||||
imageView(image).offset(x: offset)
|
||||
if let image = image {
|
||||
imageView(image).offset(x: offset)
|
||||
} else if let player = player, let url = url {
|
||||
videoView(player, url).offset(x: offset)
|
||||
}
|
||||
imageView(nextImage).offset(x: offset + nextOffset)
|
||||
} else if showNext, let nextPlayer = nextPlayer, let nextURL = nextURL {
|
||||
if let image = image {
|
||||
imageView(image).offset(x: offset)
|
||||
} else if let player = player, let url = url {
|
||||
videoView(player, url).offset(x: offset)
|
||||
}
|
||||
videoView(nextPlayer, nextURL).offset(x: offset + nextOffset)
|
||||
} else {
|
||||
ZoomableScrollView {
|
||||
imageView(image)
|
||||
if let image = image {
|
||||
imageView(image)
|
||||
} else if let player = player, let url = url {
|
||||
videoView(player, url)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.onTapGesture { showView = false }
|
||||
.onAppear {
|
||||
startPlayerAndNotify()
|
||||
}
|
||||
.onDisappear {
|
||||
player?.pause()
|
||||
}
|
||||
.gesture(
|
||||
DragGesture(minimumDistance: 80)
|
||||
.onChanged { gesture in
|
||||
@@ -53,9 +78,17 @@ struct FullScreenImageView: View {
|
||||
let previous = t.width > 0
|
||||
scrolling = true
|
||||
if let item = m.nextChatItemData(chatItem.id, previous: previous, map: chatItemImage) {
|
||||
var img: UIImage
|
||||
(chatItem, img) = item
|
||||
var img: UIImage?
|
||||
var url: URL?
|
||||
(chatItem, img, url) = item
|
||||
nextImage = img
|
||||
nextPlayer?.pause()
|
||||
if let url = url {
|
||||
nextPlayer = VideoPlayerView.getOrCreatePlayer(url, true)
|
||||
} else {
|
||||
nextPlayer = nil
|
||||
}
|
||||
nextURL = url
|
||||
let s = g.size.width
|
||||
var toOffset: CGFloat
|
||||
(toOffset, nextOffset) = previous ? (s, -s) : (-s, s)
|
||||
@@ -65,6 +98,14 @@ struct FullScreenImageView: View {
|
||||
}
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
|
||||
image = img
|
||||
player?.pause()
|
||||
self.url = url
|
||||
if let url = url {
|
||||
player = VideoPlayerView.getOrCreatePlayer(url, true)
|
||||
startPlayerAndNotify()
|
||||
} else {
|
||||
player = nil
|
||||
}
|
||||
showNext = false
|
||||
offset = 0
|
||||
}
|
||||
@@ -87,13 +128,30 @@ struct FullScreenImageView: View {
|
||||
.scaledToFit()
|
||||
}
|
||||
}
|
||||
.onTapGesture { showView = false }
|
||||
}
|
||||
|
||||
private func chatItemImage(_ ci: ChatItem) -> (ChatItem, UIImage)? {
|
||||
private func videoView( _ player: AVPlayer, _ url: URL) -> some View {
|
||||
VideoPlayerView(player: player, url: url, showControls: true)
|
||||
}
|
||||
|
||||
private func chatItemImage(_ ci: ChatItem) -> (ChatItem, UIImage?, URL?)? {
|
||||
if case .image = ci.content.msgContent,
|
||||
let img = getLoadedImage(ci.file) {
|
||||
return (ci, img)
|
||||
return (ci, img, nil)
|
||||
}
|
||||
// Currently, video support in gallery is not enabled
|
||||
/*else if case .video = ci.content.msgContent,
|
||||
let url = getLoadedVideo(ci.file) {
|
||||
return (ci, nil, url)
|
||||
}*/
|
||||
return nil
|
||||
}
|
||||
|
||||
private func startPlayerAndNotify() {
|
||||
if let player = player {
|
||||
ChatModel.shared.stopPreviousRecPlay = url
|
||||
player.play()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -78,6 +78,7 @@ struct ChatView: View {
|
||||
if chatModel.chatId == nil { dismiss() }
|
||||
}
|
||||
.onDisappear {
|
||||
VideoPlayerView.players.removeAll()
|
||||
if chatModel.chatId == cInfo.id && !presentationMode.wrappedValue.isPresented {
|
||||
chatModel.chatId = nil
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.35) {
|
||||
|
||||
@@ -14,7 +14,7 @@ import PhotosUI
|
||||
enum ComposePreview {
|
||||
case noPreview
|
||||
case linkPreview(linkPreview: LinkPreview?)
|
||||
case imagePreviews(imagePreviews: [(String, UploadContent?)])
|
||||
case mediaPreviews(mediaPreviews: [(String, UploadContent?)])
|
||||
case voicePreview(recordingFileName: String, duration: Int)
|
||||
case filePreview(fileName: String, file: URL)
|
||||
}
|
||||
@@ -105,7 +105,7 @@ struct ComposeState {
|
||||
|
||||
var sendEnabled: Bool {
|
||||
switch preview {
|
||||
case .imagePreviews: return true
|
||||
case .mediaPreviews: return true
|
||||
case .voicePreview: return voiceMessageRecordingState == .finished
|
||||
case .filePreview: return true
|
||||
default: return !message.isEmpty || liveMessage != nil
|
||||
@@ -118,7 +118,7 @@ struct ComposeState {
|
||||
|
||||
var linkPreviewAllowed: Bool {
|
||||
switch preview {
|
||||
case .imagePreviews: return false
|
||||
case .mediaPreviews: return false
|
||||
case .voicePreview: return false
|
||||
case .filePreview: return false
|
||||
default: return useLinkPreviews
|
||||
@@ -175,7 +175,9 @@ func chatItemPreview(chatItem: ChatItem) -> ComposePreview {
|
||||
case let .link(_, preview: preview):
|
||||
chatItemPreview = .linkPreview(linkPreview: preview)
|
||||
case let .image(_, image):
|
||||
chatItemPreview = .imagePreviews(imagePreviews: [(image, nil)])
|
||||
chatItemPreview = .mediaPreviews(mediaPreviews: [(image, nil)])
|
||||
case let .video(_, image, _):
|
||||
chatItemPreview = .mediaPreviews(mediaPreviews: [(image, nil)])
|
||||
case let .voice(_, duration):
|
||||
chatItemPreview = .voicePreview(recordingFileName: chatItem.file?.fileName ?? "", duration: duration)
|
||||
case .file:
|
||||
@@ -190,11 +192,13 @@ func chatItemPreview(chatItem: ChatItem) -> ComposePreview {
|
||||
enum UploadContent: Equatable {
|
||||
case simpleImage(image: UIImage)
|
||||
case animatedImage(image: UIImage)
|
||||
case video(image: UIImage, url: URL, duration: Int)
|
||||
|
||||
var uiImage: UIImage {
|
||||
switch self {
|
||||
case let .simpleImage(image): return image
|
||||
case let .animatedImage(image): return image
|
||||
case let .video(image, _, _): return image
|
||||
}
|
||||
}
|
||||
|
||||
@@ -216,6 +220,14 @@ enum UploadContent: Equatable {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
static func loadVideoFromURL(url: URL) -> UploadContent? {
|
||||
let asset = AVAsset(url: url)
|
||||
if let (image, duration) = asset.generatePreview() {
|
||||
return .video(image: image, url: url, duration: duration)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
struct ComposeView: View {
|
||||
@@ -232,9 +244,9 @@ struct ComposeView: View {
|
||||
@AppStorage(GROUP_DEFAULT_XFTP_SEND_ENABLED, store: groupDefaults) private var xftpSendEnabled = false
|
||||
|
||||
@State private var showChooseSource = false
|
||||
@State private var showImagePicker = false
|
||||
@State private var showMediaPicker = false
|
||||
@State private var showTakePhoto = false
|
||||
@State var chosenImages: [UploadContent] = []
|
||||
@State var chosenMedia: [UploadContent] = []
|
||||
@State private var showFileImporter = false
|
||||
|
||||
@State private var audioRecorder: AudioRecorder?
|
||||
@@ -286,7 +298,7 @@ struct ComposeView: View {
|
||||
},
|
||||
finishVoiceMessageRecording: finishVoiceMessageRecording,
|
||||
allowVoiceMessagesToContact: allowVoiceMessagesToContact,
|
||||
onImagesAdded: { images in if !images.isEmpty { chosenImages = images }},
|
||||
onMediaAdded: { media in if !media.isEmpty { chosenMedia = media }},
|
||||
keyboardVisible: $keyboardVisible
|
||||
)
|
||||
.padding(.trailing, 12)
|
||||
@@ -329,7 +341,7 @@ struct ComposeView: View {
|
||||
showTakePhoto = true
|
||||
}
|
||||
Button("Choose from library") {
|
||||
showImagePicker = true
|
||||
showMediaPicker = true
|
||||
}
|
||||
if UIPasteboard.general.hasImages {
|
||||
Button("Paste image") {
|
||||
@@ -337,7 +349,7 @@ struct ComposeView: View {
|
||||
if p.hasItemConformingToTypeIdentifier(UTType.data.identifier) {
|
||||
p.loadFileRepresentation(forTypeIdentifier: UTType.data.identifier) { url, error in
|
||||
if let url = url, let image = UploadContent.loadFromURL(url: url) {
|
||||
chosenImages.append(image)
|
||||
chosenMedia.append(image)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -351,31 +363,31 @@ struct ComposeView: View {
|
||||
.fullScreenCover(isPresented: $showTakePhoto) {
|
||||
ZStack {
|
||||
Color.black.edgesIgnoringSafeArea(.all)
|
||||
CameraImageListPicker(images: $chosenImages)
|
||||
CameraImageListPicker(images: $chosenMedia)
|
||||
}
|
||||
}
|
||||
.sheet(isPresented: $showImagePicker) {
|
||||
LibraryImageListPicker(images: $chosenImages, selectionLimit: 10) { itemsSelected in
|
||||
showImagePicker = false
|
||||
.sheet(isPresented: $showMediaPicker) {
|
||||
LibraryMediaListPicker(media: $chosenMedia, selectionLimit: 10) { itemsSelected in
|
||||
showMediaPicker = false
|
||||
if itemsSelected {
|
||||
DispatchQueue.main.async {
|
||||
composeState = composeState.copy(preview: .imagePreviews(imagePreviews: []))
|
||||
composeState = composeState.copy(preview: .mediaPreviews(mediaPreviews: []))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.onChange(of: chosenImages) { images in
|
||||
.onChange(of: chosenMedia) { selected in
|
||||
Task {
|
||||
var imgs: [(String, UploadContent)] = []
|
||||
for image in images {
|
||||
if let img = resizeImageToStrSize(image.uiImage, maxDataSize: 14000) {
|
||||
imgs.append((img, image))
|
||||
var media: [(String, UploadContent)] = []
|
||||
for content in selected {
|
||||
if let img = resizeImageToStrSize(content.uiImage, maxDataSize: 14000) {
|
||||
media.append((img, content))
|
||||
await MainActor.run {
|
||||
composeState = composeState.copy(preview: .imagePreviews(imagePreviews: imgs))
|
||||
composeState = composeState.copy(preview: .mediaPreviews(mediaPreviews: media))
|
||||
}
|
||||
}
|
||||
}
|
||||
if imgs.count == 0 {
|
||||
if media.count == 0 {
|
||||
await MainActor.run {
|
||||
composeState = composeState.copy(preview: .noPreview)
|
||||
}
|
||||
@@ -514,12 +526,12 @@ struct ComposeView: View {
|
||||
EmptyView()
|
||||
case let .linkPreview(linkPreview: preview):
|
||||
ComposeLinkView(linkPreview: preview, cancelPreview: cancelLinkPreview)
|
||||
case let .imagePreviews(imagePreviews: images):
|
||||
case let .mediaPreviews(mediaPreviews: media):
|
||||
ComposeImageView(
|
||||
images: images.map { (img, _) in img },
|
||||
images: media.map { (img, _) in img },
|
||||
cancelImage: {
|
||||
composeState = composeState.copy(preview: .noPreview)
|
||||
chosenImages = []
|
||||
chosenMedia = []
|
||||
},
|
||||
cancelEnabled: !composeState.editing)
|
||||
case let .voicePreview(recordingFileName, _):
|
||||
@@ -594,21 +606,29 @@ struct ComposeView: View {
|
||||
sent = await send(.text(msgText), quoted: quoted, live: live)
|
||||
case .linkPreview:
|
||||
sent = await send(checkLinkPreview(), quoted: quoted, live: live)
|
||||
case let .imagePreviews(imagePreviews: images):
|
||||
let last = images.count - 1
|
||||
case let .mediaPreviews(mediaPreviews: media):
|
||||
let last = media.count - 1
|
||||
if last >= 0 {
|
||||
for i in 0..<last {
|
||||
sent = await sendImage(images[i])
|
||||
if case (_, .video(_, _, _)) = media[i] {
|
||||
sent = await sendVideo(media[i])
|
||||
} else {
|
||||
sent = await sendImage(media[i])
|
||||
}
|
||||
_ = try? await Task.sleep(nanoseconds: 100_000000)
|
||||
}
|
||||
sent = await sendImage(images[last], text: msgText, quoted: quoted, live: live)
|
||||
if case (_, .video(_, _, _)) = media[last] {
|
||||
sent = await sendVideo(media[last], text: msgText, quoted: quoted, live: live)
|
||||
} else {
|
||||
sent = await sendImage(media[last], text: msgText, quoted: quoted, live: live)
|
||||
}
|
||||
}
|
||||
if sent == nil {
|
||||
sent = await send(.text(msgText), quoted: quoted, live: live)
|
||||
}
|
||||
case let .voicePreview(recordingFileName, duration):
|
||||
stopPlayback.toggle()
|
||||
chatModel.filesToDelete.removeAll { $0 == recordingFileName }
|
||||
chatModel.filesToDelete.remove(getAppFilePath(recordingFileName))
|
||||
sent = await send(.voice(text: msgText, duration: duration), quoted: quoted, file: recordingFileName)
|
||||
case let .filePreview(_, file):
|
||||
if let savedFile = saveFileFromURL(file) {
|
||||
@@ -657,6 +677,8 @@ struct ComposeView: View {
|
||||
return checkLinkPreview()
|
||||
case .image(_, let image):
|
||||
return .image(text: msgText, image: image)
|
||||
case .video(_, let image, let duration):
|
||||
return .video(text: msgText, image: image, duration: duration)
|
||||
case .voice(_, let duration):
|
||||
return .voice(text: msgText, duration: duration)
|
||||
case .file:
|
||||
@@ -674,6 +696,14 @@ struct ComposeView: View {
|
||||
return nil
|
||||
}
|
||||
|
||||
func sendVideo(_ imageData: (String, UploadContent?), text: String = "", quoted: Int64? = nil, live: Bool = false) async -> ChatItem? {
|
||||
let (image, data) = imageData
|
||||
if case let .video(_, url, duration) = data, let savedFile = saveFileFromURLWithoutLoad(url) {
|
||||
return await send(.video(text: text, image: image, duration: duration), quoted: quoted, file: savedFile, live: live)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func send(_ mc: MsgContent, quoted: Int64?, file: String? = nil, live: Bool = false) async -> ChatItem? {
|
||||
if let chatItem = await apiSendMessage(
|
||||
type: chat.chatInfo.chatType,
|
||||
@@ -711,14 +741,15 @@ struct ComposeView: View {
|
||||
switch img {
|
||||
case let .simpleImage(image): return saveImage(image)
|
||||
case let .animatedImage(image): return saveAnimImage(image)
|
||||
default: return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func startVoiceMessageRecording() async {
|
||||
startingRecording = true
|
||||
chatModel.stopPreviousRecPlay.toggle()
|
||||
let fileName = generateNewFileName("voice", "m4a")
|
||||
chatModel.stopPreviousRecPlay = getAppFilePath(fileName)
|
||||
audioRecorder = AudioRecorder(
|
||||
onTimer: { voiceMessageRecordingTime = $0 },
|
||||
onFinishRecording: {
|
||||
@@ -804,7 +835,7 @@ struct ComposeView: View {
|
||||
composeState = ComposeState()
|
||||
resetLinkPreview()
|
||||
}
|
||||
chosenImages = []
|
||||
chosenMedia = []
|
||||
audioRecorder = nil
|
||||
voiceMessageRecordingTime = nil
|
||||
startingRecording = false
|
||||
@@ -814,7 +845,7 @@ struct ComposeView: View {
|
||||
if case .recording = composeState.voiceMessageRecordingState {
|
||||
finishVoiceMessageRecording()
|
||||
if let fileName = composeState.voiceMessageRecordingFileName {
|
||||
chatModel.filesToDelete.append(fileName)
|
||||
chatModel.filesToDelete.insert(getAppFilePath(fileName))
|
||||
}
|
||||
}
|
||||
chatModel.draft = composeState
|
||||
|
||||
@@ -164,7 +164,7 @@ struct ComposeVoiceView: View {
|
||||
|
||||
private func startPlayback() {
|
||||
startingPlayback = true
|
||||
chatModel.stopPreviousRecPlay.toggle()
|
||||
chatModel.stopPreviousRecPlay = getAppFilePath(recordingFileName)
|
||||
audioPlayer = AudioPlayer(
|
||||
onTimer: { playbackTime = $0 },
|
||||
onFinishPlayback: {
|
||||
|
||||
@@ -23,7 +23,7 @@ struct SendMessageView: View {
|
||||
var startVoiceMessageRecording: (() -> Void)? = nil
|
||||
var finishVoiceMessageRecording: (() -> Void)? = nil
|
||||
var allowVoiceMessagesToContact: (() -> Void)? = nil
|
||||
var onImagesAdded: ([UploadContent]) -> Void
|
||||
var onMediaAdded: ([UploadContent]) -> Void
|
||||
@State private var holdingVMR = false
|
||||
@Namespace var namespace
|
||||
@FocusState.Binding var keyboardVisible: Bool
|
||||
@@ -69,7 +69,7 @@ struct SendMessageView: View {
|
||||
font: teUiFont,
|
||||
focused: $keyboardVisible,
|
||||
alignment: alignment,
|
||||
onImagesAdded: onImagesAdded
|
||||
onImagesAdded: onMediaAdded
|
||||
)
|
||||
.allowsTightening(false)
|
||||
.frame(height: teHeight)
|
||||
@@ -365,7 +365,7 @@ struct SendMessageView_Previews: PreviewProvider {
|
||||
SendMessageView(
|
||||
composeState: $composeStateNew,
|
||||
sendMessage: {},
|
||||
onImagesAdded: { _ in },
|
||||
onMediaAdded: { _ in },
|
||||
keyboardVisible: $keyboardVisible
|
||||
)
|
||||
}
|
||||
@@ -375,7 +375,7 @@ struct SendMessageView_Previews: PreviewProvider {
|
||||
SendMessageView(
|
||||
composeState: $composeStateEditing,
|
||||
sendMessage: {},
|
||||
onImagesAdded: { _ in },
|
||||
onMediaAdded: { _ in },
|
||||
keyboardVisible: $keyboardVisible
|
||||
)
|
||||
}
|
||||
|
||||
@@ -143,7 +143,7 @@ struct ChatPreviewView: View {
|
||||
func attachment() -> Text {
|
||||
switch draft.preview {
|
||||
case let .filePreview(fileName, _): return image("doc.fill") + Text(fileName) + Text(" ")
|
||||
case .imagePreviews: return image("photo")
|
||||
case .mediaPreviews: return image("photo")
|
||||
case let .voicePreview(_, duration): return image("play.fill") + Text(durationText(duration))
|
||||
default: return Text("")
|
||||
}
|
||||
@@ -159,6 +159,7 @@ struct ChatPreviewView: View {
|
||||
switch cItem.content.msgContent {
|
||||
case .file: return "doc.fill"
|
||||
case .image: return "photo"
|
||||
case .video: return "video"
|
||||
case .voice: return "play.fill"
|
||||
default: return nil
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ struct LibraryImagePicker: View {
|
||||
@State var images: [UploadContent] = []
|
||||
|
||||
var body: some View {
|
||||
LibraryImageListPicker(images: $images, selectionLimit: 1, didFinishPicking: didFinishPicking)
|
||||
LibraryMediaListPicker(media: $images, selectionLimit: 1, didFinishPicking: didFinishPicking)
|
||||
.onChange(of: images) { _ in
|
||||
if let img = images.first {
|
||||
image = img.uiImage
|
||||
@@ -26,19 +26,20 @@ struct LibraryImagePicker: View {
|
||||
}
|
||||
}
|
||||
|
||||
struct LibraryImageListPicker: UIViewControllerRepresentable {
|
||||
struct LibraryMediaListPicker: UIViewControllerRepresentable {
|
||||
typealias UIViewControllerType = PHPickerViewController
|
||||
@Binding var images: [UploadContent]
|
||||
@AppStorage(GROUP_DEFAULT_XFTP_SEND_ENABLED, store: groupDefaults) var xftpSendEnabled = false
|
||||
@Binding var media: [UploadContent]
|
||||
var selectionLimit: Int
|
||||
var didFinishPicking: (_ didSelectItems: Bool) -> Void
|
||||
|
||||
class Coordinator: PHPickerViewControllerDelegate {
|
||||
let parent: LibraryImageListPicker
|
||||
let dispatchQueue = DispatchQueue(label: "chat.simplex.app.LibraryImageListPicker")
|
||||
var images: [UploadContent] = []
|
||||
var imageCount: Int = 0
|
||||
let parent: LibraryMediaListPicker
|
||||
let dispatchQueue = DispatchQueue(label: "chat.simplex.app.LibraryMediaListPicker")
|
||||
var media: [UploadContent] = []
|
||||
var mediaCount: Int = 0
|
||||
|
||||
init(_ parent: LibraryImageListPicker) {
|
||||
init(_ parent: LibraryMediaListPicker) {
|
||||
self.parent = parent
|
||||
}
|
||||
|
||||
@@ -48,13 +49,23 @@ struct LibraryImageListPicker: UIViewControllerRepresentable {
|
||||
return
|
||||
}
|
||||
|
||||
parent.images = []
|
||||
images = []
|
||||
imageCount = results.count
|
||||
parent.media = []
|
||||
media = []
|
||||
mediaCount = results.count
|
||||
for result in results {
|
||||
logger.log("LibraryImageListPicker result")
|
||||
logger.log("LibraryMediaListPicker result")
|
||||
let p = result.itemProvider
|
||||
if p.hasItemConformingToTypeIdentifier(UTType.data.identifier) {
|
||||
if p.hasItemConformingToTypeIdentifier(UTType.movie.identifier) {
|
||||
p.loadFileRepresentation(forTypeIdentifier: UTType.movie.identifier) { url, error in
|
||||
if let url = url {
|
||||
let tempUrl = URL(fileURLWithPath: getTempFilesDirectory().path + "/" + generateNewFileName("video", url.pathExtension))
|
||||
if ((try? FileManager.default.copyItem(at: url, to: tempUrl)) != nil) {
|
||||
ChatModel.shared.filesToDelete.insert(tempUrl)
|
||||
self.loadVideo(url: tempUrl, error: error)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if p.hasItemConformingToTypeIdentifier(UTType.data.identifier) {
|
||||
p.loadFileRepresentation(forTypeIdentifier: UTType.data.identifier) { url, error in
|
||||
self.loadImage(object: url, error: error)
|
||||
}
|
||||
@@ -65,14 +76,14 @@ struct LibraryImageListPicker: UIViewControllerRepresentable {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
dispatchQueue.sync { self.imageCount -= 1}
|
||||
dispatchQueue.sync { self.mediaCount -= 1}
|
||||
}
|
||||
}
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
|
||||
self.dispatchQueue.sync {
|
||||
if self.parent.images.count == 0 {
|
||||
logger.log("LibraryImageListPicker: added \(self.images.count) images out of \(results.count)")
|
||||
self.parent.images = self.images
|
||||
if self.parent.media.count == 0 {
|
||||
logger.log("LibraryMediaListPicker: added \(self.media.count) images out of \(results.count)")
|
||||
self.parent.media = self.media
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -80,19 +91,35 @@ struct LibraryImageListPicker: UIViewControllerRepresentable {
|
||||
|
||||
func loadImage(object: Any?, error: Error? = nil) {
|
||||
if let error = error {
|
||||
logger.error("LibraryImageListPicker: couldn't load image with error: \(error.localizedDescription)")
|
||||
logger.error("LibraryMediaListPicker: couldn't load image with error: \(error.localizedDescription)")
|
||||
} else if let image = object as? UIImage {
|
||||
images.append(.simpleImage(image: image))
|
||||
logger.log("LibraryImageListPicker: added image")
|
||||
media.append(.simpleImage(image: image))
|
||||
logger.log("LibraryMediaListPicker: added image")
|
||||
} else if let url = object as? URL, let image = UploadContent.loadFromURL(url: url) {
|
||||
images.append(image)
|
||||
media.append(image)
|
||||
}
|
||||
dispatchQueue.sync {
|
||||
self.imageCount -= 1
|
||||
if self.imageCount == 0 && self.parent.images.count == 0 {
|
||||
logger.log("LibraryImageListPicker: added all images")
|
||||
self.parent.images = self.images
|
||||
self.images = []
|
||||
self.mediaCount -= 1
|
||||
if self.mediaCount == 0 && self.parent.media.count == 0 {
|
||||
logger.log("LibraryMediaListPicker: added all media")
|
||||
self.parent.media = self.media
|
||||
self.media = []
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func loadVideo(url: URL?, error: Error? = nil) {
|
||||
if let error = error {
|
||||
logger.error("LibraryMediaListPicker: couldn't load video with error: \(error.localizedDescription)")
|
||||
} else if let url = url as URL?, let video = UploadContent.loadVideoFromURL(url: url) {
|
||||
media.append(video)
|
||||
}
|
||||
dispatchQueue.sync {
|
||||
self.mediaCount -= 1
|
||||
if self.mediaCount == 0 && self.parent.media.count == 0 {
|
||||
logger.log("LibraryMediaListPicker: added all media")
|
||||
self.parent.media = self.media
|
||||
self.media = []
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -104,8 +131,15 @@ struct LibraryImageListPicker: UIViewControllerRepresentable {
|
||||
|
||||
func makeUIViewController(context: Context) -> PHPickerViewController {
|
||||
var config = PHPickerConfiguration()
|
||||
config.filter = .images
|
||||
let allowVideoAttachment = xftpSendEnabled
|
||||
if allowVideoAttachment {
|
||||
config.filter = .any(of: [.images, .videos])
|
||||
} else {
|
||||
config.filter = .images
|
||||
}
|
||||
config.selectionLimit = selectionLimit
|
||||
config.selection = .ordered
|
||||
//config.preferredAssetRepresentationMode = .current
|
||||
let controller = PHPickerViewController(configuration: config)
|
||||
controller.delegate = context.coordinator
|
||||
return controller
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
//
|
||||
// Created by Avently on 30.03.2023.
|
||||
// Copyright (c) 2023 SimpleX Chat. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import SwiftUI
|
||||
import AVKit
|
||||
|
||||
struct VideoPlayerView: UIViewRepresentable {
|
||||
|
||||
static var players: [String: AVPlayer] = [:]
|
||||
static func getOrCreatePlayer(_ url: URL, _ gallery: Bool) -> AVPlayer {
|
||||
if let player = players[url.absoluteString + gallery.description] {
|
||||
return player
|
||||
} else {
|
||||
let player = AVPlayer(url: url)
|
||||
players[url.absoluteString + gallery.description] = player
|
||||
return player
|
||||
}
|
||||
}
|
||||
|
||||
typealias UIViewType = UIView
|
||||
let player: AVPlayer
|
||||
let url: URL
|
||||
let showControls: Bool
|
||||
|
||||
func makeUIView(context: UIViewRepresentableContext<VideoPlayerView>) -> UIView {
|
||||
let controller = AVPlayerViewController()
|
||||
controller.showsPlaybackControls = showControls
|
||||
if #available(iOS 16.0, *) {
|
||||
controller.speeds = []
|
||||
}
|
||||
controller.player = player
|
||||
context.coordinator.controller = controller
|
||||
context.coordinator.timeObserver = NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: player.currentItem, queue: .main) { _ in
|
||||
player.seek(to: CMTime.zero)
|
||||
player.play()
|
||||
}
|
||||
return controller.view
|
||||
}
|
||||
|
||||
func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<VideoPlayerView>) {
|
||||
}
|
||||
|
||||
func makeCoordinator() -> VideoPlayerView.Coordinator {
|
||||
Coordinator()
|
||||
}
|
||||
|
||||
class Coordinator: NSObject {
|
||||
var controller: AVPlayerViewController?
|
||||
var timeObserver: Any? = nil
|
||||
|
||||
deinit {
|
||||
print("deinit coordinator of VideoPlayer")
|
||||
if let timeObserver = timeObserver {
|
||||
NotificationCenter.default.removeObserver(timeObserver)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -74,7 +74,7 @@ struct TerminalView: View {
|
||||
composeState: $composeState,
|
||||
sendMessage: sendMessage,
|
||||
showVoiceMessageButton: false,
|
||||
onImagesAdded: { _ in },
|
||||
onMediaAdded: { _ in },
|
||||
keyboardVisible: $keyboardVisible
|
||||
)
|
||||
.padding(.horizontal, 12)
|
||||
|
||||
@@ -44,7 +44,7 @@ struct DeveloperView: View {
|
||||
|
||||
Section {
|
||||
settingsRow("arrow.up.doc") {
|
||||
Toggle("Send files via XFTP", isOn: $xftpSendEnabled)
|
||||
Toggle("Send videos and files via XFTP", isOn: $xftpSendEnabled)
|
||||
.onChange(of: xftpSendEnabled) { _ in
|
||||
do {
|
||||
try setXFTPConfig(getXFTPCfg())
|
||||
|
||||
@@ -16,7 +16,7 @@ struct ExperimentalFeaturesView: View {
|
||||
List {
|
||||
Section("") {
|
||||
settingsRow("arrow.up.doc") {
|
||||
Toggle("Send files via XFTP", isOn: $xftpSendEnabled)
|
||||
Toggle("Send videos and files via XFTP", isOn: $xftpSendEnabled)
|
||||
.onChange(of: xftpSendEnabled) { _ in
|
||||
do {
|
||||
try setXFTPConfig(getXFTPCfg())
|
||||
|
||||
@@ -25,6 +25,7 @@ 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
|
||||
@@ -37,12 +38,21 @@ struct NetworkAndServers: View {
|
||||
List {
|
||||
Section {
|
||||
NavigationLink {
|
||||
SMPServersView()
|
||||
ProtocolServersView(serverProtocol: .smp)
|
||||
.navigationTitle("Your SMP servers")
|
||||
} label: {
|
||||
Text("SMP servers")
|
||||
}
|
||||
|
||||
if xftpSendEnabled {
|
||||
NavigationLink {
|
||||
ProtocolServersView(serverProtocol: .xftp)
|
||||
.navigationTitle("Your XFTP servers")
|
||||
} label: {
|
||||
Text("XFTP servers")
|
||||
}
|
||||
}
|
||||
|
||||
Picker("Use .onion hosts", selection: $onionHosts) {
|
||||
ForEach(OnionHosts.values, id: \.self) { Text($0.text) }
|
||||
}
|
||||
@@ -62,7 +72,7 @@ struct NetworkAndServers: View {
|
||||
Text("Advanced network settings")
|
||||
}
|
||||
} header: {
|
||||
Text("Messages")
|
||||
Text("Messages & files")
|
||||
} footer: {
|
||||
Text("Using .onion hosts requires compatible VPN provider.")
|
||||
}
|
||||
|
||||
+24
-17
@@ -9,13 +9,16 @@
|
||||
import SwiftUI
|
||||
import SimpleXChat
|
||||
|
||||
struct SMPServerView: View {
|
||||
struct ProtocolServerView: View {
|
||||
@Environment(\.dismiss) var dismiss: DismissAction
|
||||
let serverProtocol: ServerProtocol
|
||||
@Binding var server: ServerCfg
|
||||
@State var serverToEdit: ServerCfg
|
||||
@State private var showTestFailure = false
|
||||
@State private var testing = false
|
||||
@State private var testFailure: SMPTestFailure?
|
||||
@State private var testFailure: ProtocolTestFailure?
|
||||
|
||||
var proto: String { serverProtocol.rawValue.uppercased() }
|
||||
|
||||
var body: some View {
|
||||
ZStack {
|
||||
@@ -28,7 +31,7 @@ struct SMPServerView: View {
|
||||
ProgressView().scaleEffect(2)
|
||||
}
|
||||
}
|
||||
.modifier(BackButton(label: "Your SMP servers") {
|
||||
.modifier(BackButton(label: "Your \(proto) servers") {
|
||||
server = serverToEdit
|
||||
dismiss()
|
||||
})
|
||||
@@ -57,7 +60,8 @@ struct SMPServerView: View {
|
||||
|
||||
private func customServer() -> some View {
|
||||
VStack {
|
||||
let valid = parseServerAddress(serverToEdit.server)?.valid == true
|
||||
let serverAddress = parseServerAddress(serverToEdit.server)
|
||||
let valid = serverAddress?.valid == true && serverAddress?.serverProtocol == serverProtocol
|
||||
List {
|
||||
Section {
|
||||
TextEditor(text: $serverToEdit.server)
|
||||
@@ -144,18 +148,17 @@ struct BackButton: ViewModifier {
|
||||
}
|
||||
}
|
||||
|
||||
func testServerConnection(server: Binding<ServerCfg>) async -> SMPTestFailure? {
|
||||
func testServerConnection(server: Binding<ServerCfg>) async -> ProtocolTestFailure? {
|
||||
do {
|
||||
let r = try await testSMPServer(smpServer: server.wrappedValue.server)
|
||||
|
||||
switch r {
|
||||
case .success:
|
||||
await MainActor.run { server.wrappedValue.tested = true }
|
||||
return nil
|
||||
case let .failure(f):
|
||||
await MainActor.run { server.wrappedValue.tested = false }
|
||||
return f
|
||||
}
|
||||
let r = try await testProtoServer(server: server.wrappedValue.server)
|
||||
switch r {
|
||||
case .success:
|
||||
await MainActor.run { server.wrappedValue.tested = true }
|
||||
return nil
|
||||
case let .failure(f):
|
||||
await MainActor.run { server.wrappedValue.tested = false }
|
||||
return f
|
||||
}
|
||||
} catch let error {
|
||||
logger.error("testServerConnection \(responseError(error))")
|
||||
await MainActor.run {
|
||||
@@ -169,8 +172,12 @@ func serverHostname(_ srv: String) -> String {
|
||||
parseServerAddress(srv)?.hostnames.first ?? srv
|
||||
}
|
||||
|
||||
struct SMPServerView_Previews: PreviewProvider {
|
||||
struct ProtocolServerView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
SMPServerView(server: Binding.constant(ServerCfg.sampleData.custom), serverToEdit: ServerCfg.sampleData.custom)
|
||||
ProtocolServerView(
|
||||
serverProtocol: .smp,
|
||||
server: Binding.constant(ServerCfg.sampleData.custom),
|
||||
serverToEdit: ServerCfg.sampleData.custom
|
||||
)
|
||||
}
|
||||
}
|
||||
+64
-36
@@ -1,5 +1,5 @@
|
||||
//
|
||||
// SMPServersView.swift
|
||||
// ProtocolServersView.swift
|
||||
// SimpleX (iOS)
|
||||
//
|
||||
// Created by Evgeny on 15/11/2022.
|
||||
@@ -11,29 +11,35 @@ import SimpleXChat
|
||||
|
||||
private let howToUrl = URL(string: "https://github.com/simplex-chat/simplex-chat/blob/stable/docs/SERVER.md")!
|
||||
|
||||
struct SMPServersView: View {
|
||||
struct ProtocolServersView: View {
|
||||
@Environment(\.dismiss) var dismiss: DismissAction
|
||||
@EnvironmentObject private var m: ChatModel
|
||||
@Environment(\.editMode) private var editMode
|
||||
@State private var servers = ChatModel.shared.userSMPServers ?? []
|
||||
let serverProtocol: ServerProtocol
|
||||
@State private var currServers: [ServerCfg] = []
|
||||
@State private var presetServers: [String] = []
|
||||
@State private var servers: [ServerCfg] = []
|
||||
@State private var selectedServer: String? = nil
|
||||
@State private var showAddServer = false
|
||||
@State private var showScanSMPServer = false
|
||||
@State private var showScanProtoServer = false
|
||||
@State private var justOpened = true
|
||||
@State private var testing = false
|
||||
@State private var alert: SMPServerAlert? = nil
|
||||
@State private var alert: ServerAlert? = nil
|
||||
@State private var showSaveDialog = false
|
||||
|
||||
var proto: String { serverProtocol.rawValue.uppercased() }
|
||||
|
||||
var body: some View {
|
||||
ZStack {
|
||||
smpServersView()
|
||||
protocolServersView()
|
||||
if testing {
|
||||
ProgressView().scaleEffect(2)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enum SMPServerAlert: Identifiable {
|
||||
case testsFailed(failures: [String: SMPTestFailure])
|
||||
enum ServerAlert: Identifiable {
|
||||
case testsFailed(failures: [String: ProtocolTestFailure])
|
||||
case error(title: LocalizedStringKey, error: LocalizedStringKey = "")
|
||||
|
||||
var id: String {
|
||||
@@ -44,11 +50,11 @@ struct SMPServersView: View {
|
||||
}
|
||||
}
|
||||
|
||||
private func smpServersView() -> some View {
|
||||
private func protocolServersView() -> some View {
|
||||
List {
|
||||
Section {
|
||||
ForEach($servers) { srv in
|
||||
smpServerView(srv)
|
||||
protocolServerView(srv)
|
||||
}
|
||||
.onMove { indexSet, offset in
|
||||
servers.move(fromOffsets: indexSet, toOffset: offset)
|
||||
@@ -60,18 +66,18 @@ struct SMPServersView: View {
|
||||
showAddServer = true
|
||||
}
|
||||
} header: {
|
||||
Text("SMP servers")
|
||||
Text("\(proto) servers")
|
||||
} footer: {
|
||||
Text("The servers for new connections of your current chat profile **\(m.currentUser?.displayName ?? "")**.")
|
||||
.lineLimit(10)
|
||||
}
|
||||
|
||||
Section {
|
||||
Button("Reset") { servers = m.userSMPServers ?? [] }
|
||||
.disabled(servers == m.userSMPServers || testing)
|
||||
Button("Reset") { servers = currServers }
|
||||
.disabled(servers == currServers || testing)
|
||||
Button("Test servers", action: testServers)
|
||||
.disabled(testing || allServersDisabled)
|
||||
Button("Save servers", action: saveSMPServers)
|
||||
Button("Save servers", action: saveServers)
|
||||
.disabled(saveDisabled)
|
||||
howToButton()
|
||||
}
|
||||
@@ -82,24 +88,26 @@ struct SMPServersView: View {
|
||||
servers.append(ServerCfg.empty)
|
||||
selectedServer = servers.last?.id
|
||||
}
|
||||
Button("Scan server QR code") { showScanSMPServer = true }
|
||||
Button("Scan server QR code") { showScanProtoServer = true }
|
||||
Button("Add preset servers", action: addAllPresets)
|
||||
.disabled(hasAllPresets())
|
||||
}
|
||||
.sheet(isPresented: $showScanSMPServer) {
|
||||
ScanSMPServer(servers: $servers)
|
||||
.sheet(isPresented: $showScanProtoServer) {
|
||||
ScanProtocolServer(servers: $servers)
|
||||
}
|
||||
.modifier(BackButton {
|
||||
if saveDisabled {
|
||||
dismiss()
|
||||
justOpened = false
|
||||
} else {
|
||||
showSaveDialog = true
|
||||
}
|
||||
})
|
||||
.confirmationDialog("Save servers?", isPresented: $showSaveDialog) {
|
||||
Button("Save") {
|
||||
saveSMPServers()
|
||||
saveServers()
|
||||
dismiss()
|
||||
justOpened = false
|
||||
}
|
||||
Button("Exit without saving") { dismiss() }
|
||||
}
|
||||
@@ -119,11 +127,27 @@ struct SMPServersView: View {
|
||||
)
|
||||
}
|
||||
}
|
||||
.onAppear {
|
||||
// this condition is needed to prevent re-setting the servers when exiting single server view
|
||||
if !justOpened { return }
|
||||
do {
|
||||
let r = try getUserProtoServers(serverProtocol)
|
||||
currServers = r.protoServers
|
||||
presetServers = r.presetServers
|
||||
servers = currServers
|
||||
} catch let error {
|
||||
alert = .error(
|
||||
title: "Error loading \(proto) servers",
|
||||
error: "Error: \(responseError(error))"
|
||||
)
|
||||
}
|
||||
justOpened = false
|
||||
}
|
||||
}
|
||||
|
||||
private var saveDisabled: Bool {
|
||||
servers.isEmpty ||
|
||||
servers == m.userSMPServers ||
|
||||
servers == currServers ||
|
||||
testing ||
|
||||
!servers.allSatisfy { srv in
|
||||
if let address = parseServerAddress(srv.server) {
|
||||
@@ -138,18 +162,22 @@ struct SMPServersView: View {
|
||||
servers.allSatisfy { !$0.enabled }
|
||||
}
|
||||
|
||||
private func smpServerView(_ server: Binding<ServerCfg>) -> some View {
|
||||
private func protocolServerView(_ server: Binding<ServerCfg>) -> some View {
|
||||
let srv = server.wrappedValue
|
||||
return NavigationLink(tag: srv.id, selection: $selectedServer) {
|
||||
SMPServerView(server: server, serverToEdit: srv)
|
||||
.navigationBarTitle(srv.preset ? "Preset server" : "Your server")
|
||||
.navigationBarTitleDisplayMode(.large)
|
||||
ProtocolServerView(
|
||||
serverProtocol: serverProtocol,
|
||||
server: server,
|
||||
serverToEdit: srv
|
||||
)
|
||||
.navigationBarTitle(srv.preset ? "Preset server" : "Your server")
|
||||
.navigationBarTitleDisplayMode(.large)
|
||||
} label: {
|
||||
let address = parseServerAddress(srv.server)
|
||||
HStack {
|
||||
Group {
|
||||
if let address = address {
|
||||
if !address.valid {
|
||||
if !address.valid || address.serverProtocol != serverProtocol {
|
||||
invalidServer()
|
||||
} else if !uniqueAddress(srv, address) {
|
||||
Image(systemName: "exclamationmark.circle").foregroundColor(.red)
|
||||
@@ -201,11 +229,11 @@ struct SMPServersView: View {
|
||||
}
|
||||
|
||||
private func hasAllPresets() -> Bool {
|
||||
m.presetSMPServers?.allSatisfy { hasPreset($0) } ?? true
|
||||
presetServers.allSatisfy { hasPreset($0) }
|
||||
}
|
||||
|
||||
private func addAllPresets() {
|
||||
for srv in m.presetSMPServers ?? [] {
|
||||
for srv in presetServers {
|
||||
if !hasPreset(srv) {
|
||||
servers.append(ServerCfg(server: srv, preset: true, tested: nil, enabled: true))
|
||||
}
|
||||
@@ -238,8 +266,8 @@ struct SMPServersView: View {
|
||||
}
|
||||
}
|
||||
|
||||
private func runServersTest() async -> [String: SMPTestFailure] {
|
||||
var fs: [String: SMPTestFailure] = [:]
|
||||
private func runServersTest() async -> [String: ProtocolTestFailure] {
|
||||
var fs: [String: ProtocolTestFailure] = [:]
|
||||
for i in 0..<servers.count {
|
||||
if servers[i].enabled {
|
||||
if let f = await testServerConnection(server: $servers[i]) {
|
||||
@@ -250,21 +278,21 @@ struct SMPServersView: View {
|
||||
return fs
|
||||
}
|
||||
|
||||
func saveSMPServers() {
|
||||
func saveServers() {
|
||||
Task {
|
||||
do {
|
||||
try await setUserSMPServers(smpServers: servers)
|
||||
try await setUserProtoServers(serverProtocol, servers: servers)
|
||||
await MainActor.run {
|
||||
m.userSMPServers = servers
|
||||
currServers = servers
|
||||
editMode?.wrappedValue = .inactive
|
||||
}
|
||||
} catch let error {
|
||||
let err = responseError(error)
|
||||
logger.error("saveSMPServers setUserSMPServers error: \(err)")
|
||||
logger.error("saveServers setUserProtocolServers error: \(err)")
|
||||
await MainActor.run {
|
||||
alert = .error(
|
||||
title: "Error saving SMP servers",
|
||||
error: "Make sure SMP server addresses are in correct format, line separated and are not duplicated (\(responseError(error)))."
|
||||
title: "Error saving \(proto) servers",
|
||||
error: "Make sure \(proto) server addresses are in correct format, line separated and are not duplicated (\(responseError(error)))."
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -272,8 +300,8 @@ struct SMPServersView: View {
|
||||
}
|
||||
}
|
||||
|
||||
struct SMPServersView_Previews: PreviewProvider {
|
||||
struct ProtocolServersView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
SMPServersView()
|
||||
ProtocolServersView(serverProtocol: .smp)
|
||||
}
|
||||
}
|
||||
+5
-5
@@ -1,5 +1,5 @@
|
||||
//
|
||||
// ScanSMPServer.swift
|
||||
// ScanProtocolServer.swift
|
||||
// SimpleX (iOS)
|
||||
//
|
||||
// Created by Evgeny on 19/11/2022.
|
||||
@@ -10,7 +10,7 @@ import SwiftUI
|
||||
import SimpleXChat
|
||||
import CodeScanner
|
||||
|
||||
struct ScanSMPServer: View {
|
||||
struct ScanProtocolServer: View {
|
||||
@Environment(\.dismiss) var dismiss: DismissAction
|
||||
@Binding var servers: [ServerCfg]
|
||||
@State private var showAddressError = false
|
||||
@@ -47,14 +47,14 @@ struct ScanSMPServer: View {
|
||||
showAddressError = true
|
||||
}
|
||||
case let .failure(e):
|
||||
logger.error("ScanSMPServer.processQRCode QR code error: \(e.localizedDescription)")
|
||||
logger.error("ScanProtocolServer.processQRCode QR code error: \(e.localizedDescription)")
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct ScanSMPServer_Previews: PreviewProvider {
|
||||
struct ScanProtocolServer_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
ScanSMPServer(servers: Binding.constant([]))
|
||||
ScanProtocolServer(servers: Binding.constant([]))
|
||||
}
|
||||
}
|
||||
@@ -22,6 +22,8 @@ struct UserProfilesView: View {
|
||||
@State private var profileAction: UserProfileAction?
|
||||
@State private var actionPassword = ""
|
||||
|
||||
var trimmedSearchTextOrPassword: String { searchTextOrPassword.trimmingCharacters(in: .whitespaces)}
|
||||
|
||||
private enum UserProfilesAlert: Identifiable {
|
||||
case deleteUser(user: User, delSMPQueues: Bool)
|
||||
case cantDeleteLastUser
|
||||
@@ -90,7 +92,7 @@ struct UserProfilesView: View {
|
||||
}
|
||||
}
|
||||
|
||||
if searchTextOrPassword == "" {
|
||||
if trimmedSearchTextOrPassword == "" {
|
||||
NavigationLink {
|
||||
CreateProfile()
|
||||
} label: {
|
||||
@@ -179,7 +181,7 @@ struct UserProfilesView: View {
|
||||
}
|
||||
|
||||
private func filteredUsers() -> [UserInfo] {
|
||||
let s = searchTextOrPassword.trimmingCharacters(in: .whitespaces)
|
||||
let s = trimmedSearchTextOrPassword
|
||||
let lower = s.localizedLowercase
|
||||
return m.users.filter { u in
|
||||
if (u.user.activeUser || !u.user.hidden) && (s == "" || u.user.chatViewName.localizedLowercase.contains(lower)) {
|
||||
@@ -201,7 +203,7 @@ struct UserProfilesView: View {
|
||||
}
|
||||
|
||||
private func userViewPassword(_ user: User) -> String? {
|
||||
!user.hidden ? nil : searchTextOrPassword
|
||||
!user.hidden ? nil : trimmedSearchTextOrPassword
|
||||
}
|
||||
|
||||
@ViewBuilder private func profileActionView(_ action: UserProfileAction) -> some View {
|
||||
@@ -267,7 +269,7 @@ struct UserProfilesView: View {
|
||||
}
|
||||
|
||||
private func passwordEntryRequired(_ user: User) -> Bool {
|
||||
user.hidden && user.activeUser && !correctPassword(user, searchTextOrPassword)
|
||||
user.hidden && user.activeUser && !correctPassword(user, trimmedSearchTextOrPassword)
|
||||
}
|
||||
|
||||
private func removeUser(_ user: User, _ delSMPQueues: Bool, viewPwd: String?) async {
|
||||
@@ -328,7 +330,7 @@ struct UserProfilesView: View {
|
||||
if passwordEntryRequired(user) {
|
||||
profileAction = .unhideUser(user: user)
|
||||
} else {
|
||||
setUserPrivacy(user) { try await apiUnhideUser(user.userId, viewPwd: searchTextOrPassword) }
|
||||
setUserPrivacy(user) { try await apiUnhideUser(user.userId, viewPwd: trimmedSearchTextOrPassword) }
|
||||
}
|
||||
}
|
||||
.tint(.green)
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
<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">
|
||||
@@ -765,6 +770,11 @@
|
||||
<target>Potvrdit</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm database upgrades" xml:space="preserve">
|
||||
<source>Confirm database upgrades</source>
|
||||
<target>Potvrdit aktualizaci databáze</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm new passphrase…" xml:space="preserve">
|
||||
<source>Confirm new passphrase…</source>
|
||||
<target>Potvrdit novou heslovou frázi…</target>
|
||||
@@ -975,6 +985,16 @@
|
||||
<target>ID databáze</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database IDs and Transport isolation option." xml:space="preserve">
|
||||
<source>Database IDs and Transport isolation option.</source>
|
||||
<target>ID databáze a možnost Izolace přenosu.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database downgrade" xml:space="preserve">
|
||||
<source>Database downgrade</source>
|
||||
<target>Původní databáze</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database encrypted!" xml:space="preserve">
|
||||
<source>Database encrypted!</source>
|
||||
<target>Databáze zašifrována!</target>
|
||||
@@ -1029,6 +1049,11 @@
|
||||
<target>Pro otevření chatu je vyžadována přístupová fráze databáze.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database upgrade" xml:space="preserve">
|
||||
<source>Database upgrade</source>
|
||||
<target>Aktualizace databáze</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database will be encrypted and the passphrase stored in the keychain. " xml:space="preserve">
|
||||
<source>Database will be encrypted and the passphrase stored in the keychain.
|
||||
</source>
|
||||
@@ -1093,6 +1118,11 @@
|
||||
<target>Smazat archiv chatu?</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete chat profile" xml:space="preserve">
|
||||
<source>Delete chat profile</source>
|
||||
<target>Smazat chat profil</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete chat profile?" xml:space="preserve">
|
||||
<source>Delete chat profile?</source>
|
||||
<target>Smazat chat profil?</target>
|
||||
@@ -1203,6 +1233,11 @@
|
||||
<target>Smazat čekající připojení?</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete profile" xml:space="preserve">
|
||||
<source>Delete profile</source>
|
||||
<target>Smazat profil</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete queue" xml:space="preserve">
|
||||
<source>Delete queue</source>
|
||||
<target>Odstranit frontu</target>
|
||||
@@ -1308,6 +1343,11 @@
|
||||
<target>Znovu neukazuj</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Downgrade and open chat" xml:space="preserve">
|
||||
<source>Downgrade and open chat</source>
|
||||
<target>Snížit a otevřít chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Duplicate display name!" xml:space="preserve">
|
||||
<source>Duplicate display name!</source>
|
||||
<target>Duplicitní zobrazované jméno!</target>
|
||||
@@ -1383,6 +1423,10 @@
|
||||
<target>Šifrovaná zpráva: chyba databáze</target>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Encrypted message: database migration error" xml:space="preserve">
|
||||
<source>Encrypted message: database migration error</source>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Encrypted message: keychain error" xml:space="preserve">
|
||||
<source>Encrypted message: keychain error</source>
|
||||
<target>Zašifrovaná zpráva: chyba klíčenky</target>
|
||||
@@ -1410,6 +1454,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Enter password above to show!" xml:space="preserve">
|
||||
<source>Enter password above to show!</source>
|
||||
<target>Zadejte heslo do hledání!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Enter server manually" xml:space="preserve">
|
||||
@@ -1612,6 +1657,11 @@
|
||||
<target>Chyba aktualizace soukromí uživatele</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error: " xml:space="preserve">
|
||||
<source>Error: </source>
|
||||
<target>Chyba: </target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error: %@" xml:space="preserve">
|
||||
<source>Error: %@</source>
|
||||
<target>Chyba: %@</target>
|
||||
@@ -1632,6 +1682,10 @@
|
||||
<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>
|
||||
<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>
|
||||
@@ -1657,6 +1711,16 @@
|
||||
<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>
|
||||
<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">
|
||||
<source>File will be received when your contact completes uploading it.</source>
|
||||
<target>Soubor bude přijat, jakmile váš kontakt dokončí nahrávání.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="File will be received when your contact is online, please wait or check later!" xml:space="preserve">
|
||||
<source>File will be received when your contact is online, please wait or check later!</source>
|
||||
<target>Soubor bude přijat, až bude váš kontakt online, vyčkejte prosím nebo se podívejte později!</target>
|
||||
@@ -1699,6 +1763,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
||||
<source>Fully re-implemented - work in background!</source>
|
||||
<target>Plně přepracováno, prácuje na pozadí!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Further reduced battery usage" xml:space="preserve">
|
||||
@@ -1851,6 +1916,11 @@
|
||||
<target>Skrýt profil</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Hide:" xml:space="preserve">
|
||||
<source>Hide:</source>
|
||||
<target>Skrýt:</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="How SimpleX works" xml:space="preserve">
|
||||
<source>How SimpleX works</source>
|
||||
<target>Jak SimpleX funguje</target>
|
||||
@@ -1901,6 +1971,11 @@
|
||||
<target>Ignorovat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Image will be received when your contact completes uploading it." xml:space="preserve">
|
||||
<source>Image will be received when your contact completes uploading it.</source>
|
||||
<target>Obrázek bude přijat, až kontakt dokončí jeho nahrání.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Image will be received when your contact is online, please wait or check later!" xml:space="preserve">
|
||||
<source>Image will be received when your contact is online, please wait or check later!</source>
|
||||
<target>Obrázek bude přijat, až bude váš kontakt online, vyčkejte prosím nebo se podívejte později!</target>
|
||||
@@ -1971,6 +2046,11 @@
|
||||
<target>Příchozí videohovor</target>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Incompatible database version" xml:space="preserve">
|
||||
<source>Incompatible database version</source>
|
||||
<target>Nekompatibilní verze databáze</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Incorrect security code!" xml:space="preserve">
|
||||
<source>Incorrect security code!</source>
|
||||
<target>Nesprávný bezpečnostní kód!</target>
|
||||
@@ -2263,6 +2343,10 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
|
||||
<target>Přenesení dokončeno</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrations: %@" xml:space="preserve">
|
||||
<source>Migrations: %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Moderate" xml:space="preserve">
|
||||
<source>Moderate</source>
|
||||
<target>Moderovat</target>
|
||||
@@ -2657,6 +2741,11 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
|
||||
<target>Profilový obrázek</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Profile password" xml:space="preserve">
|
||||
<source>Profile password</source>
|
||||
<target>Heslo profilu</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>Zakázat nevratné mazání zpráv.</target>
|
||||
@@ -2992,6 +3081,10 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
|
||||
<target>Odeslat přímou zprávu</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Send files via XFTP" xml:space="preserve">
|
||||
<source>Send files via XFTP</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Send link previews" xml:space="preserve">
|
||||
<source>Send link previews</source>
|
||||
<target>Odesílání náhledů odkazů</target>
|
||||
@@ -3127,11 +3220,21 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
|
||||
<target>Ukaž hovory v historii telefonu</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show developer options" xml:space="preserve">
|
||||
<source>Show developer options</source>
|
||||
<target>Zobrazit možnosti vývojáře</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show preview" xml:space="preserve">
|
||||
<source>Show preview</source>
|
||||
<target>Zobrazení náhledu</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show:" xml:space="preserve">
|
||||
<source>Show:</source>
|
||||
<target>Zobrazit:</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html)." xml:space="preserve">
|
||||
<source>SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).</source>
|
||||
<target>Zabezpečení SimpleX chatu bylo [auditováno společností Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).</target>
|
||||
@@ -3404,6 +3507,7 @@ Budeme přidávat redundantní servery, abychom zabránili ztrátě zpráv.</tar
|
||||
</trans-unit>
|
||||
<trans-unit id="There should be at least one visible user profile." xml:space="preserve">
|
||||
<source>There should be at least one visible user profile.</source>
|
||||
<target>Měl by tam být alespoň jeden viditelný uživatelský profil.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." xml:space="preserve">
|
||||
@@ -3475,6 +3579,7 @@ Před zapnutím této funkce budete vyzváni k dokončení ověření.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="To reveal your hidden profile, enter a full password into a search field in **Your chat profiles** page." xml:space="preserve">
|
||||
<source>To reveal your hidden profile, enter a full password into a search field in **Your chat profiles** page.</source>
|
||||
<target>Chcete-li odhalit svůj skrytý profil, zadejte celé heslo do vyhledávacího pole na stránce **Chat profily**.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
@@ -3534,6 +3639,17 @@ Před zapnutím této funkce budete vyzváni k dokončení ověření.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unhide" xml:space="preserve">
|
||||
<source>Unhide</source>
|
||||
<target>Odkrýt</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unhide chat profile" xml:space="preserve">
|
||||
<source>Unhide chat profile</source>
|
||||
<target>Odkrýt chat profil</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unhide profile" xml:space="preserve">
|
||||
<source>Unhide profile</source>
|
||||
<target>Odkrýt profil</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unknown caller" xml:space="preserve">
|
||||
@@ -3613,6 +3729,11 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
|
||||
<target>Aktualizace tohoto nastavení znovu připojí klienta ke všem serverům.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Upgrade and open chat" xml:space="preserve">
|
||||
<source>Upgrade and open chat</source>
|
||||
<target>Zvýšit a otevřít chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Use .onion hosts" xml:space="preserve">
|
||||
<source>Use .onion hosts</source>
|
||||
<target>Použít hostitele .onion</target>
|
||||
@@ -3718,6 +3839,11 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
|
||||
<target>Čekání na obrázek</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
|
||||
<source>Warning: you may lose some data!</source>
|
||||
<target>Upozornění: můžete ztratit nějaká data!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="WebRTC ICE servers" xml:space="preserve">
|
||||
<source>WebRTC ICE servers</source>
|
||||
<target>WebRTC servery ICE</target>
|
||||
@@ -3811,6 +3937,8 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
|
||||
<trans-unit id="You can hide or mute a user profile - swipe it to the right. SimpleX Lock must be enabled." xml:space="preserve">
|
||||
<source>You can hide or mute a user profile - swipe it to the right.
|
||||
SimpleX Lock must be enabled.</source>
|
||||
<target>Profil uživatele můžete skrýt nebo ztlumit - přejeďte prstem doprava.
|
||||
SimpleX zámek musí být povolen.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You can now send messages to %@" xml:space="preserve">
|
||||
@@ -3930,6 +4058,7 @@ SimpleX Lock must be enabled.</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
||||
<source>You will still receive calls and notifications from muted profiles when they are active.</source>
|
||||
<target>Stále budete přijímat volání a upozornění od umlčených profilů pokud budou aktivní.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You will stop receiving messages from this group. Chat history will be preserved." xml:space="preserve">
|
||||
@@ -4271,6 +4400,10 @@ Servery SimpleX nevidí váš profil.</target>
|
||||
<target>tvůrce</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="database version is newer than the app, but no down migration for: %@" xml:space="preserve">
|
||||
<source>database version is newer than the app, but no down migration for: %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="default (%@)" xml:space="preserve">
|
||||
<source>default (%@)</source>
|
||||
<target>výchozí (%@)</target>
|
||||
@@ -4286,6 +4419,10 @@ Servery SimpleX nevidí váš profil.</target>
|
||||
<target>odstraněna skupina</target>
|
||||
<note>rcv group event chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="different migration in the app/database: %@ / %@" xml:space="preserve">
|
||||
<source>different migration in the app/database: %@ / %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="direct" xml:space="preserve">
|
||||
<source>direct</source>
|
||||
<target>přímo</target>
|
||||
@@ -4592,6 +4729,11 @@ 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>
|
||||
|
||||
@@ -387,7 +387,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Add welcome message" xml:space="preserve">
|
||||
<source>Add welcome message</source>
|
||||
<target>Fügen Sie eine Begrüßungsmeldung hinzu</target>
|
||||
<target>Begrüßungsmeldung hinzufügen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Admins can create the links to join groups." xml:space="preserve">
|
||||
@@ -618,6 +618,11 @@
|
||||
<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">
|
||||
@@ -765,6 +770,11 @@
|
||||
<target>Bestätigen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm database upgrades" xml:space="preserve">
|
||||
<source>Confirm database upgrades</source>
|
||||
<target>Datenbank-Aktualisierungen bestätigen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm new passphrase…" xml:space="preserve">
|
||||
<source>Confirm new passphrase…</source>
|
||||
<target>Neues Passwort bestätigen…</target>
|
||||
@@ -772,7 +782,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm password" xml:space="preserve">
|
||||
<source>Confirm password</source>
|
||||
<target>Bestätigen Sie das Passwort</target>
|
||||
<target>Passwort bestätigen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Connect" xml:space="preserve">
|
||||
@@ -975,6 +985,16 @@
|
||||
<target>Datenbank-ID</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database IDs and Transport isolation option." xml:space="preserve">
|
||||
<source>Database IDs and Transport isolation option.</source>
|
||||
<target>Datenbank-IDs und Transport-Isolationsoption.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database downgrade" xml:space="preserve">
|
||||
<source>Database downgrade</source>
|
||||
<target>Datenbank-Herabstufung</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database encrypted!" xml:space="preserve">
|
||||
<source>Database encrypted!</source>
|
||||
<target>Datenbank verschlüsselt!</target>
|
||||
@@ -1029,6 +1049,11 @@
|
||||
<target>Das Datenbank-Passwort ist erforderlich, um den Chat zu öffnen.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database upgrade" xml:space="preserve">
|
||||
<source>Database upgrade</source>
|
||||
<target>Datenbank-Aktualisierung</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database will be encrypted and the passphrase stored in the keychain. " xml:space="preserve">
|
||||
<source>Database will be encrypted and the passphrase stored in the keychain.
|
||||
</source>
|
||||
@@ -1093,6 +1118,11 @@
|
||||
<target>Chat Archiv löschen?</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete chat profile" xml:space="preserve">
|
||||
<source>Delete chat profile</source>
|
||||
<target>Chat-Profil löschen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete chat profile?" xml:space="preserve">
|
||||
<source>Delete chat profile?</source>
|
||||
<target>Chat-Profil löschen?</target>
|
||||
@@ -1203,6 +1233,11 @@
|
||||
<target>Die ausstehende Verbindung löschen?</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete profile" xml:space="preserve">
|
||||
<source>Delete profile</source>
|
||||
<target>Profil löschen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete queue" xml:space="preserve">
|
||||
<source>Delete queue</source>
|
||||
<target>Lösche Warteschlange</target>
|
||||
@@ -1308,6 +1343,11 @@
|
||||
<target>Nicht nochmals anzeigen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Downgrade and open chat" xml:space="preserve">
|
||||
<source>Downgrade and open chat</source>
|
||||
<target>Herabstufen und den Chat öffnen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Duplicate display name!" xml:space="preserve">
|
||||
<source>Duplicate display name!</source>
|
||||
<target>Doppelter Anzeigename!</target>
|
||||
@@ -1383,6 +1423,10 @@
|
||||
<target>Verschlüsselte Nachricht: Datenbankfehler</target>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Encrypted message: database migration error" xml:space="preserve">
|
||||
<source>Encrypted message: database migration error</source>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Encrypted message: keychain error" xml:space="preserve">
|
||||
<source>Encrypted message: keychain error</source>
|
||||
<target>Verschlüsselte Nachricht: Schlüsselbundfehler</target>
|
||||
@@ -1410,7 +1454,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Enter password above to show!" xml:space="preserve">
|
||||
<source>Enter password above to show!</source>
|
||||
<target>Geben Sie oben das Passwort für die Anzeige an!</target>
|
||||
<target>Für die Anzeige das Passwort im Suchfeld eingeben!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Enter server manually" xml:space="preserve">
|
||||
@@ -1613,6 +1657,11 @@
|
||||
<target>Fehler beim Aktualisieren der Benutzer-Privatsphäre</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error: " xml:space="preserve">
|
||||
<source>Error: </source>
|
||||
<target>Fehler: </target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error: %@" xml:space="preserve">
|
||||
<source>Error: %@</source>
|
||||
<target>Fehler: %@</target>
|
||||
@@ -1633,6 +1682,10 @@
|
||||
<target>Beenden ohne Speichern</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Experimental" xml:space="preserve">
|
||||
<source>Experimental</source>
|
||||
<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>
|
||||
@@ -1658,6 +1711,16 @@
|
||||
<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>
|
||||
<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">
|
||||
<source>File will be received when your contact completes uploading it.</source>
|
||||
<target>Die Datei wird empfangen, sobald das Hochladen durch ihren Kontakt abgeschlossen ist.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="File will be received when your contact is online, please wait or check later!" xml:space="preserve">
|
||||
<source>File will be received when your contact is online, please wait or check later!</source>
|
||||
<target>Die Datei wird empfangen, sobald Ihr Kontakt online ist. Bitte warten oder schauen Sie später nochmal nach!</target>
|
||||
@@ -1850,7 +1913,12 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Hide profile" xml:space="preserve">
|
||||
<source>Hide profile</source>
|
||||
<target>Verberge das Profil</target>
|
||||
<target>Profil verbergen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Hide:" xml:space="preserve">
|
||||
<source>Hide:</source>
|
||||
<target>Verberge:</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="How SimpleX works" xml:space="preserve">
|
||||
@@ -1903,6 +1971,11 @@
|
||||
<target>Ignorieren</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Image will be received when your contact completes uploading it." xml:space="preserve">
|
||||
<source>Image will be received when your contact completes uploading it.</source>
|
||||
<target>Das Bild wird empfangen, sobald das Hochladen durch ihren Kontakt abgeschlossen ist.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Image will be received when your contact is online, please wait or check later!" xml:space="preserve">
|
||||
<source>Image will be received when your contact is online, please wait or check later!</source>
|
||||
<target>Das Bild wird empfangen, sobald Ihr Kontakt online ist. Bitte warten oder schauen Sie später nochmal nach!</target>
|
||||
@@ -1973,6 +2046,11 @@
|
||||
<target>Eingehender Videoanruf</target>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Incompatible database version" xml:space="preserve">
|
||||
<source>Incompatible database version</source>
|
||||
<target>Inkompatible Datenbank-Version</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Incorrect security code!" xml:space="preserve">
|
||||
<source>Incorrect security code!</source>
|
||||
<target>Falscher Sicherheitscode!</target>
|
||||
@@ -2162,7 +2240,7 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
|
||||
</trans-unit>
|
||||
<trans-unit id="Make profile private!" xml:space="preserve">
|
||||
<source>Make profile private!</source>
|
||||
<target>Erzeugen Sie ein privates Profil!</target>
|
||||
<target>Privates Profil erzeugen!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Make sure SMP server addresses are in correct format, line separated and are not duplicated (%@)." xml:space="preserve">
|
||||
@@ -2265,6 +2343,10 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
|
||||
<target>Die Migration wurde abgeschlossen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrations: %@" xml:space="preserve">
|
||||
<source>Migrations: %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Moderate" xml:space="preserve">
|
||||
<source>Moderate</source>
|
||||
<target>Moderieren</target>
|
||||
@@ -2659,6 +2741,11 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
|
||||
<target>Profilbild</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Profile password" xml:space="preserve">
|
||||
<source>Profile password</source>
|
||||
<target>Passwort für Profil</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>Unwiederbringliches löschen von Nachrichten nicht erlauben.</target>
|
||||
@@ -2686,7 +2773,7 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
|
||||
</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>Schützen Sie Ihre Chat-Profile mit einem Passwort!</target>
|
||||
<target>Ihre Chat-Profile mit einem Passwort schützen!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Protocol timeout" xml:space="preserve">
|
||||
@@ -2886,7 +2973,7 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
|
||||
</trans-unit>
|
||||
<trans-unit id="Save and update group profile" xml:space="preserve">
|
||||
<source>Save and update group profile</source>
|
||||
<target>Sichern und aktualisieren des Gruppen-Profils</target>
|
||||
<target>Gruppen-Profil sichern und aktualisieren</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Save archive" xml:space="preserve">
|
||||
@@ -2994,6 +3081,10 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
|
||||
<target>Direktnachricht senden</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>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Send link previews" xml:space="preserve">
|
||||
<source>Send link previews</source>
|
||||
<target>Link-Vorschau senden</target>
|
||||
@@ -3086,7 +3177,7 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
|
||||
</trans-unit>
|
||||
<trans-unit id="Set the message shown to new members!" xml:space="preserve">
|
||||
<source>Set the message shown to new members!</source>
|
||||
<target>Legen Sie die Nachricht fest, die neuen Mitgliedern angezeigt werden soll!</target>
|
||||
<target>Definieren Sie eine Begrüßungsmeldung, die neuen Mitgliedern angezeigt wird!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Set timeouts for proxy/VPN" xml:space="preserve">
|
||||
@@ -3126,7 +3217,12 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
|
||||
</trans-unit>
|
||||
<trans-unit id="Show calls in phone history" xml:space="preserve">
|
||||
<source>Show calls in phone history</source>
|
||||
<target>Anrufliste zeigen</target>
|
||||
<target>Anrufliste anzeigen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show developer options" xml:space="preserve">
|
||||
<source>Show developer options</source>
|
||||
<target>Entwickleroptionen anzeigen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show preview" xml:space="preserve">
|
||||
@@ -3134,6 +3230,11 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
|
||||
<target>Vorschau anzeigen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show:" xml:space="preserve">
|
||||
<source>Show:</source>
|
||||
<target>Anzeigen:</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html)." xml:space="preserve">
|
||||
<source>SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).</source>
|
||||
<target>Die Sicherheit von SimpleX Chat wurde [von Trail of Bits überprüft](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).</target>
|
||||
@@ -3541,6 +3642,16 @@ Sie werden aufgefordert, die Authentifizierung abzuschließen, bevor diese Funkt
|
||||
<target>Verbergen aufheben</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unhide chat profile" xml:space="preserve">
|
||||
<source>Unhide chat profile</source>
|
||||
<target>Verbergen des Chat-Profils aufheben</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unhide profile" xml:space="preserve">
|
||||
<source>Unhide profile</source>
|
||||
<target>Verbergen des Profils aufheben</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unknown caller" xml:space="preserve">
|
||||
<source>Unknown caller</source>
|
||||
<target>Anrufer unbekannt</target>
|
||||
@@ -3618,6 +3729,11 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
|
||||
<target>Die Aktualisierung dieser Einstellung wird den Client wieder mit allen Servern verbinden.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Upgrade and open chat" xml:space="preserve">
|
||||
<source>Upgrade and open chat</source>
|
||||
<target>Aktualisieren und den Chat öffnen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Use .onion hosts" xml:space="preserve">
|
||||
<source>Use .onion hosts</source>
|
||||
<target>Verwende .onion-Hosts</target>
|
||||
@@ -3640,7 +3756,7 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
|
||||
</trans-unit>
|
||||
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
||||
<source>Use iOS call interface</source>
|
||||
<target>Benutzen Sie die iOS Anrufschnittstelle</target>
|
||||
<target>iOS Anrufschnittstelle nutzen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Use server" xml:space="preserve">
|
||||
@@ -3723,6 +3839,11 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
|
||||
<target>Warten auf ein Bild</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
|
||||
<source>Warning: you may lose some data!</source>
|
||||
<target>Warnung: Sie könnten einige Daten verlieren!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="WebRTC ICE servers" xml:space="preserve">
|
||||
<source>WebRTC ICE servers</source>
|
||||
<target>WebRTC ICE-Server</target>
|
||||
@@ -4279,6 +4400,10 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
|
||||
<target>Ersteller</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="database version is newer than the app, but no down migration for: %@" xml:space="preserve">
|
||||
<source>database version is newer than the app, but no down migration for: %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="default (%@)" xml:space="preserve">
|
||||
<source>default (%@)</source>
|
||||
<target>Voreinstellung (%@)</target>
|
||||
@@ -4294,6 +4419,10 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
|
||||
<target>Gruppe gelöscht</target>
|
||||
<note>rcv group event chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="different migration in the app/database: %@ / %@" xml:space="preserve">
|
||||
<source>different migration in the app/database: %@ / %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="direct" xml:space="preserve">
|
||||
<source>direct</source>
|
||||
<target>direkt</target>
|
||||
@@ -4466,7 +4595,7 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="moderated by %@" xml:space="preserve">
|
||||
<source>moderated by %@</source>
|
||||
<target>von %@ moderiert</target>
|
||||
<target>Von %@ moderiert</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="never" xml:space="preserve">
|
||||
@@ -4600,6 +4729,11 @@ 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>
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
<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">
|
||||
@@ -765,6 +770,11 @@
|
||||
<target>Confirm</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm database upgrades" xml:space="preserve">
|
||||
<source>Confirm database upgrades</source>
|
||||
<target>Confirm database upgrades</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm new passphrase…" xml:space="preserve">
|
||||
<source>Confirm new passphrase…</source>
|
||||
<target>Confirm new passphrase…</target>
|
||||
@@ -975,6 +985,16 @@
|
||||
<target>Database ID</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database IDs and Transport isolation option." xml:space="preserve">
|
||||
<source>Database IDs and Transport isolation option.</source>
|
||||
<target>Database IDs and Transport isolation option.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database downgrade" xml:space="preserve">
|
||||
<source>Database downgrade</source>
|
||||
<target>Database downgrade</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database encrypted!" xml:space="preserve">
|
||||
<source>Database encrypted!</source>
|
||||
<target>Database encrypted!</target>
|
||||
@@ -1029,6 +1049,11 @@
|
||||
<target>Database passphrase is required to open chat.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database upgrade" xml:space="preserve">
|
||||
<source>Database upgrade</source>
|
||||
<target>Database upgrade</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database will be encrypted and the passphrase stored in the keychain. " xml:space="preserve">
|
||||
<source>Database will be encrypted and the passphrase stored in the keychain.
|
||||
</source>
|
||||
@@ -1093,6 +1118,11 @@
|
||||
<target>Delete chat archive?</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete chat profile" xml:space="preserve">
|
||||
<source>Delete chat profile</source>
|
||||
<target>Delete chat profile</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete chat profile?" xml:space="preserve">
|
||||
<source>Delete chat profile?</source>
|
||||
<target>Delete chat profile?</target>
|
||||
@@ -1203,6 +1233,11 @@
|
||||
<target>Delete pending connection?</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete profile" xml:space="preserve">
|
||||
<source>Delete profile</source>
|
||||
<target>Delete profile</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete queue" xml:space="preserve">
|
||||
<source>Delete queue</source>
|
||||
<target>Delete queue</target>
|
||||
@@ -1308,6 +1343,11 @@
|
||||
<target>Don't show again</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Downgrade and open chat" xml:space="preserve">
|
||||
<source>Downgrade and open chat</source>
|
||||
<target>Downgrade and open chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Duplicate display name!" xml:space="preserve">
|
||||
<source>Duplicate display name!</source>
|
||||
<target>Duplicate display name!</target>
|
||||
@@ -1383,6 +1423,11 @@
|
||||
<target>Encrypted message: database error</target>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Encrypted message: database migration error" xml:space="preserve">
|
||||
<source>Encrypted message: database migration error</source>
|
||||
<target>Encrypted message: database migration error</target>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Encrypted message: keychain error" xml:space="preserve">
|
||||
<source>Encrypted message: keychain error</source>
|
||||
<target>Encrypted message: keychain error</target>
|
||||
@@ -1613,6 +1658,11 @@
|
||||
<target>Error updating user privacy</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error: " xml:space="preserve">
|
||||
<source>Error: </source>
|
||||
<target>Error: </target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error: %@" xml:space="preserve">
|
||||
<source>Error: %@</source>
|
||||
<target>Error: %@</target>
|
||||
@@ -1633,6 +1683,11 @@
|
||||
<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>
|
||||
@@ -1658,6 +1713,16 @@
|
||||
<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>
|
||||
<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">
|
||||
<source>File will be received when your contact completes uploading it.</source>
|
||||
<target>File will be received when your contact completes uploading it.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="File will be received when your contact is online, please wait or check later!" xml:space="preserve">
|
||||
<source>File will be received when your contact is online, please wait or check later!</source>
|
||||
<target>File will be received when your contact is online, please wait or check later!</target>
|
||||
@@ -1853,6 +1918,11 @@
|
||||
<target>Hide profile</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Hide:" xml:space="preserve">
|
||||
<source>Hide:</source>
|
||||
<target>Hide:</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="How SimpleX works" xml:space="preserve">
|
||||
<source>How SimpleX works</source>
|
||||
<target>How SimpleX works</target>
|
||||
@@ -1903,6 +1973,11 @@
|
||||
<target>Ignore</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Image will be received when your contact completes uploading it." xml:space="preserve">
|
||||
<source>Image will be received when your contact completes uploading it.</source>
|
||||
<target>Image will be received when your contact completes uploading it.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Image will be received when your contact is online, please wait or check later!" xml:space="preserve">
|
||||
<source>Image will be received when your contact is online, please wait or check later!</source>
|
||||
<target>Image will be received when your contact is online, please wait or check later!</target>
|
||||
@@ -1973,6 +2048,11 @@
|
||||
<target>Incoming video call</target>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Incompatible database version" xml:space="preserve">
|
||||
<source>Incompatible database version</source>
|
||||
<target>Incompatible database version</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Incorrect security code!" xml:space="preserve">
|
||||
<source>Incorrect security code!</source>
|
||||
<target>Incorrect security code!</target>
|
||||
@@ -2265,6 +2345,11 @@ We will be adding server redundancy to prevent lost messages.</target>
|
||||
<target>Migration is completed</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrations: %@" xml:space="preserve">
|
||||
<source>Migrations: %@</source>
|
||||
<target>Migrations: %@</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Moderate" xml:space="preserve">
|
||||
<source>Moderate</source>
|
||||
<target>Moderate</target>
|
||||
@@ -2659,6 +2744,11 @@ We will be adding server redundancy to prevent lost messages.</target>
|
||||
<target>Profile image</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Profile password" xml:space="preserve">
|
||||
<source>Profile password</source>
|
||||
<target>Profile password</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>
|
||||
@@ -2994,6 +3084,11 @@ We will be adding server redundancy to prevent lost messages.</target>
|
||||
<target>Send direct message</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="Send link previews" xml:space="preserve">
|
||||
<source>Send link previews</source>
|
||||
<target>Send link previews</target>
|
||||
@@ -3129,11 +3224,21 @@ We will be adding server redundancy to prevent lost messages.</target>
|
||||
<target>Show calls in phone history</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show developer options" xml:space="preserve">
|
||||
<source>Show developer options</source>
|
||||
<target>Show developer options</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show preview" xml:space="preserve">
|
||||
<source>Show preview</source>
|
||||
<target>Show preview</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show:" xml:space="preserve">
|
||||
<source>Show:</source>
|
||||
<target>Show:</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html)." xml:space="preserve">
|
||||
<source>SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).</source>
|
||||
<target>SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).</target>
|
||||
@@ -3541,6 +3646,16 @@ You will be prompted to complete authentication before this feature is enabled.<
|
||||
<target>Unhide</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unhide chat profile" xml:space="preserve">
|
||||
<source>Unhide chat profile</source>
|
||||
<target>Unhide chat profile</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unhide profile" xml:space="preserve">
|
||||
<source>Unhide profile</source>
|
||||
<target>Unhide profile</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unknown caller" xml:space="preserve">
|
||||
<source>Unknown caller</source>
|
||||
<target>Unknown caller</target>
|
||||
@@ -3618,6 +3733,11 @@ To connect, please ask your contact to create another connection link and check
|
||||
<target>Updating this setting will re-connect the client to all servers.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Upgrade and open chat" xml:space="preserve">
|
||||
<source>Upgrade and open chat</source>
|
||||
<target>Upgrade and open chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Use .onion hosts" xml:space="preserve">
|
||||
<source>Use .onion hosts</source>
|
||||
<target>Use .onion hosts</target>
|
||||
@@ -3723,6 +3843,11 @@ To connect, please ask your contact to create another connection link and check
|
||||
<target>Waiting for image</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
|
||||
<source>Warning: you may lose some data!</source>
|
||||
<target>Warning: you may lose some data!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="WebRTC ICE servers" xml:space="preserve">
|
||||
<source>WebRTC ICE servers</source>
|
||||
<target>WebRTC ICE servers</target>
|
||||
@@ -4279,6 +4404,11 @@ SimpleX servers cannot see your profile.</target>
|
||||
<target>creator</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="database version is newer than the app, but no down migration for: %@" xml:space="preserve">
|
||||
<source>database version is newer than the app, but no down migration for: %@</source>
|
||||
<target>database version is newer than the app, but no down migration for: %@</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="default (%@)" xml:space="preserve">
|
||||
<source>default (%@)</source>
|
||||
<target>default (%@)</target>
|
||||
@@ -4294,6 +4424,11 @@ SimpleX servers cannot see your profile.</target>
|
||||
<target>deleted group</target>
|
||||
<note>rcv group event chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="different migration in the app/database: %@ / %@" xml:space="preserve">
|
||||
<source>different migration in the app/database: %@ / %@</source>
|
||||
<target>different migration in the app/database: %@ / %@</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="direct" xml:space="preserve">
|
||||
<source>direct</source>
|
||||
<target>direct</target>
|
||||
@@ -4600,6 +4735,11 @@ 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>
|
||||
|
||||
@@ -527,7 +527,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Audio & video calls" xml:space="preserve">
|
||||
<source>Audio & video calls</source>
|
||||
<target>Llamadas de audio y vídeo</target>
|
||||
<target>Llamadas y videollamadas</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Audio and video calls" xml:space="preserve">
|
||||
@@ -618,6 +618,11 @@
|
||||
<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">
|
||||
@@ -692,12 +697,12 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Chat is stopped" xml:space="preserve">
|
||||
<source>Chat is stopped</source>
|
||||
<target>El chat está detenido</target>
|
||||
<target>Chat está detenido</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Chat preferences" xml:space="preserve">
|
||||
<source>Chat preferences</source>
|
||||
<target>Preferencias de chat</target>
|
||||
<target>Preferencias de Chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Chats" xml:space="preserve">
|
||||
@@ -765,6 +770,11 @@
|
||||
<target>Confirmar</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm database upgrades" xml:space="preserve">
|
||||
<source>Confirm database upgrades</source>
|
||||
<target>Confirmar actualizaciones de la bases de datos</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm new passphrase…" xml:space="preserve">
|
||||
<source>Confirm new passphrase…</source>
|
||||
<target>Confirme nueva contraseña…</target>
|
||||
@@ -975,6 +985,16 @@
|
||||
<target>ID de la base de datos</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database IDs and Transport isolation option." xml:space="preserve">
|
||||
<source>Database IDs and Transport isolation option.</source>
|
||||
<target>ID de base de datos y opción de aislamiento de transporte.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database downgrade" xml:space="preserve">
|
||||
<source>Database downgrade</source>
|
||||
<target>Degradación de la base de datos</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database encrypted!" xml:space="preserve">
|
||||
<source>Database encrypted!</source>
|
||||
<target>¡Base de datos cifrada!</target>
|
||||
@@ -1016,7 +1036,8 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Database passphrase & export" xml:space="preserve">
|
||||
<source>Database passphrase & export</source>
|
||||
<target>Contraseña y exportar la base de datos</target>
|
||||
<target>Base de datos
|
||||
y frase de contraseña</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database passphrase is different from saved in the keychain." xml:space="preserve">
|
||||
@@ -1029,6 +1050,11 @@
|
||||
<target>Para abrir la aplicación se requiere la contraseña de la base de datos.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database upgrade" xml:space="preserve">
|
||||
<source>Database upgrade</source>
|
||||
<target>Actualización de la base de datos</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database will be encrypted and the passphrase stored in the keychain. " xml:space="preserve">
|
||||
<source>Database will be encrypted and the passphrase stored in the keychain.
|
||||
</source>
|
||||
@@ -1075,7 +1101,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete after" xml:space="preserve">
|
||||
<source>Delete after</source>
|
||||
<target>Eliminar después</target>
|
||||
<target>Eliminar después de</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete all files" xml:space="preserve">
|
||||
@@ -1093,6 +1119,11 @@
|
||||
<target>¿Eliminar archivo del chat?</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete chat profile" xml:space="preserve">
|
||||
<source>Delete chat profile</source>
|
||||
<target>Eliminar perfil de chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete chat profile?" xml:space="preserve">
|
||||
<source>Delete chat profile?</source>
|
||||
<target>¿Eliminar el perfil de chat?</target>
|
||||
@@ -1125,7 +1156,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete files for all chat profiles" xml:space="preserve">
|
||||
<source>Delete files for all chat profiles</source>
|
||||
<target>Eliminar archivos para todos los perfiles de chat</target>
|
||||
<target>Eliminar archivos para todos los perfiles Chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete for everyone" xml:space="preserve">
|
||||
@@ -1180,7 +1211,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete messages after" xml:space="preserve">
|
||||
<source>Delete messages after</source>
|
||||
<target>Eliminar mensaje después</target>
|
||||
<target>Eliminar después de</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete old database" xml:space="preserve">
|
||||
@@ -1203,6 +1234,11 @@
|
||||
<target>¿Eliminar conexion pendiente?</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete profile" xml:space="preserve">
|
||||
<source>Delete profile</source>
|
||||
<target>Eliminar perfil</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete queue" xml:space="preserve">
|
||||
<source>Delete queue</source>
|
||||
<target>Eliminar cola</target>
|
||||
@@ -1255,7 +1291,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Direct messages between members are prohibited in this group." xml:space="preserve">
|
||||
<source>Direct messages between members are prohibited in this group.</source>
|
||||
<target>Los mensajes directos entre miembros del grupo están prohibidos.</target>
|
||||
<target>Los mensajes directos entre miembros del grupo no están permitidos.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Disable SimpleX Lock" xml:space="preserve">
|
||||
@@ -1270,12 +1306,12 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Disappearing messages are prohibited in this chat." xml:space="preserve">
|
||||
<source>Disappearing messages are prohibited in this chat.</source>
|
||||
<target>Los mensajes temporales están prohibidos en este chat.</target>
|
||||
<target>Los mensajes temporales no están permitidos en este chat.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Disappearing messages are prohibited in this group." xml:space="preserve">
|
||||
<source>Disappearing messages are prohibited in this group.</source>
|
||||
<target>Los mensajes temporales están prohibidos en este grupo.</target>
|
||||
<target>Los mensajes temporales no están permitidos en este grupo.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Disconnect" xml:space="preserve">
|
||||
@@ -1308,6 +1344,11 @@
|
||||
<target>No mostrar de nuevo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Downgrade and open chat" xml:space="preserve">
|
||||
<source>Downgrade and open chat</source>
|
||||
<target>Degradar y abrir Chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Duplicate display name!" xml:space="preserve">
|
||||
<source>Duplicate display name!</source>
|
||||
<target>¡Nombre mostrado duplicado!</target>
|
||||
@@ -1383,6 +1424,10 @@
|
||||
<target>Mensaje cifrado: error en base de datos</target>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Encrypted message: database migration error" xml:space="preserve">
|
||||
<source>Encrypted message: database migration error</source>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Encrypted message: keychain error" xml:space="preserve">
|
||||
<source>Encrypted message: keychain error</source>
|
||||
<target>Mensaje cifrado: error en Keychain</target>
|
||||
@@ -1585,7 +1630,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Error stopping chat" xml:space="preserve">
|
||||
<source>Error stopping chat</source>
|
||||
<target>Error deteniendo el chat</target>
|
||||
<target>Error deteniendo Chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error switching profile!" xml:space="preserve">
|
||||
@@ -1613,6 +1658,11 @@
|
||||
<target>Error actualizando la privacidad de usuario</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error: " xml:space="preserve">
|
||||
<source>Error: </source>
|
||||
<target>Error: </target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error: %@" xml:space="preserve">
|
||||
<source>Error: %@</source>
|
||||
<target>Error: %@</target>
|
||||
@@ -1633,6 +1683,10 @@
|
||||
<target>Salir sin guardar</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Experimental" xml:space="preserve">
|
||||
<source>Experimental</source>
|
||||
<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>
|
||||
@@ -1658,6 +1712,16 @@
|
||||
<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>
|
||||
<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">
|
||||
<source>File will be received when your contact completes uploading it.</source>
|
||||
<target>El archivo se recibirá cuando tu contacto termine de subirlo.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="File will be received when your contact is online, please wait or check later!" xml:space="preserve">
|
||||
<source>File will be received when your contact is online, please wait or check later!</source>
|
||||
<target>El archivo se recibirá cuando tu contacto esté en línea, por favor espera o compruébalo más tarde.</target>
|
||||
@@ -1790,7 +1854,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Group preferences" xml:space="preserve">
|
||||
<source>Group preferences</source>
|
||||
<target>Preferencias del grupo</target>
|
||||
<target>Preferencias de grupo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Group profile" xml:space="preserve">
|
||||
@@ -1853,6 +1917,11 @@
|
||||
<target>Ocultar perfil</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Hide:" xml:space="preserve">
|
||||
<source>Hide:</source>
|
||||
<target>Ocultar:</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="How SimpleX works" xml:space="preserve">
|
||||
<source>How SimpleX works</source>
|
||||
<target>Cómo funciona SimpleX</target>
|
||||
@@ -1870,7 +1939,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="How to use it" xml:space="preserve">
|
||||
<source>How to use it</source>
|
||||
<target>Cómo usar</target>
|
||||
<target>Guia de uso</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="How to use your servers" xml:space="preserve">
|
||||
@@ -1903,6 +1972,11 @@
|
||||
<target>Ignorar</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Image will be received when your contact completes uploading it." xml:space="preserve">
|
||||
<source>Image will be received when your contact completes uploading it.</source>
|
||||
<target>La imagen se recibirá cuando tu contacto termine de subirla.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Image will be received when your contact is online, please wait or check later!" xml:space="preserve">
|
||||
<source>Image will be received when your contact is online, please wait or check later!</source>
|
||||
<target>La imagen se recibirá cuando tu contacto esté en línea, por favor espera o compruébalo más tarde.</target>
|
||||
@@ -1973,6 +2047,11 @@
|
||||
<target>Videollamada entrante</target>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Incompatible database version" xml:space="preserve">
|
||||
<source>Incompatible database version</source>
|
||||
<target>Versión de base de datos incompatible</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Incorrect security code!" xml:space="preserve">
|
||||
<source>Incorrect security code!</source>
|
||||
<target>¡Código de seguridad incorrecto!</target>
|
||||
@@ -2032,17 +2111,17 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Irreversible message deletion" xml:space="preserve">
|
||||
<source>Irreversible message deletion</source>
|
||||
<target>Eliminación del mensaje irreversible</target>
|
||||
<target>Eliminación irreversible del mensaje</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Irreversible message deletion is prohibited in this chat." xml:space="preserve">
|
||||
<source>Irreversible message deletion is prohibited in this chat.</source>
|
||||
<target>La eliminación irreversible de mensajes está prohibida en este chat.</target>
|
||||
<target>La eliminación irreversible de mensajes no está permitida en este chat.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Irreversible message deletion is prohibited in this group." xml:space="preserve">
|
||||
<source>Irreversible message deletion is prohibited in this group.</source>
|
||||
<target>La eliminación irreversible de mensajes está prohibida en este grupo.</target>
|
||||
<target>La eliminación irreversible de mensajes no está permitida en este grupo.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</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">
|
||||
@@ -2197,7 +2276,7 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
|
||||
</trans-unit>
|
||||
<trans-unit id="Markdown in messages" xml:space="preserve">
|
||||
<source>Markdown in messages</source>
|
||||
<target>Marcadores en mensajes</target>
|
||||
<target>Sintaxis markdown en mensajes</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Max 30 seconds, received instantly." xml:space="preserve">
|
||||
@@ -2257,7 +2336,7 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
|
||||
</trans-unit>
|
||||
<trans-unit id="Migration failed. Tap **Skip** below to continue using the current database. Please report the issue to the app developers via chat or email [chat@simplex.chat](mailto:chat@simplex.chat)." xml:space="preserve">
|
||||
<source>Migration failed. Tap **Skip** below to continue using the current database. Please report the issue to the app developers via chat or email [chat@simplex.chat](mailto:chat@simplex.chat).</source>
|
||||
<target>Error de migración. A continuación pulsa **Omitir** para seguir usando la base de datos actual. Informa del problema a los desarrolladores de la aplicación a través de SimpleX o por correo electrónico a [chat@simplex.chat](mailto:chat@simplex.chat).</target>
|
||||
<target>Error de migración. A continuación pulsa **Omitir** para seguir usando la base de datos actual. Por favor, informa a los desarrolladores de la aplicación a través de SimpleX o por correo electrónico a [chat@simplex.chat](mailto:chat@simplex.chat).</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migration is completed" xml:space="preserve">
|
||||
@@ -2265,6 +2344,10 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
|
||||
<target>Migración completada</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrations: %@" xml:space="preserve">
|
||||
<source>Migrations: %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Moderate" xml:space="preserve">
|
||||
<source>Moderate</source>
|
||||
<target>Moderar</target>
|
||||
@@ -2451,7 +2534,7 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
|
||||
</trans-unit>
|
||||
<trans-unit id="Only group owners can change group preferences." xml:space="preserve">
|
||||
<source>Only group owners can change group preferences.</source>
|
||||
<target>Sólo los propietarios del grupo pueden cambiar las preferencias de grupo.</target>
|
||||
<target>Sólo los propietarios del grupo pueden modificar las preferencias de grupo.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only group owners can enable voice messages." xml:space="preserve">
|
||||
@@ -2659,6 +2742,11 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
|
||||
<target>Imagen del perfil</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Profile password" xml:space="preserve">
|
||||
<source>Profile password</source>
|
||||
<target>Contraseña del perfil</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>Prohibir la eliminación irreversible de mensajes.</target>
|
||||
@@ -2686,7 +2774,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>¡Proteje los perfiles de Chat con contraseña!</target>
|
||||
<target>¡Protege tus perfiles Chat con contraseña!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Protocol timeout" xml:space="preserve">
|
||||
@@ -2994,6 +3082,10 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
|
||||
<target>Enviar mensaje directo</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>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Send link previews" xml:space="preserve">
|
||||
<source>Send link previews</source>
|
||||
<target>Enviar previsualizaciones de enlaces</target>
|
||||
@@ -3016,7 +3108,7 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
|
||||
</trans-unit>
|
||||
<trans-unit id="Send questions and ideas" xml:space="preserve">
|
||||
<source>Send questions and ideas</source>
|
||||
<target>Envía preguntas e ideas</target>
|
||||
<target>Consultas y sugerencias</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Send them from gallery or custom keyboards." xml:space="preserve">
|
||||
@@ -3071,7 +3163,7 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
|
||||
</trans-unit>
|
||||
<trans-unit id="Set contact name…" xml:space="preserve">
|
||||
<source>Set contact name…</source>
|
||||
<target>Introduce el nombre del contacto…</target>
|
||||
<target>Escribe el nombre del contacto…</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Set group preferences" xml:space="preserve">
|
||||
@@ -3081,7 +3173,7 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
|
||||
</trans-unit>
|
||||
<trans-unit id="Set passphrase to export" xml:space="preserve">
|
||||
<source>Set passphrase to export</source>
|
||||
<target>Seleccióna contraseña para exportar</target>
|
||||
<target>Escribe la contraseña para exportar</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Set the message shown to new members!" xml:space="preserve">
|
||||
@@ -3129,11 +3221,21 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
|
||||
<target>Mostrar llamadas en el historial del teléfono</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show developer options" xml:space="preserve">
|
||||
<source>Show developer options</source>
|
||||
<target>Mostrar opciones de desarrollador</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show preview" xml:space="preserve">
|
||||
<source>Show preview</source>
|
||||
<target>Mostrar vista previa</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show:" xml:space="preserve">
|
||||
<source>Show:</source>
|
||||
<target>Mostrar:</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html)." xml:space="preserve">
|
||||
<source>SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).</source>
|
||||
<target>La seguridad de SimpleX Chat fue [auditada por Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).</target>
|
||||
@@ -3216,12 +3318,12 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
|
||||
</trans-unit>
|
||||
<trans-unit id="Stop chat to enable database actions" xml:space="preserve">
|
||||
<source>Stop chat to enable database actions</source>
|
||||
<target>Detener Chat para habilitar acciones sobre la base de datos</target>
|
||||
<target>Detén Chat para habilitar las acciones sobre la base de datos</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Stop chat to export, import or delete chat database. You will not be able to receive and send messages while the chat is stopped." xml:space="preserve">
|
||||
<source>Stop chat to export, import or delete chat database. You will not be able to receive and send messages while the chat is stopped.</source>
|
||||
<target>Detener Chat para exportar, importar o eliminar la base de datos del chat. No podrá recibir ni enviar mensajes mientras el chat esté detenido.</target>
|
||||
<target>Detén Chat para poder exportar, importar o eliminar la base de datos. No puedes recibir ni enviar mensajes mientras Chat esté detenido.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Stop chat?" xml:space="preserve">
|
||||
@@ -3436,7 +3538,7 @@ Añadiremos redundancia de servidores para evitar la pérdida de mensajes.</targ
|
||||
</trans-unit>
|
||||
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
||||
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
||||
<target>Esta configuración se aplica a los mensajes en su perfil actual de Chat **%@**.</target>
|
||||
<target>Esta configuración se aplica a los mensajes en su perfil actual **%@**.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To ask any questions and to receive updates:" xml:space="preserve">
|
||||
@@ -3541,6 +3643,16 @@ Se te pedirá que completes la autenticación antes de activar esta función.</t
|
||||
<target>Mostrar</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unhide chat profile" xml:space="preserve">
|
||||
<source>Unhide chat profile</source>
|
||||
<target>Mostrar perfil de chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unhide profile" xml:space="preserve">
|
||||
<source>Unhide profile</source>
|
||||
<target>Mostrar perfil</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unknown caller" xml:space="preserve">
|
||||
<source>Unknown caller</source>
|
||||
<target>Llamada desconocida</target>
|
||||
@@ -3619,6 +3731,11 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
|
||||
<target>Al actualizar esta configuración el cliente se reconectará a todos los servidores.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Upgrade and open chat" xml:space="preserve">
|
||||
<source>Upgrade and open chat</source>
|
||||
<target>Actualizar y abrir Chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Use .onion hosts" xml:space="preserve">
|
||||
<source>Use .onion hosts</source>
|
||||
<target>Usar hosts .onion</target>
|
||||
@@ -3696,12 +3813,12 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
|
||||
</trans-unit>
|
||||
<trans-unit id="Voice messages are prohibited in this chat." xml:space="preserve">
|
||||
<source>Voice messages are prohibited in this chat.</source>
|
||||
<target>Los mensajes de voz están prohibidos en este chat.</target>
|
||||
<target>Los mensajes de voz no están permitidos en este chat.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Voice messages are prohibited in this group." xml:space="preserve">
|
||||
<source>Voice messages are prohibited in this group.</source>
|
||||
<target>Los mensajes de voz están prohibidos en este grupo.</target>
|
||||
<target>Los mensajes de voz no están permitidos en este grupo.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Voice messages prohibited!" xml:space="preserve">
|
||||
@@ -3724,6 +3841,11 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
|
||||
<target>Esperando imagen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
|
||||
<source>Warning: you may lose some data!</source>
|
||||
<target>Atención: ¡puedes perder algunos datos!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="WebRTC ICE servers" xml:space="preserve">
|
||||
<source>WebRTC ICE servers</source>
|
||||
<target>Servidores WebRTC ICE</target>
|
||||
@@ -3848,7 +3970,7 @@ SimpleX Lock debe estar activado.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="You can use markdown to format messages:" xml:space="preserve">
|
||||
<source>You can use markdown to format messages:</source>
|
||||
<target>Puedes usar marcadores para dar formato a los mensajes:</target>
|
||||
<target>Puedes usar sintaxis markdown para dar formato a los mensajes:</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You can't send messages!" xml:space="preserve">
|
||||
@@ -3893,7 +4015,7 @@ SimpleX Lock debe estar activado.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="You must use the most recent version of your chat database on one device ONLY, otherwise you may stop receiving the messages from some contacts." xml:space="preserve">
|
||||
<source>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.</source>
|
||||
<target>Debes usar la versión más reciente de tu base de datos SÓLO en un dispositivo, de lo contrario podrías dejar de recibir mensajes de algunos contactos.</target>
|
||||
<target>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.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You need to allow your contact to send voice messages to be able to send them." xml:space="preserve">
|
||||
@@ -3978,7 +4100,7 @@ SimpleX Lock debe estar activado.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your chat database" xml:space="preserve">
|
||||
<source>Your chat database</source>
|
||||
<target>Base de datos</target>
|
||||
<target>Base de datos Chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your chat database is not encrypted - set passphrase to encrypt it." xml:space="preserve">
|
||||
@@ -3988,17 +4110,17 @@ SimpleX Lock debe estar activado.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your chat profile will be sent to group members" xml:space="preserve">
|
||||
<source>Your chat profile will be sent to group members</source>
|
||||
<target>Tu perfil de chat se enviará a los miembros del grupo</target>
|
||||
<target>Tu perfil Chat será enviado a los miembros del grupo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your chat profile will be sent to your contact" xml:space="preserve">
|
||||
<source>Your chat profile will be sent to your contact</source>
|
||||
<target>Tu perfil de chat se enviará a tu contacto</target>
|
||||
<target>Tu perfil Chat será enviado a tu contacto</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your chat profiles" xml:space="preserve">
|
||||
<source>Your chat profiles</source>
|
||||
<target>Tus perfiles de chat</target>
|
||||
<target>Tus perfiles Chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your chats" xml:space="preserve">
|
||||
@@ -4280,6 +4402,10 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
|
||||
<target>creador</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="database version is newer than the app, but no down migration for: %@" xml:space="preserve">
|
||||
<source>database version is newer than the app, but no down migration for: %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="default (%@)" xml:space="preserve">
|
||||
<source>default (%@)</source>
|
||||
<target>por defecto (%@)</target>
|
||||
@@ -4295,6 +4421,10 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
|
||||
<target>grupo eliminado</target>
|
||||
<note>rcv group event chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="different migration in the app/database: %@ / %@" xml:space="preserve">
|
||||
<source>different migration in the app/database: %@ / %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="direct" xml:space="preserve">
|
||||
<source>direct</source>
|
||||
<target>directo</target>
|
||||
@@ -4518,7 +4648,7 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="or chat with the developers" xml:space="preserve">
|
||||
<source>or chat with the developers</source>
|
||||
<target>o habla con los desarrolladores</target>
|
||||
<target>o contacta mediante Chat con los desarrolladores</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="owner" xml:space="preserve">
|
||||
@@ -4601,6 +4731,11 @@ 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>
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
<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">
|
||||
@@ -765,6 +770,11 @@
|
||||
<target>Confirmer</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm database upgrades" xml:space="preserve">
|
||||
<source>Confirm database upgrades</source>
|
||||
<target>Confirmer la mise à niveau de la base de données</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm new passphrase…" xml:space="preserve">
|
||||
<source>Confirm new passphrase…</source>
|
||||
<target>Confirmer la nouvelle phrase secrète…</target>
|
||||
@@ -975,6 +985,16 @@
|
||||
<target>ID de base de données</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database IDs and Transport isolation option." xml:space="preserve">
|
||||
<source>Database IDs and Transport isolation option.</source>
|
||||
<target>IDs de base de données et option d'isolation du transport.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database downgrade" xml:space="preserve">
|
||||
<source>Database downgrade</source>
|
||||
<target>Rétrogradation de la base de données</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database encrypted!" xml:space="preserve">
|
||||
<source>Database encrypted!</source>
|
||||
<target>Base de données chiffrée !</target>
|
||||
@@ -1029,6 +1049,11 @@
|
||||
<target>La phrase secrète de la base de données est nécessaire pour ouvrir le chat.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database upgrade" xml:space="preserve">
|
||||
<source>Database upgrade</source>
|
||||
<target>Mise à niveau de la base de données</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database will be encrypted and the passphrase stored in the keychain. " xml:space="preserve">
|
||||
<source>Database will be encrypted and the passphrase stored in the keychain.
|
||||
</source>
|
||||
@@ -1093,6 +1118,11 @@
|
||||
<target>Supprimer l'archive du chat ?</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete chat profile" xml:space="preserve">
|
||||
<source>Delete chat profile</source>
|
||||
<target>Supprimer le profil de chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete chat profile?" xml:space="preserve">
|
||||
<source>Delete chat profile?</source>
|
||||
<target>Supprimer le profil du chat ?</target>
|
||||
@@ -1203,6 +1233,11 @@
|
||||
<target>Supprimer la connexion en attente ?</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete profile" xml:space="preserve">
|
||||
<source>Delete profile</source>
|
||||
<target>Supprimer le profil</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete queue" xml:space="preserve">
|
||||
<source>Delete queue</source>
|
||||
<target>Supprimer la file d'attente</target>
|
||||
@@ -1308,6 +1343,11 @@
|
||||
<target>Ne plus afficher</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Downgrade and open chat" xml:space="preserve">
|
||||
<source>Downgrade and open chat</source>
|
||||
<target>Rétrograder et ouvrir le chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Duplicate display name!" xml:space="preserve">
|
||||
<source>Duplicate display name!</source>
|
||||
<target>Nom d'affichage en double !</target>
|
||||
@@ -1383,6 +1423,10 @@
|
||||
<target>Message chiffrée : erreur de base de données</target>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Encrypted message: database migration error" xml:space="preserve">
|
||||
<source>Encrypted message: database migration error</source>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Encrypted message: keychain error" xml:space="preserve">
|
||||
<source>Encrypted message: keychain error</source>
|
||||
<target>Message chiffrée : erreur de keychain</target>
|
||||
@@ -1410,7 +1454,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Enter password above to show!" xml:space="preserve">
|
||||
<source>Enter password above to show!</source>
|
||||
<target>Entrez le mot de passe ci-dessus pour continuer !</target>
|
||||
<target>Entrez ci-dessus le mot de passe pour afficher le profil !</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Enter server manually" xml:space="preserve">
|
||||
@@ -1613,6 +1657,11 @@
|
||||
<target>Erreur de mise à jour de la confidentialité de l'utilisateur</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error: " xml:space="preserve">
|
||||
<source>Error: </source>
|
||||
<target>Erreur : </target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error: %@" xml:space="preserve">
|
||||
<source>Error: %@</source>
|
||||
<target>Erreur : %@</target>
|
||||
@@ -1633,6 +1682,10 @@
|
||||
<target>Quitter sans sauvegarder</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Experimental" xml:space="preserve">
|
||||
<source>Experimental</source>
|
||||
<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>
|
||||
@@ -1658,6 +1711,16 @@
|
||||
<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>
|
||||
<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">
|
||||
<source>File will be received when your contact completes uploading it.</source>
|
||||
<target>Le fichier sera reçu lorsque votre contact aura terminé de le mettre en ligne.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="File will be received when your contact is online, please wait or check later!" xml:space="preserve">
|
||||
<source>File will be received when your contact is online, please wait or check later!</source>
|
||||
<target>Le fichier sera reçu quand votre contact sera en ligne, merci d'attendre ou de revenir plus tard !</target>
|
||||
@@ -1853,6 +1916,11 @@
|
||||
<target>Masquer le profil</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Hide:" xml:space="preserve">
|
||||
<source>Hide:</source>
|
||||
<target>Cacher :</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="How SimpleX works" xml:space="preserve">
|
||||
<source>How SimpleX works</source>
|
||||
<target>Comment SimpleX fonctionne</target>
|
||||
@@ -1903,6 +1971,11 @@
|
||||
<target>Ignorer</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Image will be received when your contact completes uploading it." xml:space="preserve">
|
||||
<source>Image will be received when your contact completes uploading it.</source>
|
||||
<target>L'image sera reçue lorsque votre contact aura terminé de la mettre en ligne.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Image will be received when your contact is online, please wait or check later!" xml:space="preserve">
|
||||
<source>Image will be received when your contact is online, please wait or check later!</source>
|
||||
<target>L'image sera reçue quand votre contact sera en ligne, merci d'attendre ou de revenir plus tard !</target>
|
||||
@@ -1973,6 +2046,11 @@
|
||||
<target>Appel vidéo entrant</target>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Incompatible database version" xml:space="preserve">
|
||||
<source>Incompatible database version</source>
|
||||
<target>Version de la base de données incompatible</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Incorrect security code!" xml:space="preserve">
|
||||
<source>Incorrect security code!</source>
|
||||
<target>Code de sécurité incorrect !</target>
|
||||
@@ -2162,7 +2240,7 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
|
||||
</trans-unit>
|
||||
<trans-unit id="Make profile private!" xml:space="preserve">
|
||||
<source>Make profile private!</source>
|
||||
<target>Rendre le profil privé !</target>
|
||||
<target>Rendre un profil privé !</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Make sure SMP server addresses are in correct format, line separated and are not duplicated (%@)." xml:space="preserve">
|
||||
@@ -2265,6 +2343,10 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
|
||||
<target>La migration est terminée</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrations: %@" xml:space="preserve">
|
||||
<source>Migrations: %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Moderate" xml:space="preserve">
|
||||
<source>Moderate</source>
|
||||
<target>Modéré</target>
|
||||
@@ -2531,7 +2613,7 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
|
||||
</trans-unit>
|
||||
<trans-unit id="Password to show" xml:space="preserve">
|
||||
<source>Password to show</source>
|
||||
<target>Mot de passe à afficher</target>
|
||||
<target>Mot de passe à entrer</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Paste" xml:space="preserve">
|
||||
@@ -2659,6 +2741,11 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
|
||||
<target>Image de profil</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Profile password" xml:space="preserve">
|
||||
<source>Profile password</source>
|
||||
<target>Mot de passe de profil</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>
|
||||
@@ -2994,6 +3081,10 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
|
||||
<target>Envoi de message direct</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>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Send link previews" xml:space="preserve">
|
||||
<source>Send link previews</source>
|
||||
<target>Envoi d'aperçus de liens</target>
|
||||
@@ -3129,11 +3220,21 @@ Nous allons ajouter une redondance des serveurs pour éviter la perte de message
|
||||
<target>Afficher les appels dans l'historique du téléphone</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show developer options" xml:space="preserve">
|
||||
<source>Show developer options</source>
|
||||
<target>Afficher les options pour les développeurs</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show preview" xml:space="preserve">
|
||||
<source>Show preview</source>
|
||||
<target>Montrer l'aperçu</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show:" xml:space="preserve">
|
||||
<source>Show:</source>
|
||||
<target>Afficher :</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html)." xml:space="preserve">
|
||||
<source>SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).</source>
|
||||
<target>La sécurité de SimpleX Chat a été [auditée par Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).</target>
|
||||
@@ -3478,7 +3579,7 @@ Vous serez invité à confirmer l'authentification avant que cette fonction ne s
|
||||
</trans-unit>
|
||||
<trans-unit id="To reveal your hidden profile, enter a full password into a search field in **Your chat profiles** page." xml:space="preserve">
|
||||
<source>To reveal your hidden profile, enter a full password into a search field in **Your chat profiles** page.</source>
|
||||
<target>Pour révéler votre profil caché, entrez un mot de passe complet dans le champ de recherche de la page **Vos profils de chat**.</target>
|
||||
<target>Pour révéler votre profil caché, entrez le mot de passe dans le champ de recherche de la page **Vos profils de chat**.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
@@ -3541,6 +3642,16 @@ Vous serez invité à confirmer l'authentification avant que cette fonction ne s
|
||||
<target>Dévoiler</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unhide chat profile" xml:space="preserve">
|
||||
<source>Unhide chat profile</source>
|
||||
<target>Dévoiler le profil de chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unhide profile" xml:space="preserve">
|
||||
<source>Unhide profile</source>
|
||||
<target>Dévoiler le profil</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unknown caller" xml:space="preserve">
|
||||
<source>Unknown caller</source>
|
||||
<target>Appel inconnu</target>
|
||||
@@ -3618,6 +3729,11 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
|
||||
<target>La mise à jour de ce paramètre reconnectera le client à tous les serveurs.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Upgrade and open chat" xml:space="preserve">
|
||||
<source>Upgrade and open chat</source>
|
||||
<target>Mettre à niveau et ouvrir le chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Use .onion hosts" xml:space="preserve">
|
||||
<source>Use .onion hosts</source>
|
||||
<target>Utiliser les hôtes .onions</target>
|
||||
@@ -3723,6 +3839,11 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
|
||||
<target>En attente de l'image</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
|
||||
<source>Warning: you may lose some data!</source>
|
||||
<target>Attention : vous risquez de perdre des données !</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="WebRTC ICE servers" xml:space="preserve">
|
||||
<source>WebRTC ICE servers</source>
|
||||
<target>Serveurs WebRTC ICE</target>
|
||||
@@ -4279,6 +4400,10 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
|
||||
<target>créateur</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="database version is newer than the app, but no down migration for: %@" xml:space="preserve">
|
||||
<source>database version is newer than the app, but no down migration for: %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="default (%@)" xml:space="preserve">
|
||||
<source>default (%@)</source>
|
||||
<target>défaut (%@)</target>
|
||||
@@ -4294,6 +4419,10 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
|
||||
<target>groupe supprimé</target>
|
||||
<note>rcv group event chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="different migration in the app/database: %@ / %@" xml:space="preserve">
|
||||
<source>different migration in the app/database: %@ / %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="direct" xml:space="preserve">
|
||||
<source>direct</source>
|
||||
<target>direct</target>
|
||||
@@ -4600,6 +4729,11 @@ 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>
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
<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">
|
||||
@@ -765,6 +770,11 @@
|
||||
<target>Conferma</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm database upgrades" xml:space="preserve">
|
||||
<source>Confirm database upgrades</source>
|
||||
<target>Conferma aggiornamenti database</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm new passphrase…" xml:space="preserve">
|
||||
<source>Confirm new passphrase…</source>
|
||||
<target>Conferma password nuova…</target>
|
||||
@@ -975,6 +985,16 @@
|
||||
<target>ID database</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database IDs and Transport isolation option." xml:space="preserve">
|
||||
<source>Database IDs and Transport isolation option.</source>
|
||||
<target>ID del database e opzione isolamento del trasporto.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database downgrade" xml:space="preserve">
|
||||
<source>Database downgrade</source>
|
||||
<target>Downgrade del database</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database encrypted!" xml:space="preserve">
|
||||
<source>Database encrypted!</source>
|
||||
<target>Database crittografato!</target>
|
||||
@@ -1029,6 +1049,11 @@
|
||||
<target>La password del database è necessaria per aprire la chat.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database upgrade" xml:space="preserve">
|
||||
<source>Database upgrade</source>
|
||||
<target>Aggiornamento del database</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database will be encrypted and the passphrase stored in the keychain. " xml:space="preserve">
|
||||
<source>Database will be encrypted and the passphrase stored in the keychain.
|
||||
</source>
|
||||
@@ -1093,6 +1118,11 @@
|
||||
<target>Eliminare l'archivio della chat?</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete chat profile" xml:space="preserve">
|
||||
<source>Delete chat profile</source>
|
||||
<target>Elimina il profilo di chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete chat profile?" xml:space="preserve">
|
||||
<source>Delete chat profile?</source>
|
||||
<target>Eliminare il profilo di chat?</target>
|
||||
@@ -1203,6 +1233,11 @@
|
||||
<target>Eliminare la connessione in attesa?</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete profile" xml:space="preserve">
|
||||
<source>Delete profile</source>
|
||||
<target>Elimina profilo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete queue" xml:space="preserve">
|
||||
<source>Delete queue</source>
|
||||
<target>Elimina coda</target>
|
||||
@@ -1308,6 +1343,11 @@
|
||||
<target>Non mostrare più</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Downgrade and open chat" xml:space="preserve">
|
||||
<source>Downgrade and open chat</source>
|
||||
<target>Esegui downgrade e apri chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Duplicate display name!" xml:space="preserve">
|
||||
<source>Duplicate display name!</source>
|
||||
<target>Nome da mostrare doppio!</target>
|
||||
@@ -1383,6 +1423,10 @@
|
||||
<target>Messaggio crittografato: errore del database</target>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Encrypted message: database migration error" xml:space="preserve">
|
||||
<source>Encrypted message: database migration error</source>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Encrypted message: keychain error" xml:space="preserve">
|
||||
<source>Encrypted message: keychain error</source>
|
||||
<target>Messaggio crittografato: errore del portachiavi</target>
|
||||
@@ -1613,6 +1657,11 @@
|
||||
<target>Errore nell'aggiornamento della privacy dell'utente</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error: " xml:space="preserve">
|
||||
<source>Error: </source>
|
||||
<target>Errore: </target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error: %@" xml:space="preserve">
|
||||
<source>Error: %@</source>
|
||||
<target>Errore: %@</target>
|
||||
@@ -1633,6 +1682,10 @@
|
||||
<target>Esci senza salvare</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Experimental" xml:space="preserve">
|
||||
<source>Experimental</source>
|
||||
<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>
|
||||
@@ -1658,6 +1711,16 @@
|
||||
<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>
|
||||
<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">
|
||||
<source>File will be received when your contact completes uploading it.</source>
|
||||
<target>Il file verrà ricevuto quando il tuo contatto completerà l'invio.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="File will be received when your contact is online, please wait or check later!" xml:space="preserve">
|
||||
<source>File will be received when your contact is online, please wait or check later!</source>
|
||||
<target>Il file verrà ricevuto quando il tuo contatto sarà in linea, attendi o controlla più tardi!</target>
|
||||
@@ -1853,6 +1916,11 @@
|
||||
<target>Nascondi il profilo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Hide:" xml:space="preserve">
|
||||
<source>Hide:</source>
|
||||
<target>Nascondi:</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="How SimpleX works" xml:space="preserve">
|
||||
<source>How SimpleX works</source>
|
||||
<target>Come funziona SimpleX</target>
|
||||
@@ -1903,6 +1971,11 @@
|
||||
<target>Ignora</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Image will be received when your contact completes uploading it." xml:space="preserve">
|
||||
<source>Image will be received when your contact completes uploading it.</source>
|
||||
<target>L'immagine verrà ricevuta quando il tuo contatto completerà l'invio.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Image will be received when your contact is online, please wait or check later!" xml:space="preserve">
|
||||
<source>Image will be received when your contact is online, please wait or check later!</source>
|
||||
<target>L'immagine verrà ricevuta quando il tuo contatto sarà in linea, aspetta o controlla più tardi!</target>
|
||||
@@ -1973,6 +2046,11 @@
|
||||
<target>Videochiamata in arrivo</target>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Incompatible database version" xml:space="preserve">
|
||||
<source>Incompatible database version</source>
|
||||
<target>Versione del database incompatibile</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Incorrect security code!" xml:space="preserve">
|
||||
<source>Incorrect security code!</source>
|
||||
<target>Codice di sicurezza sbagliato!</target>
|
||||
@@ -2265,6 +2343,10 @@ Aggiungeremo la ridondanza del server per prevenire la perdita di messaggi.</tar
|
||||
<target>La migrazione è completata</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrations: %@" xml:space="preserve">
|
||||
<source>Migrations: %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Moderate" xml:space="preserve">
|
||||
<source>Moderate</source>
|
||||
<target>Modera</target>
|
||||
@@ -2659,6 +2741,11 @@ Aggiungeremo la ridondanza del server per prevenire la perdita di messaggi.</tar
|
||||
<target>Immagine del profilo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Profile password" xml:space="preserve">
|
||||
<source>Profile password</source>
|
||||
<target>Password del profilo</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>
|
||||
@@ -2994,6 +3081,10 @@ Aggiungeremo la ridondanza del server per prevenire la perdita di messaggi.</tar
|
||||
<target>Invia messaggio diretto</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>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Send link previews" xml:space="preserve">
|
||||
<source>Send link previews</source>
|
||||
<target>Invia anteprime dei link</target>
|
||||
@@ -3129,11 +3220,21 @@ Aggiungeremo la ridondanza del server per prevenire la perdita di messaggi.</tar
|
||||
<target>Mostra le chiamate nella cronologia del telefono</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show developer options" xml:space="preserve">
|
||||
<source>Show developer options</source>
|
||||
<target>Mostra opzioni sviluppatore</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show preview" xml:space="preserve">
|
||||
<source>Show preview</source>
|
||||
<target>Mostra anteprima</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show:" xml:space="preserve">
|
||||
<source>Show:</source>
|
||||
<target>Mostra:</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html)." xml:space="preserve">
|
||||
<source>SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).</source>
|
||||
<target>La sicurezza di SimpleX Chat è stata [verificata da Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).</target>
|
||||
@@ -3541,6 +3642,16 @@ Ti verrà chiesto di completare l'autenticazione prima di attivare questa funzio
|
||||
<target>Svela</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unhide chat profile" xml:space="preserve">
|
||||
<source>Unhide chat profile</source>
|
||||
<target>Svela il profilo chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unhide profile" xml:space="preserve">
|
||||
<source>Unhide profile</source>
|
||||
<target>Svela profilo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unknown caller" xml:space="preserve">
|
||||
<source>Unknown caller</source>
|
||||
<target>Chiamante sconosciuto</target>
|
||||
@@ -3618,6 +3729,11 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
|
||||
<target>L'aggiornamento di questa impostazione riconnetterà il client a tutti i server.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Upgrade and open chat" xml:space="preserve">
|
||||
<source>Upgrade and open chat</source>
|
||||
<target>Aggiorna e apri chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Use .onion hosts" xml:space="preserve">
|
||||
<source>Use .onion hosts</source>
|
||||
<target>Usa gli host .onion</target>
|
||||
@@ -3723,6 +3839,11 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
|
||||
<target>In attesa dell'immagine</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
|
||||
<source>Warning: you may lose some data!</source>
|
||||
<target>Attenzione: potresti perdere alcuni dati!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="WebRTC ICE servers" xml:space="preserve">
|
||||
<source>WebRTC ICE servers</source>
|
||||
<target>Server WebRTC ICE</target>
|
||||
@@ -4279,6 +4400,10 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
|
||||
<target>creatore</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="database version is newer than the app, but no down migration for: %@" xml:space="preserve">
|
||||
<source>database version is newer than the app, but no down migration for: %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="default (%@)" xml:space="preserve">
|
||||
<source>default (%@)</source>
|
||||
<target>predefinito (%@)</target>
|
||||
@@ -4294,6 +4419,10 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
|
||||
<target>gruppo eliminato</target>
|
||||
<note>rcv group event chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="different migration in the app/database: %@ / %@" xml:space="preserve">
|
||||
<source>different migration in the app/database: %@ / %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="direct" xml:space="preserve">
|
||||
<source>direct</source>
|
||||
<target>diretta</target>
|
||||
@@ -4600,6 +4729,11 @@ 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>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -618,6 +618,11 @@
|
||||
<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">
|
||||
@@ -765,6 +770,11 @@
|
||||
<target>Bevestigen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm database upgrades" xml:space="preserve">
|
||||
<source>Confirm database upgrades</source>
|
||||
<target>Bevestig database upgrades</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm new passphrase…" xml:space="preserve">
|
||||
<source>Confirm new passphrase…</source>
|
||||
<target>Bevestig nieuw wachtwoord…</target>
|
||||
@@ -975,6 +985,16 @@
|
||||
<target>Database ID</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database IDs and Transport isolation option." xml:space="preserve">
|
||||
<source>Database IDs and Transport isolation option.</source>
|
||||
<target>Database ID's en Transport isolatie optie.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database downgrade" xml:space="preserve">
|
||||
<source>Database downgrade</source>
|
||||
<target>Database downgraden</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database encrypted!" xml:space="preserve">
|
||||
<source>Database encrypted!</source>
|
||||
<target>Database versleuteld!</target>
|
||||
@@ -1029,6 +1049,11 @@
|
||||
<target>Database wachtwoord is vereist om je gesprekken te openen.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database upgrade" xml:space="preserve">
|
||||
<source>Database upgrade</source>
|
||||
<target>Database upgrade</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database will be encrypted and the passphrase stored in the keychain. " xml:space="preserve">
|
||||
<source>Database will be encrypted and the passphrase stored in the keychain.
|
||||
</source>
|
||||
@@ -1093,6 +1118,11 @@
|
||||
<target>Chat archief verwijderen?</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete chat profile" xml:space="preserve">
|
||||
<source>Delete chat profile</source>
|
||||
<target>Chat profiel verwijderen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete chat profile?" xml:space="preserve">
|
||||
<source>Delete chat profile?</source>
|
||||
<target>Chat profiel verwijderen?</target>
|
||||
@@ -1203,6 +1233,11 @@
|
||||
<target>Wachtende verbinding verwijderen?</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete profile" xml:space="preserve">
|
||||
<source>Delete profile</source>
|
||||
<target>Verwijder profiel</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete queue" xml:space="preserve">
|
||||
<source>Delete queue</source>
|
||||
<target>Wachtrij verwijderen</target>
|
||||
@@ -1308,6 +1343,11 @@
|
||||
<target>Niet meer weergeven</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Downgrade and open chat" xml:space="preserve">
|
||||
<source>Downgrade and open chat</source>
|
||||
<target>Downgraden en chat openen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Duplicate display name!" xml:space="preserve">
|
||||
<source>Duplicate display name!</source>
|
||||
<target>Dubbele weergavenaam!</target>
|
||||
@@ -1383,6 +1423,10 @@
|
||||
<target>Versleuteld bericht: database fout</target>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Encrypted message: database migration error" xml:space="preserve">
|
||||
<source>Encrypted message: database migration error</source>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Encrypted message: keychain error" xml:space="preserve">
|
||||
<source>Encrypted message: keychain error</source>
|
||||
<target>Versleuteld bericht: keychain fout</target>
|
||||
@@ -1613,6 +1657,11 @@
|
||||
<target>Fout bij updaten van gebruikers privacy</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error: " xml:space="preserve">
|
||||
<source>Error: </source>
|
||||
<target>Fout: </target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error: %@" xml:space="preserve">
|
||||
<source>Error: %@</source>
|
||||
<target>Fout: %@</target>
|
||||
@@ -1633,6 +1682,10 @@
|
||||
<target>Afsluiten zonder opslaan</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Experimental" xml:space="preserve">
|
||||
<source>Experimental</source>
|
||||
<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>
|
||||
@@ -1658,6 +1711,16 @@
|
||||
<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>
|
||||
<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">
|
||||
<source>File will be received when your contact completes uploading it.</source>
|
||||
<target>Het bestand wordt ontvangen wanneer uw contactpersoon het uploaden heeft voltooid.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="File will be received when your contact is online, please wait or check later!" xml:space="preserve">
|
||||
<source>File will be received when your contact is online, please wait or check later!</source>
|
||||
<target>Het bestand wordt ontvangen wanneer uw contact persoon online is, even geduld a.u.b. of controleer later!</target>
|
||||
@@ -1853,6 +1916,11 @@
|
||||
<target>Profiel verbergen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Hide:" xml:space="preserve">
|
||||
<source>Hide:</source>
|
||||
<target>Verbergen:</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="How SimpleX works" xml:space="preserve">
|
||||
<source>How SimpleX works</source>
|
||||
<target>Hoe SimpleX werkt</target>
|
||||
@@ -1903,6 +1971,11 @@
|
||||
<target>Negeren</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Image will be received when your contact completes uploading it." xml:space="preserve">
|
||||
<source>Image will be received when your contact completes uploading it.</source>
|
||||
<target>De afbeelding wordt ontvangen wanneer uw contactpersoon het uploaden heeft voltooid.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Image will be received when your contact is online, please wait or check later!" xml:space="preserve">
|
||||
<source>Image will be received when your contact is online, please wait or check later!</source>
|
||||
<target>De afbeelding wordt ontvangen wanneer uw contact online is, even geduld a.u.b. of kijk later!</target>
|
||||
@@ -1973,6 +2046,11 @@
|
||||
<target>Inkomend video gesprek</target>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Incompatible database version" xml:space="preserve">
|
||||
<source>Incompatible database version</source>
|
||||
<target>Incompatibele database versie</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Incorrect security code!" xml:space="preserve">
|
||||
<source>Incorrect security code!</source>
|
||||
<target>Onjuiste beveiligingscode!</target>
|
||||
@@ -2265,6 +2343,10 @@ We zullen serverredundantie toevoegen om verloren berichten te voorkomen.</targe
|
||||
<target>Migratie is voltooid</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrations: %@" xml:space="preserve">
|
||||
<source>Migrations: %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Moderate" xml:space="preserve">
|
||||
<source>Moderate</source>
|
||||
<target>Modereren</target>
|
||||
@@ -2521,7 +2603,7 @@ We zullen serverredundantie toevoegen om verloren berichten te voorkomen.</targe
|
||||
</trans-unit>
|
||||
<trans-unit id="PING count" xml:space="preserve">
|
||||
<source>PING count</source>
|
||||
<target>PING telling</target>
|
||||
<target>PING count</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="PING interval" xml:space="preserve">
|
||||
@@ -2659,6 +2741,11 @@ We zullen serverredundantie toevoegen om verloren berichten te voorkomen.</targe
|
||||
<target>profielfoto</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Profile password" xml:space="preserve">
|
||||
<source>Profile password</source>
|
||||
<target>Profiel wachtwoord</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>
|
||||
@@ -2994,6 +3081,10 @@ We zullen serverredundantie toevoegen om verloren berichten te voorkomen.</targe
|
||||
<target>Direct bericht sturen</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>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Send link previews" xml:space="preserve">
|
||||
<source>Send link previews</source>
|
||||
<target>Link voorbeelden verzenden</target>
|
||||
@@ -3129,11 +3220,21 @@ We zullen serverredundantie toevoegen om verloren berichten te voorkomen.</targe
|
||||
<target>Toon oproepen in de telefoongeschiedenis</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show developer options" xml:space="preserve">
|
||||
<source>Show developer options</source>
|
||||
<target>Ontwikkelaars opties tonen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show preview" xml:space="preserve">
|
||||
<source>Show preview</source>
|
||||
<target>Toon voorbeeld</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show:" xml:space="preserve">
|
||||
<source>Show:</source>
|
||||
<target>Toon:</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html)." xml:space="preserve">
|
||||
<source>SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).</source>
|
||||
<target>De beveiliging van SimpleX Chat is [gecontroleerd door Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).</target>
|
||||
@@ -3541,6 +3642,16 @@ U wordt gevraagd de authenticatie te voltooien voordat deze functie wordt ingesc
|
||||
<target>zichtbaar maken</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unhide chat profile" xml:space="preserve">
|
||||
<source>Unhide chat profile</source>
|
||||
<target>Chat profiel zichtbaar maken</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unhide profile" xml:space="preserve">
|
||||
<source>Unhide profile</source>
|
||||
<target>Profiel zichtbaar maken</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unknown caller" xml:space="preserve">
|
||||
<source>Unknown caller</source>
|
||||
<target>Onbekende beller</target>
|
||||
@@ -3618,6 +3729,11 @@ Om verbinding te maken, vraagt u uw contactpersoon om een andere verbinding link
|
||||
<target>Als u deze instelling bijwerkt, wordt de client opnieuw verbonden met alle servers.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Upgrade and open chat" xml:space="preserve">
|
||||
<source>Upgrade and open chat</source>
|
||||
<target>Upgrade en open chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Use .onion hosts" xml:space="preserve">
|
||||
<source>Use .onion hosts</source>
|
||||
<target>Gebruik .onion-hosts</target>
|
||||
@@ -3723,6 +3839,11 @@ Om verbinding te maken, vraagt u uw contactpersoon om een andere verbinding link
|
||||
<target>Wachten op afbeelding</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
|
||||
<source>Warning: you may lose some data!</source>
|
||||
<target>Waarschuwing: u kunt sommige gegevens verliezen!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="WebRTC ICE servers" xml:space="preserve">
|
||||
<source>WebRTC ICE servers</source>
|
||||
<target>WebRTC ICE servers</target>
|
||||
@@ -4279,6 +4400,10 @@ SimpleX servers kunnen uw profiel niet zien.</target>
|
||||
<target>creator</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="database version is newer than the app, but no down migration for: %@" xml:space="preserve">
|
||||
<source>database version is newer than the app, but no down migration for: %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="default (%@)" xml:space="preserve">
|
||||
<source>default (%@)</source>
|
||||
<target>standaard (%@)</target>
|
||||
@@ -4294,6 +4419,10 @@ SimpleX servers kunnen uw profiel niet zien.</target>
|
||||
<target>verwijderde groep</target>
|
||||
<note>rcv group event chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="different migration in the app/database: %@ / %@" xml:space="preserve">
|
||||
<source>different migration in the app/database: %@ / %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="direct" xml:space="preserve">
|
||||
<source>direct</source>
|
||||
<target>direct</target>
|
||||
@@ -4600,6 +4729,11 @@ 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>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -618,6 +618,11 @@
|
||||
<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">
|
||||
@@ -765,6 +770,11 @@
|
||||
<target>确认</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm database upgrades" xml:space="preserve">
|
||||
<source>Confirm database upgrades</source>
|
||||
<target>确认数据库升级</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm new passphrase…" xml:space="preserve">
|
||||
<source>Confirm new passphrase…</source>
|
||||
<target>确认新密码……</target>
|
||||
@@ -975,6 +985,16 @@
|
||||
<target>数据库 ID</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database IDs and Transport isolation option." xml:space="preserve">
|
||||
<source>Database IDs and Transport isolation option.</source>
|
||||
<target>数据库 ID 和传输隔离选项。</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database downgrade" xml:space="preserve">
|
||||
<source>Database downgrade</source>
|
||||
<target>数据库降级</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database encrypted!" xml:space="preserve">
|
||||
<source>Database encrypted!</source>
|
||||
<target>数据库已加密!</target>
|
||||
@@ -1029,6 +1049,11 @@
|
||||
<target>打开聊天需要数据库密码。</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database upgrade" xml:space="preserve">
|
||||
<source>Database upgrade</source>
|
||||
<target>数据库升级</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Database will be encrypted and the passphrase stored in the keychain. " xml:space="preserve">
|
||||
<source>Database will be encrypted and the passphrase stored in the keychain.
|
||||
</source>
|
||||
@@ -1093,6 +1118,11 @@
|
||||
<target>删除聊天档案?</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete chat profile" xml:space="preserve">
|
||||
<source>Delete chat profile</source>
|
||||
<target>删除聊天资料</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete chat profile?" xml:space="preserve">
|
||||
<source>Delete chat profile?</source>
|
||||
<target>删除聊天资料?</target>
|
||||
@@ -1203,6 +1233,11 @@
|
||||
<target>删除待定连接?</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete profile" xml:space="preserve">
|
||||
<source>Delete profile</source>
|
||||
<target>删除个人资料</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete queue" xml:space="preserve">
|
||||
<source>Delete queue</source>
|
||||
<target>删除队列</target>
|
||||
@@ -1308,6 +1343,11 @@
|
||||
<target>不再显示</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Downgrade and open chat" xml:space="preserve">
|
||||
<source>Downgrade and open chat</source>
|
||||
<target>降级并打开聊天</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Duplicate display name!" xml:space="preserve">
|
||||
<source>Duplicate display name!</source>
|
||||
<target>重复的显示名!</target>
|
||||
@@ -1383,6 +1423,10 @@
|
||||
<target>加密消息:数据库错误</target>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Encrypted message: database migration error" xml:space="preserve">
|
||||
<source>Encrypted message: database migration error</source>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Encrypted message: keychain error" xml:space="preserve">
|
||||
<source>Encrypted message: keychain error</source>
|
||||
<target>加密信息:钥匙串错误</target>
|
||||
@@ -1613,6 +1657,10 @@
|
||||
<target>更新用户隐私时出错</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error: " xml:space="preserve">
|
||||
<source>Error: </source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error: %@" xml:space="preserve">
|
||||
<source>Error: %@</source>
|
||||
<target>错误: %@</target>
|
||||
@@ -1633,6 +1681,10 @@
|
||||
<target>退出而不保存</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Experimental" xml:space="preserve">
|
||||
<source>Experimental</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Export database" xml:space="preserve">
|
||||
<source>Export database</source>
|
||||
<target>导出数据库</target>
|
||||
@@ -1658,6 +1710,16 @@
|
||||
<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>
|
||||
<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">
|
||||
<source>File will be received when your contact completes uploading it.</source>
|
||||
<target>文件将在您的联系人完成上传后收到。</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="File will be received when your contact is online, please wait or check later!" xml:space="preserve">
|
||||
<source>File will be received when your contact is online, please wait or check later!</source>
|
||||
<target>文件将在您的联系人在线时收到,请稍等或稍后再查看!</target>
|
||||
@@ -1853,6 +1915,11 @@
|
||||
<target>隐藏个人资料</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Hide:" xml:space="preserve">
|
||||
<source>Hide:</source>
|
||||
<target>隐藏:</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="How SimpleX works" xml:space="preserve">
|
||||
<source>How SimpleX works</source>
|
||||
<target>SimpleX的工作原理</target>
|
||||
@@ -1903,6 +1970,11 @@
|
||||
<target>忽视</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Image will be received when your contact completes uploading it." xml:space="preserve">
|
||||
<source>Image will be received when your contact completes uploading it.</source>
|
||||
<target>图片将在您的联系人完成上传后收到。</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Image will be received when your contact is online, please wait or check later!" xml:space="preserve">
|
||||
<source>Image will be received when your contact is online, please wait or check later!</source>
|
||||
<target>图片将在您的联系人在线时收到,请稍等或稍后查看!</target>
|
||||
@@ -1973,6 +2045,11 @@
|
||||
<target>视频通话来电</target>
|
||||
<note>notification</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Incompatible database version" xml:space="preserve">
|
||||
<source>Incompatible database version</source>
|
||||
<target>数据库版本不兼容</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Incorrect security code!" xml:space="preserve">
|
||||
<source>Incorrect security code!</source>
|
||||
<target>安全码不正确!</target>
|
||||
@@ -2265,6 +2342,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="Migrations: %@" xml:space="preserve">
|
||||
<source>Migrations: %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Moderate" xml:space="preserve">
|
||||
<source>Moderate</source>
|
||||
<target>管理员移除</target>
|
||||
@@ -2659,6 +2740,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="Profile password" xml:space="preserve">
|
||||
<source>Profile password</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>
|
||||
@@ -2994,6 +3080,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="Send files via XFTP" xml:space="preserve">
|
||||
<source>Send files via XFTP</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Send link previews" xml:space="preserve">
|
||||
<source>Send link previews</source>
|
||||
<target>发送链接预览</target>
|
||||
@@ -3129,11 +3219,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="Show developer options" xml:space="preserve">
|
||||
<source>Show developer options</source>
|
||||
<target>显示开发者选项</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show preview" xml:space="preserve">
|
||||
<source>Show preview</source>
|
||||
<target>显示预览</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show:" xml:space="preserve">
|
||||
<source>Show:</source>
|
||||
<target>显示:</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html)." xml:space="preserve">
|
||||
<source>SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).</source>
|
||||
<target>SimpleX Chat 的安全性 [由 Trail of Bits 审核](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html)。</target>
|
||||
@@ -3541,6 +3641,16 @@ You will be prompted to complete authentication before this feature is enabled.<
|
||||
<target>取消隐藏</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unhide chat profile" xml:space="preserve">
|
||||
<source>Unhide chat profile</source>
|
||||
<target>取消隐藏聊天资料</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unhide profile" xml:space="preserve">
|
||||
<source>Unhide profile</source>
|
||||
<target>取消隐藏个人资料</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unknown caller" xml:space="preserve">
|
||||
<source>Unknown caller</source>
|
||||
<target>未知来电者</target>
|
||||
@@ -3618,6 +3728,11 @@ 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="Upgrade and open chat" xml:space="preserve">
|
||||
<source>Upgrade and open chat</source>
|
||||
<target>升级并打开聊天</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Use .onion hosts" xml:space="preserve">
|
||||
<source>Use .onion hosts</source>
|
||||
<target>使用 .onion 主机</target>
|
||||
@@ -3723,6 +3838,11 @@ 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="Warning: you may lose some data!" xml:space="preserve">
|
||||
<source>Warning: you may lose some data!</source>
|
||||
<target>警告:您可能会丢失部分数据!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="WebRTC ICE servers" xml:space="preserve">
|
||||
<source>WebRTC ICE servers</source>
|
||||
<target>WebRTC ICE 服务器</target>
|
||||
@@ -4279,6 +4399,10 @@ SimpleX 服务器无法看到您的资料。</target>
|
||||
<target>创建者</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="database version is newer than the app, but no down migration for: %@" xml:space="preserve">
|
||||
<source>database version is newer than the app, but no down migration for: %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="default (%@)" xml:space="preserve">
|
||||
<source>default (%@)</source>
|
||||
<target>默认 (%@)</target>
|
||||
@@ -4294,6 +4418,10 @@ SimpleX 服务器无法看到您的资料。</target>
|
||||
<target>已删除群组</target>
|
||||
<note>rcv group event chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="different migration in the app/database: %@ / %@" xml:space="preserve">
|
||||
<source>different migration in the app/database: %@ / %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="direct" xml:space="preserve">
|
||||
<source>direct</source>
|
||||
<target>直接</target>
|
||||
@@ -4600,6 +4728,11 @@ 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>
|
||||
|
||||
@@ -32,32 +32,38 @@
|
||||
<target state="translated"> (</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id=" (can be copied)" xml:space="preserve">
|
||||
<trans-unit id=" (can be copied)" xml:space="preserve" approved="no">
|
||||
<source> (can be copied)</source>
|
||||
<target state="translated"> (可以複製)</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="!1 colored!" xml:space="preserve">
|
||||
<trans-unit id="!1 colored!" xml:space="preserve" approved="no">
|
||||
<source>!1 colored!</source>
|
||||
<target state="translated">!1 顏色!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="#secret#" xml:space="preserve">
|
||||
<source>#secret#</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@" xml:space="preserve">
|
||||
<trans-unit id="%@" xml:space="preserve" approved="no">
|
||||
<source>%@</source>
|
||||
<target state="translated">%@</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@ %@" xml:space="preserve">
|
||||
<trans-unit id="%@ %@" xml:space="preserve" approved="no">
|
||||
<source>%@ %@</source>
|
||||
<target state="translated">%@ %@</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@ / %@" xml:space="preserve">
|
||||
<trans-unit id="%@ / %@" xml:space="preserve" approved="no">
|
||||
<source>%@ / %@</source>
|
||||
<target state="translated">%@ / %@</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@ is connected!" xml:space="preserve">
|
||||
<trans-unit id="%@ is connected!" xml:space="preserve" approved="no">
|
||||
<source>%@ is connected!</source>
|
||||
<target state="translated">%@ 已連接!</target>
|
||||
<note>notification title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@ is not verified" xml:space="preserve">
|
||||
@@ -68,100 +74,122 @@
|
||||
<source>%@ is verified</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@ wants to connect!" xml:space="preserve">
|
||||
<trans-unit id="%@ wants to connect!" xml:space="preserve" approved="no">
|
||||
<source>%@ wants to connect!</source>
|
||||
<target state="translated">%@ 想連接!</target>
|
||||
<note>notification title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%d days" xml:space="preserve">
|
||||
<trans-unit id="%d days" xml:space="preserve" approved="no">
|
||||
<source>%d days</source>
|
||||
<target state="translated">%d 日</target>
|
||||
<note>message ttl</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%d hours" xml:space="preserve">
|
||||
<trans-unit id="%d hours" xml:space="preserve" approved="no">
|
||||
<source>%d hours</source>
|
||||
<target state="translated">%d 小時</target>
|
||||
<note>message ttl</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%d min" xml:space="preserve">
|
||||
<trans-unit id="%d min" xml:space="preserve" approved="no">
|
||||
<source>%d min</source>
|
||||
<target state="translated">%d 分鐘</target>
|
||||
<note>message ttl</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%d months" xml:space="preserve">
|
||||
<trans-unit id="%d months" xml:space="preserve" approved="no">
|
||||
<source>%d months</source>
|
||||
<target state="translated">%d 個月</target>
|
||||
<note>message ttl</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%d sec" xml:space="preserve">
|
||||
<trans-unit id="%d sec" xml:space="preserve" approved="no">
|
||||
<source>%d sec</source>
|
||||
<target state="translated">%d 秒</target>
|
||||
<note>message ttl</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%d skipped message(s)" xml:space="preserve">
|
||||
<source>%d skipped message(s)</source>
|
||||
<note>integrity error chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lld" xml:space="preserve">
|
||||
<trans-unit id="%lld" xml:space="preserve" approved="no">
|
||||
<source>%lld</source>
|
||||
<target state="translated">%lld</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lld %@" xml:space="preserve">
|
||||
<trans-unit id="%lld %@" xml:space="preserve" approved="no">
|
||||
<source>%lld %@</source>
|
||||
<target state="translated">%lld %@</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lld contact(s) selected" xml:space="preserve">
|
||||
<trans-unit id="%lld contact(s) selected" xml:space="preserve" approved="no">
|
||||
<source>%lld contact(s) selected</source>
|
||||
<target state="translated">%lld 聯絡人(s) 已選擇</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lld file(s) with total size of %@" xml:space="preserve">
|
||||
<source>%lld file(s) with total size of %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lld members" xml:space="preserve">
|
||||
<trans-unit id="%lld members" xml:space="preserve" approved="no">
|
||||
<source>%lld members</source>
|
||||
<target state="translated">%lld 成員</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lld second(s)" xml:space="preserve">
|
||||
<trans-unit id="%lld second(s)" xml:space="preserve" approved="no">
|
||||
<source>%lld second(s)</source>
|
||||
<target state="translated">%lld 秒(s)</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lldd" xml:space="preserve">
|
||||
<trans-unit id="%lldd" xml:space="preserve" approved="no">
|
||||
<source>%lldd</source>
|
||||
<target state="translated">%lldd</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lldh" xml:space="preserve">
|
||||
<trans-unit id="%lldh" xml:space="preserve" approved="no">
|
||||
<source>%lldh</source>
|
||||
<target state="translated">%lldh</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lldk" xml:space="preserve">
|
||||
<trans-unit id="%lldk" xml:space="preserve" approved="no">
|
||||
<source>%lldk</source>
|
||||
<target state="translated">%lldk</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lldm" xml:space="preserve">
|
||||
<trans-unit id="%lldm" xml:space="preserve" approved="no">
|
||||
<source>%lldm</source>
|
||||
<target state="translated">%lldm</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lldmth" xml:space="preserve">
|
||||
<trans-unit id="%lldmth" xml:space="preserve" approved="no">
|
||||
<source>%lldmth</source>
|
||||
<target state="translated">%lldmth</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%llds" xml:space="preserve">
|
||||
<trans-unit id="%llds" xml:space="preserve" approved="no">
|
||||
<source>%llds</source>
|
||||
<target state="translated">%llds</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lldw" xml:space="preserve">
|
||||
<trans-unit id="%lldw" xml:space="preserve" approved="no">
|
||||
<source>%lldw</source>
|
||||
<target state="translated">%lldw</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="(" xml:space="preserve">
|
||||
<trans-unit id="(" xml:space="preserve" approved="no">
|
||||
<source>(</source>
|
||||
<target state="translated">(</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id=")" xml:space="preserve">
|
||||
<trans-unit id=")" xml:space="preserve" approved="no">
|
||||
<source>)</source>
|
||||
<target state="translated">)</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="**Add new contact**: to create your one-time QR Code for your contact." xml:space="preserve">
|
||||
<trans-unit id="**Add new contact**: to create your one-time QR Code for your contact." xml:space="preserve" approved="no">
|
||||
<source>**Add new contact**: to create your one-time QR Code or link for your contact.</source>
|
||||
<target state="translated">**新增新的聯絡人**:使用一次性二維碼或連結連接聯絡人</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="**Create link / QR code** for your contact to use." xml:space="preserve">
|
||||
<trans-unit id="**Create link / QR code** for your contact to use." xml:space="preserve" approved="no">
|
||||
<source>**Create link / QR code** for your contact to use.</source>
|
||||
<target state="translated">**建立連結 / 二維碼** 讓你的聯絡人使用</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="**More private**: check new messages every 20 minutes. Device token is shared with SimpleX Chat server, but not how many contacts or messages you have." xml:space="preserve">
|
||||
|
||||
@@ -277,6 +277,12 @@ func receivedMsgNtf(_ res: ChatResponse) async -> (String, NSENotification)? {
|
||||
privacyAcceptImagesGroupDefault.get() {
|
||||
cItem = apiReceiveFile(fileId: file.fileId)?.chatItem ?? cItem
|
||||
}
|
||||
} else if case .video = cItem.content.msgContent {
|
||||
if let file = cItem.file,
|
||||
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.fileSize <= MAX_IMAGE_SIZE,
|
||||
|
||||
@@ -1,90 +1 @@
|
||||
/* No comment provided by engineer. */
|
||||
"**e2e encrypted** audio call" = "**e2e зашифрованный** аудиозвонок";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"**e2e encrypted** video call" = "**e2e зашифрованный** видеозвонок";
|
||||
|
||||
/* notification title */
|
||||
"%@ is connected!" = "соединение с %@ установлено!";
|
||||
|
||||
/* notification title */
|
||||
"%@ wants to connect!" = "%@ хочет соединиться!";
|
||||
|
||||
/* integrity error chat item */
|
||||
"%d skipped message(s)" = "%d пропущенных сообщений";
|
||||
|
||||
/* notification body */
|
||||
"Accept contact request from %@?" = "Принять запрос на соединение от %@?";
|
||||
|
||||
/* call status */
|
||||
"accepted call" = "принятный звонок";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"audio call (not e2e encrypted)" = "аудиозвонок (не e2e зашифрованный)";
|
||||
|
||||
/* integrity error chat item */
|
||||
"bad message hash" = "ошибка хэш сообщения";
|
||||
|
||||
/* integrity error chat item */
|
||||
"bad message ID" = "ошибка ID сообщения";
|
||||
|
||||
/* call status */
|
||||
"call error" = "ошибка звонка";
|
||||
|
||||
/* call status */
|
||||
"call in progress" = "активный звонок";
|
||||
|
||||
/* call status */
|
||||
"calling…" = "входящий звонок…";
|
||||
|
||||
/* call status */
|
||||
"connecting call" = "звонок соединяется…";
|
||||
|
||||
/* chat list item title */
|
||||
"connecting…" = "соединяется…";
|
||||
|
||||
/* chat list item title (it should not be shown */
|
||||
"connection established" = "соединение установлено";
|
||||
|
||||
/* connection information */
|
||||
"connection:%@" = "connection:%@";
|
||||
|
||||
/* deleted chat item */
|
||||
"deleted" = "удалено";
|
||||
|
||||
/* integrity error chat item */
|
||||
"duplicate message" = "повторное сообщение";
|
||||
|
||||
/* call status */
|
||||
"ended call %@" = "завершённый звонок %@";
|
||||
|
||||
/* notification */
|
||||
"Incoming audio call" = "Входящий аудиозвонок";
|
||||
|
||||
/* notification */
|
||||
"Incoming video call" = "Входящий видеозвонок";
|
||||
|
||||
/* chat list item title */
|
||||
"invited to connect" = "приглашение соединиться";
|
||||
|
||||
/* call status */
|
||||
"missed call" = "пропущенный звонок";
|
||||
|
||||
/* call status */
|
||||
"rejected call" = "отклонённый звонок";
|
||||
|
||||
/* chat list item description */
|
||||
"via contact address link" = "через ссылку-контакт";
|
||||
|
||||
/* chat list item description */
|
||||
"via one-time link" = "через одноразовую ссылку";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"video call (not e2e encrypted)" = "видеозвонок (не e2e зашифрованный)";
|
||||
|
||||
/* notification body */
|
||||
"You can now send messages to %@" = "Вы можете отправлять сообщения %@";
|
||||
|
||||
/* chat list item description */
|
||||
"you shared one-time link" = "вы создали одноразовую ссылку";
|
||||
|
||||
|
||||
@@ -10,9 +10,11 @@
|
||||
184152CEF68D2336FC2EBCB0 /* CallViewRenderers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18415B08031E8FB0F7FC27F9 /* CallViewRenderers.swift */; };
|
||||
1841538E296606C74533367C /* UserPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18415835CBD939A9ABDC108A /* UserPicker.swift */; };
|
||||
1841560FD1CD447955474C1D /* UserProfilesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18415845648CA4F5A8BCA272 /* UserProfilesView.swift */; };
|
||||
184158C131FDB829D8A117EA /* VideoPlayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18415DAAAD1ADBEDB0EDA852 /* VideoPlayerView.swift */; };
|
||||
1841594C978674A7B42EF0C0 /* AnimatedImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1841511920742C6E152E469F /* AnimatedImageView.swift */; };
|
||||
18415B0585EB5A9A0A7CA8CD /* PressedButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18415A7F0F189D87DEFEABCA /* PressedButtonStyle.swift */; };
|
||||
18415C6C56DBCEC2CBBD2F11 /* WebRTCClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18415323A4082FC92887F906 /* WebRTCClient.swift */; };
|
||||
18415F9A2D551F9757DA4654 /* CIVideoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18415FD2E36F13F596A45BB4 /* CIVideoView.swift */; };
|
||||
18415FEFE153C5920BFB7828 /* GroupWelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1841516F0CE5992B0EDFB377 /* GroupWelcomeView.swift */; };
|
||||
3C71477A281C0F6800CB4D4B /* www in Resources */ = {isa = PBXBuildFile; fileRef = 3C714779281C0F6800CB4D4B /* www */; };
|
||||
3C8C548928133C84000A3EC7 /* PasteToConnectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C8C548828133C84000A3EC7 /* PasteToConnectView.swift */; };
|
||||
@@ -25,7 +27,7 @@
|
||||
5C05DF532840AA1D00C683F9 /* CallSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C05DF522840AA1D00C683F9 /* CallSettings.swift */; };
|
||||
5C063D2727A4564100AEC577 /* ChatPreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C063D2627A4564100AEC577 /* ChatPreviewView.swift */; };
|
||||
5C10D88828EED12E00E58BF0 /* ContactConnectionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C10D88728EED12E00E58BF0 /* ContactConnectionInfo.swift */; };
|
||||
5C10D88A28F187F300E58BF0 /* FullScreenImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C10D88928F187F300E58BF0 /* FullScreenImageView.swift */; };
|
||||
5C10D88A28F187F300E58BF0 /* FullScreenMediaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C10D88928F187F300E58BF0 /* FullScreenMediaView.swift */; };
|
||||
5C116CDC27AABE0400E66D01 /* ContactRequestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C116CDB27AABE0400E66D01 /* ContactRequestView.swift */; };
|
||||
5C13730B28156D2700F43030 /* ContactConnectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C13730A28156D2700F43030 /* ContactConnectionView.swift */; };
|
||||
5C1A4C1E27A715B700EAD5AD /* ChatItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1A4C1D27A715B700EAD5AD /* ChatItemView.swift */; };
|
||||
@@ -53,11 +55,6 @@
|
||||
5C5E5D3B2824468B00B0488A /* ActiveCallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5E5D3A2824468B00B0488A /* ActiveCallView.swift */; };
|
||||
5C5F2B6D27EBC3FE006A9D5F /* ImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5F2B6C27EBC3FE006A9D5F /* ImagePicker.swift */; };
|
||||
5C5F2B7027EBC704006A9D5F /* ProfileImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5F2B6F27EBC704006A9D5F /* ProfileImage.swift */; };
|
||||
5C65DAF329CBA429003CEE45 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C65DAEE29CBA429003CEE45 /* libgmp.a */; };
|
||||
5C65DAF429CBA429003CEE45 /* libHSsimplex-chat-4.6.0.0-KxI2qGrpKDHEZQGy0eoUXU-ghc8.10.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C65DAEF29CBA429003CEE45 /* libHSsimplex-chat-4.6.0.0-KxI2qGrpKDHEZQGy0eoUXU-ghc8.10.7.a */; };
|
||||
5C65DAF529CBA429003CEE45 /* libHSsimplex-chat-4.6.0.0-KxI2qGrpKDHEZQGy0eoUXU.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C65DAF029CBA429003CEE45 /* libHSsimplex-chat-4.6.0.0-KxI2qGrpKDHEZQGy0eoUXU.a */; };
|
||||
5C65DAF629CBA429003CEE45 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C65DAF129CBA429003CEE45 /* libgmpxx.a */; };
|
||||
5C65DAF729CBA429003CEE45 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C65DAF229CBA429003CEE45 /* libffi.a */; };
|
||||
5C65DAF929D0CC20003CEE45 /* DeveloperView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C65DAF829D0CC20003CEE45 /* DeveloperView.swift */; };
|
||||
5C65F343297D45E100B67AF3 /* VersionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C65F341297D3F3600B67AF3 /* VersionView.swift */; };
|
||||
5C6AD81327A834E300348BD7 /* NewChatButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C6AD81227A834E300348BD7 /* NewChatButton.swift */; };
|
||||
@@ -68,10 +65,10 @@
|
||||
5C7505A827B6D34800BE3227 /* ChatInfoToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C7505A727B6D34800BE3227 /* ChatInfoToolbar.swift */; };
|
||||
5C764E89279CBCB3000C6508 /* ChatModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C764E88279CBCB3000C6508 /* ChatModel.swift */; };
|
||||
5C8F01CD27A6F0D8007D2C8D /* CodeScanner in Frameworks */ = {isa = PBXBuildFile; productRef = 5C8F01CC27A6F0D8007D2C8D /* CodeScanner */; };
|
||||
5C93292F29239A170090FFF9 /* SMPServersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C93292E29239A170090FFF9 /* SMPServersView.swift */; };
|
||||
5C93293129239BED0090FFF9 /* SMPServerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C93293029239BED0090FFF9 /* SMPServerView.swift */; };
|
||||
5C93292F29239A170090FFF9 /* ProtocolServersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C93292E29239A170090FFF9 /* ProtocolServersView.swift */; };
|
||||
5C93293129239BED0090FFF9 /* ProtocolServerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C93293029239BED0090FFF9 /* ProtocolServerView.swift */; };
|
||||
5C93293F2928E0FD0090FFF9 /* AudioRecPlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C93293E2928E0FD0090FFF9 /* AudioRecPlay.swift */; };
|
||||
5C9329412929248A0090FFF9 /* ScanSMPServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C9329402929248A0090FFF9 /* ScanSMPServer.swift */; };
|
||||
5C9329412929248A0090FFF9 /* ScanProtocolServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C9329402929248A0090FFF9 /* ScanProtocolServer.swift */; };
|
||||
5C971E1D27AEBEF600C8A3CE /* ChatInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C971E1C27AEBEF600C8A3CE /* ChatInfoView.swift */; };
|
||||
5C971E2127AEBF8300C8A3CE /* ChatInfoImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C971E2027AEBF8300C8A3CE /* ChatInfoImage.swift */; };
|
||||
5C9A5BDB2871E05400A5B906 /* SetNotificationsMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C9A5BDA2871E05400A5B906 /* SetNotificationsMode.swift */; };
|
||||
@@ -102,6 +99,11 @@
|
||||
5CB346E52868AA7F001FD2EF /* SuspendChat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB346E42868AA7F001FD2EF /* SuspendChat.swift */; };
|
||||
5CB346E72868D76D001FD2EF /* NotificationsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB346E62868D76D001FD2EF /* NotificationsView.swift */; };
|
||||
5CB346E92869E8BA001FD2EF /* PushEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB346E82869E8BA001FD2EF /* PushEnvironment.swift */; };
|
||||
5CB6349829DF7CF00066AD6B /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CB6349329DF7CF00066AD6B /* libgmpxx.a */; };
|
||||
5CB6349929DF7CF00066AD6B /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CB6349429DF7CF00066AD6B /* libffi.a */; };
|
||||
5CB6349A29DF7CF00066AD6B /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CB6349529DF7CF00066AD6B /* libgmp.a */; };
|
||||
5CB6349B29DF7CF00066AD6B /* libHSsimplex-chat-4.6.1.1-KdibHfABD5wCx2UMHpStjD-ghc8.10.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CB6349629DF7CF00066AD6B /* libHSsimplex-chat-4.6.1.1-KdibHfABD5wCx2UMHpStjD-ghc8.10.7.a */; };
|
||||
5CB6349C29DF7CF00066AD6B /* libHSsimplex-chat-4.6.1.1-KdibHfABD5wCx2UMHpStjD.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CB6349729DF7CF00066AD6B /* libHSsimplex-chat-4.6.1.1-KdibHfABD5wCx2UMHpStjD.a */; };
|
||||
5CB924D727A8563F00ACCCDD /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB924D627A8563F00ACCCDD /* SettingsView.swift */; };
|
||||
5CB924E127A867BA00ACCCDD /* UserProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB924E027A867BA00ACCCDD /* UserProfile.swift */; };
|
||||
5CB924E427A8683A00ACCCDD /* UserAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB924E327A8683A00ACCCDD /* UserAddress.swift */; };
|
||||
@@ -240,6 +242,8 @@
|
||||
18415845648CA4F5A8BCA272 /* UserProfilesView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserProfilesView.swift; sourceTree = "<group>"; };
|
||||
18415A7F0F189D87DEFEABCA /* PressedButtonStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PressedButtonStyle.swift; sourceTree = "<group>"; };
|
||||
18415B08031E8FB0F7FC27F9 /* CallViewRenderers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallViewRenderers.swift; sourceTree = "<group>"; };
|
||||
18415DAAAD1ADBEDB0EDA852 /* VideoPlayerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoPlayerView.swift; sourceTree = "<group>"; };
|
||||
18415FD2E36F13F596A45BB4 /* CIVideoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CIVideoView.swift; sourceTree = "<group>"; };
|
||||
3C714779281C0F6800CB4D4B /* www */ = {isa = PBXFileReference; lastKnownFileType = folder; name = www; path = ../android/app/src/main/assets/www; sourceTree = "<group>"; };
|
||||
3C8C548828133C84000A3EC7 /* PasteToConnectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasteToConnectView.swift; sourceTree = "<group>"; };
|
||||
3CDBCF4127FAE51000354CDD /* ComposeLinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeLinkView.swift; sourceTree = "<group>"; };
|
||||
@@ -251,7 +255,7 @@
|
||||
5C05DF522840AA1D00C683F9 /* CallSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallSettings.swift; sourceTree = "<group>"; };
|
||||
5C063D2627A4564100AEC577 /* ChatPreviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatPreviewView.swift; sourceTree = "<group>"; };
|
||||
5C10D88728EED12E00E58BF0 /* ContactConnectionInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactConnectionInfo.swift; sourceTree = "<group>"; };
|
||||
5C10D88928F187F300E58BF0 /* FullScreenImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullScreenImageView.swift; sourceTree = "<group>"; };
|
||||
5C10D88928F187F300E58BF0 /* FullScreenMediaView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullScreenMediaView.swift; sourceTree = "<group>"; };
|
||||
5C116CDB27AABE0400E66D01 /* ContactRequestView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactRequestView.swift; sourceTree = "<group>"; };
|
||||
5C13730A28156D2700F43030 /* ContactConnectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactConnectionView.swift; sourceTree = "<group>"; };
|
||||
5C13730C2815740A00F43030 /* DebugJSON.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = DebugJSON.playground; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
|
||||
@@ -290,11 +294,6 @@
|
||||
5C65DAEB29CB8867003CEE45 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
5C65DAEC29CB8908003CEE45 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = "es.lproj/SimpleX--iOS--InfoPlist.strings"; sourceTree = "<group>"; };
|
||||
5C65DAED29CB8908003CEE45 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
5C65DAEE29CBA429003CEE45 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
|
||||
5C65DAEF29CBA429003CEE45 /* libHSsimplex-chat-4.6.0.0-KxI2qGrpKDHEZQGy0eoUXU-ghc8.10.7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-4.6.0.0-KxI2qGrpKDHEZQGy0eoUXU-ghc8.10.7.a"; sourceTree = "<group>"; };
|
||||
5C65DAF029CBA429003CEE45 /* libHSsimplex-chat-4.6.0.0-KxI2qGrpKDHEZQGy0eoUXU.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-4.6.0.0-KxI2qGrpKDHEZQGy0eoUXU.a"; sourceTree = "<group>"; };
|
||||
5C65DAF129CBA429003CEE45 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
|
||||
5C65DAF229CBA429003CEE45 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
|
||||
5C65DAF829D0CC20003CEE45 /* DeveloperView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeveloperView.swift; sourceTree = "<group>"; };
|
||||
5C65F341297D3F3600B67AF3 /* VersionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VersionView.swift; sourceTree = "<group>"; };
|
||||
5C6AD81227A834E300348BD7 /* NewChatButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewChatButton.swift; sourceTree = "<group>"; };
|
||||
@@ -312,10 +311,10 @@
|
||||
5C8B41CA29AF41BC00888272 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
5C8B41CB29AF44CF00888272 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = "cs.lproj/SimpleX--iOS--InfoPlist.strings"; sourceTree = "<group>"; };
|
||||
5C8B41CC29AF44CF00888272 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
5C93292E29239A170090FFF9 /* SMPServersView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SMPServersView.swift; sourceTree = "<group>"; };
|
||||
5C93293029239BED0090FFF9 /* SMPServerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SMPServerView.swift; sourceTree = "<group>"; };
|
||||
5C93292E29239A170090FFF9 /* ProtocolServersView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProtocolServersView.swift; sourceTree = "<group>"; };
|
||||
5C93293029239BED0090FFF9 /* ProtocolServerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProtocolServerView.swift; sourceTree = "<group>"; };
|
||||
5C93293E2928E0FD0090FFF9 /* AudioRecPlay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioRecPlay.swift; sourceTree = "<group>"; };
|
||||
5C9329402929248A0090FFF9 /* ScanSMPServer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScanSMPServer.swift; sourceTree = "<group>"; };
|
||||
5C9329402929248A0090FFF9 /* ScanProtocolServer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScanProtocolServer.swift; sourceTree = "<group>"; };
|
||||
5C971E1C27AEBEF600C8A3CE /* ChatInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatInfoView.swift; sourceTree = "<group>"; };
|
||||
5C971E2027AEBF8300C8A3CE /* ChatInfoImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatInfoImage.swift; sourceTree = "<group>"; };
|
||||
5C9A5BDA2871E05400A5B906 /* SetNotificationsMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetNotificationsMode.swift; sourceTree = "<group>"; };
|
||||
@@ -356,6 +355,11 @@
|
||||
5CB346E42868AA7F001FD2EF /* SuspendChat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SuspendChat.swift; sourceTree = "<group>"; };
|
||||
5CB346E62868D76D001FD2EF /* NotificationsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationsView.swift; sourceTree = "<group>"; };
|
||||
5CB346E82869E8BA001FD2EF /* PushEnvironment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushEnvironment.swift; sourceTree = "<group>"; };
|
||||
5CB6349329DF7CF00066AD6B /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
|
||||
5CB6349429DF7CF00066AD6B /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
|
||||
5CB6349529DF7CF00066AD6B /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
|
||||
5CB6349629DF7CF00066AD6B /* libHSsimplex-chat-4.6.1.1-KdibHfABD5wCx2UMHpStjD-ghc8.10.7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-4.6.1.1-KdibHfABD5wCx2UMHpStjD-ghc8.10.7.a"; sourceTree = "<group>"; };
|
||||
5CB6349729DF7CF00066AD6B /* libHSsimplex-chat-4.6.1.1-KdibHfABD5wCx2UMHpStjD.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-4.6.1.1-KdibHfABD5wCx2UMHpStjD.a"; sourceTree = "<group>"; };
|
||||
5CB924D627A8563F00ACCCDD /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; };
|
||||
5CB924E027A867BA00ACCCDD /* UserProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserProfile.swift; sourceTree = "<group>"; };
|
||||
5CB924E327A8683A00ACCCDD /* UserAddress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddress.swift; sourceTree = "<group>"; };
|
||||
@@ -467,13 +471,13 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
5C65DAF629CBA429003CEE45 /* libgmpxx.a in Frameworks */,
|
||||
5CB6349C29DF7CF00066AD6B /* libHSsimplex-chat-4.6.1.1-KdibHfABD5wCx2UMHpStjD.a in Frameworks */,
|
||||
5CB6349B29DF7CF00066AD6B /* libHSsimplex-chat-4.6.1.1-KdibHfABD5wCx2UMHpStjD-ghc8.10.7.a in Frameworks */,
|
||||
5CB6349829DF7CF00066AD6B /* libgmpxx.a in Frameworks */,
|
||||
5CB6349A29DF7CF00066AD6B /* libgmp.a in Frameworks */,
|
||||
5CE2BA93284534B000EC33A6 /* libiconv.tbd in Frameworks */,
|
||||
5C65DAF329CBA429003CEE45 /* libgmp.a in Frameworks */,
|
||||
5C65DAF429CBA429003CEE45 /* libHSsimplex-chat-4.6.0.0-KxI2qGrpKDHEZQGy0eoUXU-ghc8.10.7.a in Frameworks */,
|
||||
5C65DAF729CBA429003CEE45 /* libffi.a in Frameworks */,
|
||||
5C65DAF529CBA429003CEE45 /* libHSsimplex-chat-4.6.0.0-KxI2qGrpKDHEZQGy0eoUXU.a in Frameworks */,
|
||||
5CE2BA94284534BB00EC33A6 /* libz.tbd in Frameworks */,
|
||||
5CB6349929DF7CF00066AD6B /* libffi.a in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -532,11 +536,11 @@
|
||||
5C764E5C279C70B7000C6508 /* Libraries */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
5C65DAF229CBA429003CEE45 /* libffi.a */,
|
||||
5C65DAEE29CBA429003CEE45 /* libgmp.a */,
|
||||
5C65DAF129CBA429003CEE45 /* libgmpxx.a */,
|
||||
5C65DAEF29CBA429003CEE45 /* libHSsimplex-chat-4.6.0.0-KxI2qGrpKDHEZQGy0eoUXU-ghc8.10.7.a */,
|
||||
5C65DAF029CBA429003CEE45 /* libHSsimplex-chat-4.6.0.0-KxI2qGrpKDHEZQGy0eoUXU.a */,
|
||||
5CB6349429DF7CF00066AD6B /* libffi.a */,
|
||||
5CB6349529DF7CF00066AD6B /* libgmp.a */,
|
||||
5CB6349329DF7CF00066AD6B /* libgmpxx.a */,
|
||||
5CB6349629DF7CF00066AD6B /* libHSsimplex-chat-4.6.1.1-KdibHfABD5wCx2UMHpStjD-ghc8.10.7.a */,
|
||||
5CB6349729DF7CF00066AD6B /* libHSsimplex-chat-4.6.1.1-KdibHfABD5wCx2UMHpStjD.a */,
|
||||
);
|
||||
path = Libraries;
|
||||
sourceTree = "<group>";
|
||||
@@ -584,6 +588,7 @@
|
||||
5CA7DFC229302AF000F7FDDE /* AppSheet.swift */,
|
||||
18415A7F0F189D87DEFEABCA /* PressedButtonStyle.swift */,
|
||||
5CCB939B297EFCB100399E78 /* NavStackCompat.swift */,
|
||||
18415DAAAD1ADBEDB0EDA852 /* VideoPlayerView.swift */,
|
||||
);
|
||||
path = Helpers;
|
||||
sourceTree = "<group>";
|
||||
@@ -685,9 +690,9 @@
|
||||
5CB924E027A867BA00ACCCDD /* UserProfile.swift */,
|
||||
5CC036DF29C488D500C0EF20 /* HiddenProfileView.swift */,
|
||||
5C577F7C27C83AA10006112D /* MarkdownHelp.swift */,
|
||||
5C93292E29239A170090FFF9 /* SMPServersView.swift */,
|
||||
5C93293029239BED0090FFF9 /* SMPServerView.swift */,
|
||||
5C9329402929248A0090FFF9 /* ScanSMPServer.swift */,
|
||||
5C93292E29239A170090FFF9 /* ProtocolServersView.swift */,
|
||||
5C93293029239BED0090FFF9 /* ProtocolServerView.swift */,
|
||||
5C9329402929248A0090FFF9 /* ScanProtocolServer.swift */,
|
||||
5CB2084E28DA4B4800D024EC /* RTCServers.swift */,
|
||||
5C3F1D592844B4DE00EC8A82 /* ExperimentalFeaturesView.swift */,
|
||||
64F1CC3A28B39D8600CD1FB1 /* IncognitoHelp.swift */,
|
||||
@@ -753,7 +758,7 @@
|
||||
5CEACCEC27DEA495000BD591 /* MsgContentView.swift */,
|
||||
5C3A88D027DF57800060F1C2 /* FramedItemView.swift */,
|
||||
649BCDA12805D6EF00C3A862 /* CIImageView.swift */,
|
||||
5C10D88928F187F300E58BF0 /* FullScreenImageView.swift */,
|
||||
5C10D88928F187F300E58BF0 /* FullScreenMediaView.swift */,
|
||||
648010AA281ADD15009009B9 /* CIFileView.swift */,
|
||||
644EFFDF292CFD7F00525D5B /* CIVoiceView.swift */,
|
||||
3CDBCF4727FF621E00354CDD /* CILinkView.swift */,
|
||||
@@ -768,6 +773,7 @@
|
||||
644EFFE32937BE9700525D5B /* MarkedDeletedItemView.swift */,
|
||||
1841511920742C6E152E469F /* AnimatedImageView.swift */,
|
||||
6407BA82295DA85D0082BA18 /* CIInvalidJSONView.swift */,
|
||||
18415FD2E36F13F596A45BB4 /* CIVideoView.swift */,
|
||||
);
|
||||
path = ChatItem;
|
||||
sourceTree = "<group>";
|
||||
@@ -1022,7 +1028,7 @@
|
||||
5C6AD81327A834E300348BD7 /* NewChatButton.swift in Sources */,
|
||||
5C3F1D58284363C400EC8A82 /* PrivacySettings.swift in Sources */,
|
||||
5C55A923283CEDE600C4E99E /* SoundPlayer.swift in Sources */,
|
||||
5C93292F29239A170090FFF9 /* SMPServersView.swift in Sources */,
|
||||
5C93292F29239A170090FFF9 /* ProtocolServersView.swift in Sources */,
|
||||
5CB924D727A8563F00ACCCDD /* SettingsView.swift in Sources */,
|
||||
5CEACCE327DE9246000BD591 /* ComposeView.swift in Sources */,
|
||||
5C65DAF929D0CC20003CEE45 /* DeveloperView.swift in Sources */,
|
||||
@@ -1032,7 +1038,7 @@
|
||||
5C13730B28156D2700F43030 /* ContactConnectionView.swift in Sources */,
|
||||
644EFFE0292CFD7F00525D5B /* CIVoiceView.swift in Sources */,
|
||||
6432857C2925443C00FBE5C8 /* GroupPreferencesView.swift in Sources */,
|
||||
5C93293129239BED0090FFF9 /* SMPServerView.swift in Sources */,
|
||||
5C93293129239BED0090FFF9 /* ProtocolServerView.swift in Sources */,
|
||||
5C9CC7AD28C55D7800BEF955 /* DatabaseEncryptionView.swift in Sources */,
|
||||
5CBD285A295711D700EC2CF4 /* ImageUtils.swift in Sources */,
|
||||
5CE4407927ADB701007B033A /* EmojiItemView.swift in Sources */,
|
||||
@@ -1052,7 +1058,7 @@
|
||||
3CDBCF4227FAE51000354CDD /* ComposeLinkView.swift in Sources */,
|
||||
3CDBCF4827FF621E00354CDD /* CILinkView.swift in Sources */,
|
||||
5C7505A827B6D34800BE3227 /* ChatInfoToolbar.swift in Sources */,
|
||||
5C10D88A28F187F300E58BF0 /* FullScreenImageView.swift in Sources */,
|
||||
5C10D88A28F187F300E58BF0 /* FullScreenMediaView.swift in Sources */,
|
||||
D72A9088294BD7A70047C86D /* NativeTextEditor.swift in Sources */,
|
||||
5C00164428A26FBC0094D739 /* ContextMenu.swift in Sources */,
|
||||
5C3A88D127DF57800060F1C2 /* FramedItemView.swift in Sources */,
|
||||
@@ -1122,7 +1128,7 @@
|
||||
6440CA00288857A10062C672 /* CIEventView.swift in Sources */,
|
||||
5CB0BA92282713FD00B3292C /* CreateProfile.swift in Sources */,
|
||||
5C5F2B7027EBC704006A9D5F /* ProfileImage.swift in Sources */,
|
||||
5C9329412929248A0090FFF9 /* ScanSMPServer.swift in Sources */,
|
||||
5C9329412929248A0090FFF9 /* ScanProtocolServer.swift in Sources */,
|
||||
64AA1C6C27F3537400AC7277 /* DeletedItemView.swift in Sources */,
|
||||
5C93293F2928E0FD0090FFF9 /* AudioRecPlay.swift in Sources */,
|
||||
5C029EA82837DBB3004A9677 /* CICallItemView.swift in Sources */,
|
||||
@@ -1143,6 +1149,8 @@
|
||||
18415C6C56DBCEC2CBBD2F11 /* WebRTCClient.swift in Sources */,
|
||||
184152CEF68D2336FC2EBCB0 /* CallViewRenderers.swift in Sources */,
|
||||
18415FEFE153C5920BFB7828 /* GroupWelcomeView.swift in Sources */,
|
||||
18415F9A2D551F9757DA4654 /* CIVideoView.swift in Sources */,
|
||||
184158C131FDB829D8A117EA /* VideoPlayerView.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -1400,7 +1408,7 @@
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 136;
|
||||
CURRENT_PROJECT_VERSION = 138;
|
||||
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
||||
ENABLE_BITCODE = NO;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
@@ -1442,7 +1450,7 @@
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 136;
|
||||
CURRENT_PROJECT_VERSION = 138;
|
||||
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
||||
ENABLE_BITCODE = NO;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
@@ -1522,7 +1530,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 136;
|
||||
CURRENT_PROJECT_VERSION = 138;
|
||||
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
||||
ENABLE_BITCODE = NO;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -1554,7 +1562,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 136;
|
||||
CURRENT_PROJECT_VERSION = 138;
|
||||
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
||||
ENABLE_BITCODE = NO;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
|
||||
@@ -57,9 +57,9 @@ public enum ChatCommand {
|
||||
case apiGroupLinkMemberRole(groupId: Int64, memberRole: GroupMemberRole)
|
||||
case apiDeleteGroupLink(groupId: Int64)
|
||||
case apiGetGroupLink(groupId: Int64)
|
||||
case apiGetUserSMPServers(userId: Int64)
|
||||
case apiSetUserSMPServers(userId: Int64, smpServers: [ServerCfg])
|
||||
case apiTestSMPServer(userId: Int64, smpServer: String)
|
||||
case apiGetUserProtoServers(userId: Int64, serverProtocol: ServerProtocol)
|
||||
case apiSetUserProtoServers(userId: Int64, serverProtocol: ServerProtocol, servers: [ServerCfg])
|
||||
case apiTestProtoServer(userId: Int64, server: String)
|
||||
case apiSetChatItemTTL(userId: Int64, seconds: Int64?)
|
||||
case apiGetChatItemTTL(userId: Int64)
|
||||
case apiSetNetworkConfig(networkConfig: NetCfg)
|
||||
@@ -158,9 +158,9 @@ public enum ChatCommand {
|
||||
case let .apiGroupLinkMemberRole(groupId, memberRole): return "/_set link role #\(groupId) \(memberRole)"
|
||||
case let .apiDeleteGroupLink(groupId): return "/_delete link #\(groupId)"
|
||||
case let .apiGetGroupLink(groupId): return "/_get link #\(groupId)"
|
||||
case let .apiGetUserSMPServers(userId): return "/_smp \(userId)"
|
||||
case let .apiSetUserSMPServers(userId, smpServers): return "/_smp \(userId) \(smpServersStr(smpServers: smpServers))"
|
||||
case let .apiTestSMPServer(userId, smpServer): return "/_smp test \(userId) \(smpServer)"
|
||||
case let .apiGetUserProtoServers(userId, serverProtocol): return "/_servers \(userId) \(serverProtocol)"
|
||||
case let .apiSetUserProtoServers(userId, serverProtocol, servers): return "/_servers \(userId) \(serverProtocol) \(protoServersStr(servers))"
|
||||
case let .apiTestProtoServer(userId, server): return "/_server test \(userId) \(server)"
|
||||
case let .apiSetChatItemTTL(userId, seconds): return "/_ttl \(userId) \(chatItemTTLStr(seconds: seconds))"
|
||||
case let .apiGetChatItemTTL(userId): return "/_ttl \(userId)"
|
||||
case let .apiSetNetworkConfig(networkConfig): return "/_network \(encodeJSON(networkConfig))"
|
||||
@@ -260,9 +260,9 @@ public enum ChatCommand {
|
||||
case .apiGroupLinkMemberRole: return "apiGroupLinkMemberRole"
|
||||
case .apiDeleteGroupLink: return "apiDeleteGroupLink"
|
||||
case .apiGetGroupLink: return "apiGetGroupLink"
|
||||
case .apiGetUserSMPServers: return "apiGetUserSMPServers"
|
||||
case .apiSetUserSMPServers: return "apiSetUserSMPServers"
|
||||
case .apiTestSMPServer: return "testSMPServer"
|
||||
case .apiGetUserProtoServers: return "apiGetUserProtoServers"
|
||||
case .apiSetUserProtoServers: return "apiSetUserProtoServers"
|
||||
case .apiTestProtoServer: return "apiTestProtoServer"
|
||||
case .apiSetChatItemTTL: return "apiSetChatItemTTL"
|
||||
case .apiGetChatItemTTL: return "apiGetChatItemTTL"
|
||||
case .apiSetNetworkConfig: return "apiSetNetworkConfig"
|
||||
@@ -313,8 +313,8 @@ public enum ChatCommand {
|
||||
"\(type.rawValue)\(id)"
|
||||
}
|
||||
|
||||
func smpServersStr(smpServers: [ServerCfg]) -> String {
|
||||
smpServers.isEmpty ? "default" : encodeJSON(SMPServersConfig(smpServers: smpServers))
|
||||
func protoServersStr(_ servers: [ServerCfg]) -> String {
|
||||
encodeJSON(ProtoServersConfig(servers: servers))
|
||||
}
|
||||
|
||||
func chatItemTTLStr(seconds: Int64?) -> String {
|
||||
@@ -375,8 +375,8 @@ public enum ChatResponse: Decodable, Error {
|
||||
case chatSuspended
|
||||
case apiChats(user: User, chats: [ChatData])
|
||||
case apiChat(user: User, chat: ChatData)
|
||||
case userSMPServers(user: User, smpServers: [ServerCfg], presetSMPServers: [String])
|
||||
case smpTestResult(user: User, smpTestFailure: SMPTestFailure?)
|
||||
case userProtoServers(user: User, servers: UserProtoServers)
|
||||
case serverTestResult(user: User, testServer: String, testFailure: ProtocolTestFailure?)
|
||||
case chatItemTTL(user: User, chatItemTTL: Int64?)
|
||||
case networkConfig(networkConfig: NetCfg)
|
||||
case contactInfo(user: User, contact: Contact, connectionStats: ConnectionStats, customUserProfile: Profile?)
|
||||
@@ -488,8 +488,8 @@ public enum ChatResponse: Decodable, Error {
|
||||
case .chatSuspended: return "chatSuspended"
|
||||
case .apiChats: return "apiChats"
|
||||
case .apiChat: return "apiChat"
|
||||
case .userSMPServers: return "userSMPServers"
|
||||
case .smpTestResult: return "smpTestResult"
|
||||
case .userProtoServers: return "userProtoServers"
|
||||
case .serverTestResult: return "serverTestResult"
|
||||
case .chatItemTTL: return "chatItemTTL"
|
||||
case .networkConfig: return "networkConfig"
|
||||
case .contactInfo: return "contactInfo"
|
||||
@@ -601,8 +601,8 @@ public enum ChatResponse: Decodable, Error {
|
||||
case .chatSuspended: return noDetails
|
||||
case let .apiChats(u, chats): return withUser(u, String(describing: chats))
|
||||
case let .apiChat(u, chat): return withUser(u, String(describing: chat))
|
||||
case let .userSMPServers(u, smpServers, presetServers): return withUser(u, "smpServers: \(String(describing: smpServers))\npresetServers: \(String(describing: presetServers))")
|
||||
case let .smpTestResult(u, smpTestFailure): return withUser(u, String(describing: smpTestFailure))
|
||||
case let .userProtoServers(u, servers): return withUser(u, "servers: \(String(describing: servers))")
|
||||
case let .serverTestResult(u, server, testFailure): return withUser(u, "server: \(server)\result: \(String(describing: testFailure))")
|
||||
case let .chatItemTTL(u, chatItemTTL): return withUser(u, String(describing: chatItemTTL))
|
||||
case let .networkConfig(networkConfig): return String(describing: networkConfig)
|
||||
case let .contactInfo(u, contact, connectionStats, customUserProfile): return withUser(u, "contact: \(String(describing: contact))\nconnectionStats: \(String(describing: connectionStats))\ncustomUserProfile: \(String(describing: customUserProfile))")
|
||||
@@ -760,6 +760,21 @@ struct SMPServersConfig: Encodable {
|
||||
var smpServers: [ServerCfg]
|
||||
}
|
||||
|
||||
public enum ServerProtocol: String, Decodable {
|
||||
case smp
|
||||
case xftp
|
||||
}
|
||||
|
||||
public struct ProtoServersConfig: Codable {
|
||||
public var servers: [ServerCfg]
|
||||
}
|
||||
|
||||
public struct UserProtoServers: Decodable {
|
||||
public var serverProtocol: ServerProtocol
|
||||
public var protoServers: [ServerCfg]
|
||||
public var presetServers: [String]
|
||||
}
|
||||
|
||||
public struct ServerCfg: Identifiable, Equatable, Codable {
|
||||
public var server: String
|
||||
public var preset: Bool
|
||||
@@ -824,29 +839,39 @@ public struct ServerCfg: Identifiable, Equatable, Codable {
|
||||
}
|
||||
}
|
||||
|
||||
public enum SMPTestStep: String, Decodable, Equatable {
|
||||
public enum ProtocolTestStep: String, Decodable, Equatable {
|
||||
case connect
|
||||
case disconnect
|
||||
case createQueue
|
||||
case secureQueue
|
||||
case deleteQueue
|
||||
case disconnect
|
||||
case createFile
|
||||
case uploadFile
|
||||
case downloadFile
|
||||
case compareFile
|
||||
case deleteFile
|
||||
|
||||
var text: String {
|
||||
switch self {
|
||||
case .connect: return NSLocalizedString("Connect", comment: "server test step")
|
||||
case .disconnect: return NSLocalizedString("Disconnect", comment: "server test step")
|
||||
case .createQueue: return NSLocalizedString("Create queue", comment: "server test step")
|
||||
case .secureQueue: return NSLocalizedString("Secure queue", comment: "server test step")
|
||||
case .deleteQueue: return NSLocalizedString("Delete queue", comment: "server test step")
|
||||
case .disconnect: return NSLocalizedString("Disconnect", comment: "server test step")
|
||||
case .createFile: return NSLocalizedString("Create file", comment: "server test step")
|
||||
case .uploadFile: return NSLocalizedString("Upload file", comment: "server test step")
|
||||
case .downloadFile: return NSLocalizedString("Download file", comment: "server test step")
|
||||
case .compareFile: return NSLocalizedString("Compare file", comment: "server test step")
|
||||
case .deleteFile: return NSLocalizedString("Delete file", comment: "server test step")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public struct SMPTestFailure: Decodable, Error, Equatable {
|
||||
var testStep: SMPTestStep
|
||||
public struct ProtocolTestFailure: Decodable, Error, Equatable {
|
||||
var testStep: ProtocolTestStep
|
||||
var testError: AgentErrorType
|
||||
|
||||
public static func == (l: SMPTestFailure, r: SMPTestFailure) -> Bool {
|
||||
public static func == (l: ProtocolTestFailure, r: ProtocolTestFailure) -> Bool {
|
||||
l.testStep == r.testStep
|
||||
}
|
||||
|
||||
@@ -855,6 +880,8 @@ public struct SMPTestFailure: Decodable, Error, Equatable {
|
||||
switch testError {
|
||||
case .SMP(.AUTH):
|
||||
return err + " " + NSLocalizedString("Server requires authorization to create queues, check password", comment: "server test error")
|
||||
case .XFTP(.AUTH):
|
||||
return err + " " + NSLocalizedString("Server requires authorization to upload, check password", comment: "server test error")
|
||||
case .BROKER(_, .NETWORK):
|
||||
return err + " " + NSLocalizedString("Possibly, certificate fingerprint in server address is incorrect", comment: "server test error")
|
||||
default:
|
||||
@@ -864,12 +891,14 @@ public struct SMPTestFailure: Decodable, Error, Equatable {
|
||||
}
|
||||
|
||||
public struct ServerAddress: Decodable {
|
||||
public var serverProtocol: ServerProtocol
|
||||
public var hostnames: [String]
|
||||
public var port: String
|
||||
public var keyHash: String
|
||||
public var basicAuth: String
|
||||
|
||||
public init(hostnames: [String], port: String, keyHash: String, basicAuth: String = "") {
|
||||
public init(serverProtocol: ServerProtocol, hostnames: [String], port: String, keyHash: String, basicAuth: String = "") {
|
||||
self.serverProtocol = serverProtocol
|
||||
self.hostnames = hostnames
|
||||
self.port = port
|
||||
self.keyHash = keyHash
|
||||
@@ -877,21 +906,25 @@ public struct ServerAddress: Decodable {
|
||||
}
|
||||
|
||||
public var uri: String {
|
||||
"smp://\(keyHash)\(basicAuth == "" ? "" : ":" + basicAuth)@\(hostnames.joined(separator: ","))"
|
||||
"\(serverProtocol)://\(keyHash)\(basicAuth == "" ? "" : ":" + basicAuth)@\(hostnames.joined(separator: ","))"
|
||||
}
|
||||
|
||||
public var valid: Bool {
|
||||
hostnames.count > 0 && Set(hostnames).count == hostnames.count
|
||||
}
|
||||
|
||||
static public var empty = ServerAddress(
|
||||
hostnames: [],
|
||||
port: "",
|
||||
keyHash: "",
|
||||
basicAuth: ""
|
||||
)
|
||||
static func empty(_ serverProtocol: ServerProtocol) -> ServerAddress {
|
||||
ServerAddress(
|
||||
serverProtocol: serverProtocol,
|
||||
hostnames: [],
|
||||
port: "",
|
||||
keyHash: "",
|
||||
basicAuth: ""
|
||||
)
|
||||
}
|
||||
|
||||
static public var sampleData = ServerAddress(
|
||||
serverProtocol: .smp,
|
||||
hostnames: ["smp.simplex.im", "1234.onion"],
|
||||
port: "",
|
||||
keyHash: "LcJUMfVhwD8yxjAiSaDzzGF3-kLG4Uh0Fl_ZIjrRwjI=",
|
||||
@@ -1236,6 +1269,7 @@ public enum AgentErrorType: Decodable {
|
||||
case CMD(cmdErr: CommandErrorType)
|
||||
case CONN(connErr: ConnectionErrorType)
|
||||
case SMP(smpErr: ProtocolErrorType)
|
||||
case XFTP(xftpErr: XFTPErrorType)
|
||||
case NTF(ntfErr: ProtocolErrorType)
|
||||
case BROKER(brokerAddress: String, brokerErr: BrokerErrorType)
|
||||
case AGENT(agentErr: SMPAgentError)
|
||||
@@ -1277,6 +1311,21 @@ public enum ProtocolErrorType: Decodable {
|
||||
case INTERNAL
|
||||
}
|
||||
|
||||
public enum XFTPErrorType: Decodable {
|
||||
case BLOCK
|
||||
case SESSION
|
||||
case CMD(cmdErr: ProtocolCommandError)
|
||||
case AUTH
|
||||
case SIZE
|
||||
case QUOTA
|
||||
case DIGEST
|
||||
case CRYPTO
|
||||
case NO_FILE
|
||||
case HAS_FILE
|
||||
case FILE_IO
|
||||
case INTERNAL
|
||||
}
|
||||
|
||||
public enum ProtocolCommandError: Decodable {
|
||||
case UNKNOWN
|
||||
case SYNTAX
|
||||
|
||||
@@ -2289,6 +2289,7 @@ public enum MsgContent {
|
||||
case text(String)
|
||||
case link(text: String, preview: LinkPreview)
|
||||
case image(text: String, image: String)
|
||||
case video(text: String, image: String, duration: Int)
|
||||
case voice(text: String, duration: Int)
|
||||
case file(String)
|
||||
// TODO include original JSON, possibly using https://github.com/zoul/generic-json-swift
|
||||
@@ -2299,6 +2300,7 @@ public enum MsgContent {
|
||||
case let .text(text): return text
|
||||
case let .link(text, _): return text
|
||||
case let .image(text, _): return text
|
||||
case let .video(text, _, _): return text
|
||||
case let .voice(text, _): return text
|
||||
case let .file(text): return text
|
||||
case let .unknown(_, text): return text
|
||||
@@ -2326,6 +2328,13 @@ public enum MsgContent {
|
||||
}
|
||||
}
|
||||
|
||||
public var isVideo: Bool {
|
||||
switch self {
|
||||
case .video: return true
|
||||
default: return false
|
||||
}
|
||||
}
|
||||
|
||||
var cmdString: String {
|
||||
"json \(encodeJSON(self))"
|
||||
}
|
||||
@@ -2356,6 +2365,11 @@ extension MsgContent: Decodable {
|
||||
let text = try container.decode(String.self, forKey: CodingKeys.text)
|
||||
let image = try container.decode(String.self, forKey: CodingKeys.image)
|
||||
self = .image(text: text, image: image)
|
||||
case "video":
|
||||
let text = try container.decode(String.self, forKey: CodingKeys.text)
|
||||
let image = try container.decode(String.self, forKey: CodingKeys.image)
|
||||
let duration = try container.decode(Int.self, forKey: CodingKeys.duration)
|
||||
self = .video(text: text, image: image, duration: duration)
|
||||
case "voice":
|
||||
let text = try container.decode(String.self, forKey: CodingKeys.text)
|
||||
let duration = try container.decode(Int.self, forKey: CodingKeys.duration)
|
||||
@@ -2388,6 +2402,11 @@ extension MsgContent: Encodable {
|
||||
try container.encode("image", forKey: .type)
|
||||
try container.encode(text, forKey: .text)
|
||||
try container.encode(image, forKey: .image)
|
||||
case let .video(text, image, duration):
|
||||
try container.encode("video", forKey: .type)
|
||||
try container.encode(text, forKey: .text)
|
||||
try container.encode(image, forKey: .image)
|
||||
try container.encode(duration, forKey: .duration)
|
||||
case let .voice(text, duration):
|
||||
try container.encode("voice", forKey: .type)
|
||||
try container.encode(text, forKey: .text)
|
||||
|
||||
@@ -16,6 +16,8 @@ public let MAX_IMAGE_SIZE: Int64 = 236700
|
||||
|
||||
public let MAX_IMAGE_SIZE_AUTO_RCV: Int64 = MAX_IMAGE_SIZE * 2
|
||||
|
||||
public let MAX_VIDEO_SIZE_AUTO_RCV: Int64 = 8000000
|
||||
|
||||
public let MAX_FILE_SIZE_XFTP: Int64 = 1_073_741_824
|
||||
|
||||
public let MAX_FILE_SIZE_SMP: Int64 = 8000000
|
||||
@@ -182,6 +184,14 @@ public func saveFile(_ data: Data, _ fileName: String) -> String? {
|
||||
}
|
||||
}
|
||||
|
||||
public func removeFile(_ url: URL) {
|
||||
do {
|
||||
try FileManager.default.removeItem(atPath: url.path)
|
||||
} catch {
|
||||
logger.error("FileUtils.removeFile error: \(error.localizedDescription)")
|
||||
}
|
||||
}
|
||||
|
||||
public func removeFile(_ fileName: String) {
|
||||
do {
|
||||
try FileManager.default.removeItem(atPath: getAppFilePath(fileName).path)
|
||||
|
||||
@@ -413,9 +413,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Can't invite contacts!" = "Nelze pozvat kontakty!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* chat item action */
|
||||
"Cancel" = "Zrušit";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Cancel file transfer?" = "Zrušit přenos souboru?";
|
||||
|
||||
/* feature offered item */
|
||||
"cancelled %@" = "zrušeno %@";
|
||||
|
||||
@@ -527,6 +530,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm" = "Potvrdit";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm database upgrades" = "Potvrdit aktualizaci databáze";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm new passphrase…" = "Potvrdit novou heslovou frázi…";
|
||||
|
||||
@@ -692,6 +698,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Dark" = "Tmavý";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database downgrade" = "Původní databáze";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database encrypted!" = "Databáze zašifrována!";
|
||||
|
||||
@@ -707,6 +716,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Database ID" = "ID databáze";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database IDs and Transport isolation option." = "ID databáze a možnost Izolace přenosu.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database is encrypted using a random passphrase, you can change it." = "Databáze je zašifrována pomocí náhodné přístupové fráze, můžete ji změnit.";
|
||||
|
||||
@@ -725,6 +737,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Database passphrase is required to open chat." = "Pro otevření chatu je vyžadována přístupová fráze databáze.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database upgrade" = "Aktualizace databáze";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database will be encrypted and the passphrase stored in the keychain.\n" = "Databáze bude zašifrována a heslo bude uloženo v klíčence.\n";
|
||||
|
||||
@@ -761,6 +776,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat archive?" = "Smazat archiv chatu?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat profile" = "Smazat chat profil";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat profile?" = "Smazat chat profil?";
|
||||
|
||||
@@ -830,6 +848,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Delete pending connection?" = "Smazat čekající připojení?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete profile" = "Smazat profil";
|
||||
|
||||
/* server test step */
|
||||
"Delete queue" = "Odstranit frontu";
|
||||
|
||||
@@ -902,6 +923,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Don't show again" = "Znovu neukazuj";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Downgrade and open chat" = "Snížit a otevřít chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Duplicate display name!" = "Duplicitní zobrazované jméno!";
|
||||
|
||||
@@ -983,6 +1007,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Enter passphrase…" = "Zadejte přístupovou frázi…";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Enter password above to show!" = "Zadejte heslo do hledání!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Enter server manually" = "Zadejte server ručně";
|
||||
|
||||
@@ -1106,6 +1133,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Error updating user privacy" = "Chyba aktualizace soukromí uživatele";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error: " = "Chyba: ";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error: %@" = "Chyba: %@";
|
||||
|
||||
@@ -1133,6 +1163,12 @@
|
||||
/* 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í.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"File will be received when your contact is online, please wait or check later!" = "Soubor bude přijat, až bude váš kontakt online, vyčkejte prosím nebo se podívejte později!";
|
||||
|
||||
@@ -1157,6 +1193,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Full name:" = "Celé jméno:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Fully re-implemented - work in background!" = "Plně přepracováno, prácuje na pozadí!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Further reduced battery usage" = "Další snížení spotřeby baterie";
|
||||
|
||||
@@ -1253,6 +1292,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Hide profile" = "Skrýt profil";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Hide:" = "Skrýt:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"How it works" = "Jak to funguje";
|
||||
|
||||
@@ -1283,6 +1325,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Ignore" = "Ignorovat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Image will be received when your contact completes uploading it." = "Obrázek bude přijat, až kontakt dokončí jeho nahrání.";
|
||||
|
||||
/* 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!";
|
||||
|
||||
@@ -1334,6 +1379,9 @@
|
||||
/* notification */
|
||||
"Incoming video call" = "Příchozí videohovor";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Incompatible database version" = "Nekompatibilní verze databáze";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Incorrect security code!" = "Nesprávný bezpečnostní kód!";
|
||||
|
||||
@@ -1836,6 +1884,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Profile image" = "Profilový obrázek";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Profile password" = "Heslo profilu";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Prohibit irreversible message deletion." = "Zakázat nevratné mazání zpráv.";
|
||||
|
||||
@@ -2136,12 +2187,18 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Show calls in phone history" = "Ukaž hovory v historii telefonu";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show developer options" = "Zobrazit možnosti vývojáře";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show preview" = "Zobrazení náhledu";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show QR code" = "Zobrazit QR kód";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show:" = "Zobrazit:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html)." = "Zabezpečení SimpleX chatu bylo [auditováno společností Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).";
|
||||
|
||||
@@ -2313,6 +2370,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"There should be at least one user profile." = "Měl by tam být alespoň jeden uživatelský profil.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"There should be at least one visible user profile." = "Měl by tam být alespoň jeden viditelný uživatelský profil.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." = "Tuto akci nelze vrátit zpět - všechny přijaté a odeslané soubory a média budou smazány. Obrázky s nízkým rozlišením zůstanou zachovány.";
|
||||
|
||||
@@ -2355,6 +2415,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"To record voice message please grant permission to use Microphone." = "Chcete-li nahrávat hlasové zprávy, udělte povolení k použití mikrofonu.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"To reveal your hidden profile, enter a full password into a search field in **Your chat profiles** page." = "Chcete-li odhalit svůj skrytý profil, zadejte celé heslo do vyhledávacího pole na stránce **Chat profily**.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"To support instant push notifications the chat database has to be migrated." = "Pro podporu doručování okamžitých upozornění musí být přenesena chat databáze.";
|
||||
|
||||
@@ -2388,6 +2451,15 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Unexpected migration state" = "Neočekávaný stav přenášení";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide" = "Odkrýt";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide chat profile" = "Odkrýt chat profil";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide profile" = "Odkrýt profil";
|
||||
|
||||
/* connection info */
|
||||
"unknown" = "neznámý";
|
||||
|
||||
@@ -2439,6 +2511,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Updating this setting will re-connect the client to all servers." = "Aktualizace tohoto nastavení znovu připojí klienta ke všem serverům.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Upgrade and open chat" = "Zvýšit a otevřít chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use .onion hosts" = "Použít hostitele .onion";
|
||||
|
||||
@@ -2469,6 +2544,9 @@
|
||||
/* 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í";
|
||||
|
||||
@@ -2529,6 +2607,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"wants to connect to you!" = "chce se s vámi spojit!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Warning: you may lose some data!" = "Upozornění: můžete ztratit nějaká data!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"WebRTC ICE servers" = "WebRTC servery ICE";
|
||||
|
||||
@@ -2592,6 +2673,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button." = "Můžete se také připojit kliknutím na odkaz. Pokud se otevře v prohlížeči, klikněte na tlačítko **Otevřít v mobilní aplikaci**.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You can hide or mute a user profile - swipe it to the right.\nSimpleX Lock must be enabled." = "Profil uživatele můžete skrýt nebo ztlumit - přejeďte prstem doprava.\nSimpleX zámek musí být povolen.";
|
||||
|
||||
/* notification body */
|
||||
"You can now send messages to %@" = "Nyní můžete posílat zprávy %@";
|
||||
|
||||
@@ -2685,6 +2769,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"You will join a group this link refers to and connect to its group members." = "Připojíte se ke skupině, na kterou tento odkaz odkazuje, a spojíte se s jejími členy.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You will still receive calls and notifications from muted profiles when they are active." = "Stále budete přijímat volání a upozornění od umlčených profilů pokud budou aktivní.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You will stop receiving messages from this group. Chat history will be preserved." = "Přestanete dostávat zprávy z této skupiny. Historie chatu bude zachována.";
|
||||
|
||||
|
||||
@@ -249,7 +249,7 @@
|
||||
"Add to another device" = "Einem anderen Gerät hinzufügen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Add welcome message" = "Fügen Sie eine Begrüßungsmeldung hinzu";
|
||||
"Add welcome message" = "Begrüßungsmeldung hinzufügen";
|
||||
|
||||
/* member role */
|
||||
"admin" = "Admin";
|
||||
@@ -413,9 +413,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Can't invite contacts!" = "Kontakte können nicht eingeladen werden!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* chat item action */
|
||||
"Cancel" = "Abbrechen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Cancel file transfer?" = "Dateitransfer abbrechen?";
|
||||
|
||||
/* feature offered item */
|
||||
"cancelled %@" = "abgebrochen %@";
|
||||
|
||||
@@ -527,11 +530,14 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm" = "Bestätigen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm database upgrades" = "Datenbank-Aktualisierungen bestätigen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm new passphrase…" = "Neues Passwort bestätigen…";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm password" = "Bestätigen Sie das Passwort";
|
||||
"Confirm password" = "Passwort bestätigen";
|
||||
|
||||
/* server test step */
|
||||
"Connect" = "Verbinden";
|
||||
@@ -692,6 +698,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Dark" = "Dunkel";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database downgrade" = "Datenbank-Herabstufung";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database encrypted!" = "Datenbank verschlüsselt!";
|
||||
|
||||
@@ -707,6 +716,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Database ID" = "Datenbank-ID";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database IDs and Transport isolation option." = "Datenbank-IDs und Transport-Isolationsoption.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database is encrypted using a random passphrase, you can change it." = "Die Datenbank wird mit einem zufälligen Passwort verschlüsselt, Sie können es ändern.";
|
||||
|
||||
@@ -725,6 +737,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Database passphrase is required to open chat." = "Das Datenbank-Passwort ist erforderlich, um den Chat zu öffnen.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database upgrade" = "Datenbank-Aktualisierung";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database will be encrypted and the passphrase stored in the keychain.\n" = "Die Datenbank wird verschlüsselt, und das Passwort im Keychain gespeichert.\n";
|
||||
|
||||
@@ -761,6 +776,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat archive?" = "Chat Archiv löschen?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat profile" = "Chat-Profil löschen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat profile?" = "Chat-Profil löschen?";
|
||||
|
||||
@@ -830,6 +848,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Delete pending connection?" = "Die ausstehende Verbindung löschen?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete profile" = "Profil löschen";
|
||||
|
||||
/* server test step */
|
||||
"Delete queue" = "Lösche Warteschlange";
|
||||
|
||||
@@ -902,6 +923,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Don't show again" = "Nicht nochmals anzeigen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Downgrade and open chat" = "Herabstufen und den Chat öffnen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Duplicate display name!" = "Doppelter Anzeigename!";
|
||||
|
||||
@@ -984,7 +1008,7 @@
|
||||
"Enter passphrase…" = "Passwort eingeben…";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Enter password above to show!" = "Geben Sie oben das Passwort für die Anzeige an!";
|
||||
"Enter password above to show!" = "Für die Anzeige das Passwort im Suchfeld eingeben!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Enter server manually" = "Geben Sie den Server manuell ein";
|
||||
@@ -1109,6 +1133,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Error updating user privacy" = "Fehler beim Aktualisieren der Benutzer-Privatsphäre";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error: " = "Fehler: ";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error: %@" = "Fehler: %@";
|
||||
|
||||
@@ -1136,6 +1163,12 @@
|
||||
/* 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.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"File will be received when your contact is online, please wait or check later!" = "Die Datei wird empfangen, sobald Ihr Kontakt online ist. Bitte warten oder schauen Sie später nochmal nach!";
|
||||
|
||||
@@ -1257,7 +1290,10 @@
|
||||
"Hide app screen in the recent apps." = "App-Bildschirm in aktuellen Anwendungen verbergen.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Hide profile" = "Verberge das Profil";
|
||||
"Hide profile" = "Profil verbergen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Hide:" = "Verberge:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"How it works" = "Wie es funktioniert";
|
||||
@@ -1289,6 +1325,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Ignore" = "Ignorieren";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Image will be received when your contact completes uploading it." = "Das Bild wird empfangen, sobald das Hochladen durch ihren Kontakt abgeschlossen ist.";
|
||||
|
||||
/* 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!";
|
||||
|
||||
@@ -1340,6 +1379,9 @@
|
||||
/* notification */
|
||||
"Incoming video call" = "Eingehender Videoanruf";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Incompatible database version" = "Inkompatible Datenbank-Version";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Incorrect security code!" = "Falscher Sicherheitscode!";
|
||||
|
||||
@@ -1488,7 +1530,7 @@
|
||||
"Make a private connection" = "Stellen Sie eine private Verbindung her";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Make profile private!" = "Erzeugen Sie ein privates Profil!";
|
||||
"Make profile private!" = "Privates Profil erzeugen!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Make sure SMP server addresses are in correct format, line separated and are not duplicated (%@)." = "Stellen Sie sicher, dass die SMP-Server-Adressen das richtige Format haben, zeilenweise getrennt und nicht doppelt vorhanden sind (%@).";
|
||||
@@ -1572,7 +1614,7 @@
|
||||
"moderated" = "Moderiert";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"moderated by %@" = "von %@ moderiert";
|
||||
"moderated by %@" = "Von %@ moderiert";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"More improvements are coming soon!" = "Weitere Verbesserungen sind bald verfügbar!";
|
||||
@@ -1842,6 +1884,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Profile image" = "Profilbild";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Profile password" = "Passwort für Profil";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Prohibit irreversible message deletion." = "Unwiederbringliches löschen von Nachrichten nicht erlauben.";
|
||||
|
||||
@@ -1858,7 +1903,7 @@
|
||||
"Protect app screen" = "App-Bildschirm schützen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Protect your chat profiles with a password!" = "Schützen Sie Ihre Chat-Profile mit einem Passwort!";
|
||||
"Protect your chat profiles with a password!" = "Ihre Chat-Profile mit einem Passwort schützen!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Protocol timeout" = "Protokollzeitüberschreitung";
|
||||
@@ -1993,7 +2038,7 @@
|
||||
"Save and notify group members" = "Speichern und Gruppenmitglieder benachrichtigen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Save and update group profile" = "Sichern und aktualisieren des Gruppen-Profils";
|
||||
"Save and update group profile" = "Gruppen-Profil sichern und aktualisieren";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Save archive" = "Archiv speichern";
|
||||
@@ -2119,7 +2164,7 @@
|
||||
"Set passphrase to export" = "Passwort für den Export festlegen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Set the message shown to new members!" = "Legen Sie die Nachricht fest, die neuen Mitgliedern angezeigt werden soll!";
|
||||
"Set the message shown to new members!" = "Definieren Sie eine Begrüßungsmeldung, die neuen Mitgliedern angezeigt wird!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Set timeouts for proxy/VPN" = "Zeitüberschreitungen für Proxy/VPN einstellen";
|
||||
@@ -2140,7 +2185,10 @@
|
||||
"Share one-time invitation link" = "Einmal-Einladungslink teilen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show calls in phone history" = "Anrufliste zeigen";
|
||||
"Show calls in phone history" = "Anrufliste anzeigen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show developer options" = "Entwickleroptionen anzeigen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show preview" = "Vorschau anzeigen";
|
||||
@@ -2148,6 +2196,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Show QR code" = "QR-Code anzeigen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show:" = "Anzeigen:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html)." = "Die Sicherheit von SimpleX Chat wurde [von Trail of Bits überprüft](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).";
|
||||
|
||||
@@ -2403,6 +2454,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide" = "Verbergen aufheben";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide chat profile" = "Verbergen des Chat-Profils aufheben";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide profile" = "Verbergen des Profils aufheben";
|
||||
|
||||
/* connection info */
|
||||
"unknown" = "Unbekannt";
|
||||
|
||||
@@ -2454,6 +2511,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Updating this setting will re-connect the client to all servers." = "Die Aktualisierung dieser Einstellung wird den Client wieder mit allen Servern verbinden.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Upgrade and open chat" = "Aktualisieren und den Chat öffnen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use .onion hosts" = "Verwende .onion-Hosts";
|
||||
|
||||
@@ -2464,7 +2524,7 @@
|
||||
"Use for new connections" = "Für neue Verbindungen nutzen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use iOS call interface" = "Benutzen Sie die iOS Anrufschnittstelle";
|
||||
"Use iOS call interface" = "iOS Anrufschnittstelle nutzen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use server" = "Server nutzen";
|
||||
@@ -2484,6 +2544,9 @@
|
||||
/* 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";
|
||||
|
||||
@@ -2544,6 +2607,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"wants to connect to you!" = "möchte sich mit Ihnen verbinden!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Warning: you may lose some data!" = "Warnung: Sie könnten einige Daten verlieren!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"WebRTC ICE servers" = "WebRTC ICE-Server";
|
||||
|
||||
|
||||
@@ -339,7 +339,7 @@
|
||||
"Attach" = "Adjuntar";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Audio & video calls" = "Llamadas de audio y vídeo";
|
||||
"Audio & video calls" = "Llamadas y videollamadas";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Audio and video calls" = "Llamadas y videollamadas";
|
||||
@@ -413,9 +413,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Can't invite contacts!" = "¡No se puede invitar a los contactos!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* chat item action */
|
||||
"Cancel" = "Cancelar";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Cancel file transfer?" = "¿Cancelar el envío de archivos?";
|
||||
|
||||
/* feature offered item */
|
||||
"cancelled %@" = "cancelado %@";
|
||||
|
||||
@@ -477,10 +480,10 @@
|
||||
"Chat is running" = "El chat está en ejecución";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Chat is stopped" = "El chat está detenido";
|
||||
"Chat is stopped" = "Chat está detenido";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Chat preferences" = "Preferencias de chat";
|
||||
"Chat preferences" = "Preferencias de Chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Chats" = "Chats";
|
||||
@@ -527,6 +530,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm" = "Confirmar";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm database upgrades" = "Confirmar actualizaciones de la bases de datos";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm new passphrase…" = "Confirme nueva contraseña…";
|
||||
|
||||
@@ -692,6 +698,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Dark" = "Oscuro";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database downgrade" = "Degradación de la base de datos";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database encrypted!" = "¡Base de datos cifrada!";
|
||||
|
||||
@@ -707,6 +716,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Database ID" = "ID de la base de datos";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database IDs and Transport isolation option." = "ID de base de datos y opción de aislamiento de transporte.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database is encrypted using a random passphrase, you can change it." = "La base de datos está cifrada con una contraseña aleatoria, puedes cambiarla.";
|
||||
|
||||
@@ -717,7 +729,7 @@
|
||||
"Database passphrase" = "Contraseña de la base de datos";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database passphrase & export" = "Contraseña y exportar la base de datos";
|
||||
"Database passphrase & export" = "Base de datos\ny frase de contraseña";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database passphrase is different from saved in the keychain." = "La contraseña es distinta a la almacenada en Keychain.";
|
||||
@@ -725,6 +737,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Database passphrase is required to open chat." = "Para abrir la aplicación se requiere la contraseña de la base de datos.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database upgrade" = "Actualización de la base de datos";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database will be encrypted and the passphrase stored in the keychain.\n" = "La base de datos será cifrada y la contraseña se guardará en Keychain.\n";
|
||||
|
||||
@@ -750,7 +765,7 @@
|
||||
"Delete address?" = "¿Eliminar la dirección?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete after" = "Eliminar después";
|
||||
"Delete after" = "Eliminar después de";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete all files" = "Eliminar todos los archivos";
|
||||
@@ -761,6 +776,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat archive?" = "¿Eliminar archivo del chat?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat profile" = "Eliminar perfil de chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat profile?" = "¿Eliminar el perfil de chat?";
|
||||
|
||||
@@ -783,7 +801,7 @@
|
||||
"Delete files and media?" = "Eliminar archivos y multimedia?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete files for all chat profiles" = "Eliminar archivos para todos los perfiles de chat";
|
||||
"Delete files for all chat profiles" = "Eliminar archivos para todos los perfiles Chat";
|
||||
|
||||
/* chat feature */
|
||||
"Delete for everyone" = "Eliminar para todos";
|
||||
@@ -816,7 +834,7 @@
|
||||
"Delete messages" = "Eliminar mensaje";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete messages after" = "Eliminar mensaje después";
|
||||
"Delete messages after" = "Eliminar después de";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete old database" = "Eliminar base de datos antigua";
|
||||
@@ -830,6 +848,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Delete pending connection?" = "¿Eliminar conexion pendiente?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete profile" = "Eliminar perfil";
|
||||
|
||||
/* server test step */
|
||||
"Delete queue" = "Eliminar cola";
|
||||
|
||||
@@ -870,7 +891,7 @@
|
||||
"Direct messages" = "Mensajes directos";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Direct messages between members are prohibited in this group." = "Los mensajes directos entre miembros del grupo están prohibidos.";
|
||||
"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";
|
||||
@@ -879,10 +900,10 @@
|
||||
"Disappearing messages" = "Mensajes temporales";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Disappearing messages are prohibited in this chat." = "Los mensajes temporales están prohibidos en este chat.";
|
||||
"Disappearing messages are prohibited in this chat." = "Los mensajes temporales no están permitidos en este chat.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Disappearing messages are prohibited in this group." = "Los mensajes temporales están prohibidos en este grupo.";
|
||||
"Disappearing messages are prohibited in this group." = "Los mensajes temporales no están permitidos en este grupo.";
|
||||
|
||||
/* server test step */
|
||||
"Disconnect" = "Desconectar";
|
||||
@@ -902,6 +923,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Don't show again" = "No mostrar de nuevo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Downgrade and open chat" = "Degradar y abrir Chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Duplicate display name!" = "¡Nombre mostrado duplicado!";
|
||||
|
||||
@@ -1092,7 +1116,7 @@
|
||||
"Error starting chat" = "Error iniciando chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error stopping chat" = "Error deteniendo el chat";
|
||||
"Error stopping chat" = "Error deteniendo Chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error switching profile!" = "¡Error cambiando perfil!";
|
||||
@@ -1109,6 +1133,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Error updating user privacy" = "Error actualizando la privacidad de usuario";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error: " = "Error: ";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error: %@" = "Error: %@";
|
||||
|
||||
@@ -1136,6 +1163,12 @@
|
||||
/* 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.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"File will be received when your contact is online, please wait or check later!" = "El archivo se recibirá cuando tu contacto esté en línea, por favor espera o compruébalo más tarde.";
|
||||
|
||||
@@ -1218,7 +1251,7 @@
|
||||
"Group moderation" = "Moderación de grupos";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Group preferences" = "Preferencias del grupo";
|
||||
"Group preferences" = "Preferencias de grupo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Group profile" = "Perfil de grupo";
|
||||
@@ -1259,6 +1292,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Hide profile" = "Ocultar perfil";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Hide:" = "Ocultar:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"How it works" = "Cómo funciona";
|
||||
|
||||
@@ -1269,7 +1305,7 @@
|
||||
"How to" = "Cómo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"How to use it" = "Cómo usar";
|
||||
"How to use it" = "Guia de uso";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"How to use your servers" = "Cómo usar tus servidores";
|
||||
@@ -1289,6 +1325,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Ignore" = "Ignorar";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Image will be received when your contact completes uploading it." = "La imagen se recibirá cuando tu contacto termine de subirla.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Image will be received when your contact is online, please wait or check later!" = "La imagen se recibirá cuando tu contacto esté en línea, por favor espera o compruébalo más tarde.";
|
||||
|
||||
@@ -1340,6 +1379,9 @@
|
||||
/* notification */
|
||||
"Incoming video call" = "Videollamada entrante";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Incompatible database version" = "Versión de base de datos incompatible";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Incorrect security code!" = "¡Código de seguridad incorrecto!";
|
||||
|
||||
@@ -1407,13 +1449,13 @@
|
||||
"iOS Keychain will be used to securely store passphrase after you restart the app or change passphrase - it will allow receiving push notifications." = "iOS Keychain se usará para almacenar la contraseña de forma segura después de reiniciar la aplicación o cambiar la contraseña. Esto permitirá recibir notificaciones automáticas.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Irreversible message deletion" = "Eliminación del mensaje irreversible";
|
||||
"Irreversible message deletion" = "Eliminación irreversible del mensaje";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Irreversible message deletion is prohibited in this chat." = "La eliminación irreversible de mensajes está prohibida en este chat.";
|
||||
"Irreversible message deletion is prohibited in this chat." = "La eliminación irreversible de mensajes no está permitida en este chat.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Irreversible message deletion is prohibited in this group." = "La eliminación irreversible de mensajes está prohibida en este grupo.";
|
||||
"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.";
|
||||
@@ -1509,7 +1551,7 @@
|
||||
"Mark verified" = "Marcar como verificado";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Markdown in messages" = "Marcadores en mensajes";
|
||||
"Markdown in messages" = "Sintaxis markdown en mensajes";
|
||||
|
||||
/* marked deleted chat item preview text */
|
||||
"marked deleted" = "marcado eliminado";
|
||||
@@ -1557,7 +1599,7 @@
|
||||
"Migration error:" = "Error de migración:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migration failed. Tap **Skip** below to continue using the current database. Please report the issue to the app developers via chat or email [chat@simplex.chat](mailto:chat@simplex.chat)." = "Error de migración. A continuación pulsa **Omitir** para seguir usando la base de datos actual. Informa del problema a los desarrolladores de la aplicación a través de SimpleX o por correo electrónico a [chat@simplex.chat](mailto:chat@simplex.chat).";
|
||||
"Migration failed. Tap **Skip** below to continue using the current database. Please report the issue to the app developers via chat or email [chat@simplex.chat](mailto:chat@simplex.chat)." = "Error de migración. A continuación pulsa **Omitir** para seguir usando la base de datos actual. Por favor, informa a los desarrolladores de la aplicación a través de SimpleX o por correo electrónico a [chat@simplex.chat](mailto:chat@simplex.chat).";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migration is completed" = "Migración completada";
|
||||
@@ -1708,7 +1750,7 @@
|
||||
"Only client devices store user profiles, contacts, groups, and messages sent with **2-layer end-to-end encryption**." = "Sólo los dispositivos cliente almacenan perfiles de usuario, contactos, grupos y mensajes enviados con **cifrado de extremo a extremo de 2 capas**.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Only group owners can change group preferences." = "Sólo los propietarios del grupo pueden cambiar las preferencias de grupo.";
|
||||
"Only group owners can change group preferences." = "Sólo los propietarios del grupo pueden modificar las preferencias de grupo.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Only group owners can enable voice messages." = "Sólo los propietarios del grupo pueden activar los mensajes de voz.";
|
||||
@@ -1750,7 +1792,7 @@
|
||||
"Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red." = "Abrir el enlace en el navegador puede reducir la privacidad y seguridad de la conexión. Los enlaces SimpleX que no son de confianza aparecerán en rojo.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"or chat with the developers" = "o habla con los desarrolladores";
|
||||
"or chat with the developers" = "o contacta mediante Chat con los desarrolladores";
|
||||
|
||||
/* member role */
|
||||
"owner" = "propietario";
|
||||
@@ -1842,6 +1884,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Profile image" = "Imagen del perfil";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Profile password" = "Contraseña del perfil";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Prohibit irreversible message deletion." = "Prohibir la eliminación irreversible de mensajes.";
|
||||
|
||||
@@ -1858,7 +1903,7 @@
|
||||
"Protect app screen" = "Proteger la pantalla de la aplicación";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Protect your chat profiles with a password!" = "¡Proteje los perfiles de Chat con contraseña!";
|
||||
"Protect your chat profiles with a password!" = "¡Protege tus perfiles Chat con contraseña!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Protocol timeout" = "Tiempo de espera del protocolo";
|
||||
@@ -2077,7 +2122,7 @@
|
||||
"Send notifications:" = "Enviar notificaciones:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Send questions and ideas" = "Envía preguntas e ideas";
|
||||
"Send questions and ideas" = "Consultas y sugerencias";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Send them from gallery or custom keyboards." = "Envíalos desde la galería o desde teclados personalizados.";
|
||||
@@ -2110,13 +2155,13 @@
|
||||
"Set 1 day" = "Establecer 1 día";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Set contact name…" = "Introduce el nombre del contacto…";
|
||||
"Set contact name…" = "Escribe el nombre del contacto…";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Set group preferences" = "Establecer preferencias de grupo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Set passphrase to export" = "Seleccióna contraseña para exportar";
|
||||
"Set passphrase to export" = "Escribe la contraseña para exportar";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Set the message shown to new members!" = "¡Establece el mensaje mostrado a los miembros nuevos!";
|
||||
@@ -2142,12 +2187,18 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Show calls in phone history" = "Mostrar llamadas en el historial del teléfono";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show developer options" = "Mostrar opciones de desarrollador";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show preview" = "Mostrar vista previa";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show QR code" = "Mostrar código QR";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show:" = "Mostrar:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html)." = "La seguridad de SimpleX Chat fue [auditada por Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).";
|
||||
|
||||
@@ -2200,10 +2251,10 @@
|
||||
"Stop" = "Detener";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Stop chat to enable database actions" = "Detener Chat para habilitar acciones sobre la base de datos";
|
||||
"Stop chat to enable database actions" = "Detén Chat para habilitar las acciones sobre la base de datos";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Stop chat to export, import or delete chat database. You will not be able to receive and send messages while the chat is stopped." = "Detener Chat para exportar, importar o eliminar la base de datos del chat. No podrá recibir ni enviar mensajes mientras el chat esté detenido.";
|
||||
"Stop chat to export, import or delete chat database. You will not be able to receive and send messages while the chat is stopped." = "Detén Chat para poder exportar, importar o eliminar la base de datos. No puedes recibir ni enviar mensajes mientras Chat esté detenido.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Stop chat?" = "¿Detener Chat?";
|
||||
@@ -2341,7 +2392,7 @@
|
||||
"This group no longer exists." = "Este grupo ya no existe.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"This setting applies to messages in your current chat profile **%@**." = "Esta configuración se aplica a los mensajes en su perfil actual de Chat **%@**.";
|
||||
"This setting applies to messages in your current chat profile **%@**." = "Esta configuración se aplica a los mensajes en su perfil actual **%@**.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"To ask any questions and to receive updates:" = "Para consultar cualquier duda y recibir actualizaciones:";
|
||||
@@ -2403,6 +2454,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide" = "Mostrar";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide chat profile" = "Mostrar perfil de chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide profile" = "Mostrar perfil";
|
||||
|
||||
/* connection info */
|
||||
"unknown" = "desconocido";
|
||||
|
||||
@@ -2454,6 +2511,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Updating this setting will re-connect the client to all servers." = "Al actualizar esta configuración el cliente se reconectará a todos los servidores.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Upgrade and open chat" = "Actualizar y abrir Chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use .onion hosts" = "Usar hosts .onion";
|
||||
|
||||
@@ -2484,6 +2544,9 @@
|
||||
/* 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";
|
||||
|
||||
@@ -2521,10 +2584,10 @@
|
||||
"Voice messages" = "Mensajes de voz";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Voice messages are prohibited in this chat." = "Los mensajes de voz están prohibidos en este chat.";
|
||||
"Voice messages are prohibited in this chat." = "Los mensajes de voz no están permitidos en este chat.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Voice messages are prohibited in this group." = "Los mensajes de voz están prohibidos en este grupo.";
|
||||
"Voice messages are prohibited in this group." = "Los mensajes de voz no están permitidos en este grupo.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Voice messages prohibited!" = "¡Mensajes de voz prohibidos!";
|
||||
@@ -2544,6 +2607,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"wants to connect to you!" = "¡quiere contactar contigo!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Warning: you may lose some data!" = "Atención: ¡puedes perder algunos datos!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"WebRTC ICE servers" = "Servidores WebRTC ICE";
|
||||
|
||||
@@ -2626,7 +2692,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 use markdown to format messages:" = "Puedes usar marcadores para dar formato a los mensajes:";
|
||||
"You can use markdown to format messages:" = "Puedes usar sintaxis markdown para dar formato a los mensajes:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You can't send messages!" = "¡No puedes enviar mensajes!";
|
||||
@@ -2668,7 +2734,7 @@
|
||||
"you left" = "has salido";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You must use the most recent version of your chat database on one device ONLY, otherwise you may stop receiving the messages from some contacts." = "Debes usar la versión más reciente de tu base de datos SÓLO en un dispositivo, de lo contrario podrías dejar de recibir mensajes de algunos contactos.";
|
||||
"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.";
|
||||
@@ -2722,19 +2788,19 @@
|
||||
"Your calls" = "Tus llamadas";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Your chat database" = "Base de datos";
|
||||
"Your chat database" = "Base de datos Chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Your chat database is not encrypted - set passphrase to encrypt it." = "La base de datos no está cifrada - establece una contraseña para cifrarla.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Your chat profile will be sent to group members" = "Tu perfil de chat se enviará a los miembros del grupo";
|
||||
"Your chat profile will be sent to group members" = "Tu perfil Chat será enviado a los miembros del grupo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Your chat profile will be sent to your contact" = "Tu perfil de chat se enviará a tu contacto";
|
||||
"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 de chat";
|
||||
"Your chat profiles" = "Tus perfiles Chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Your chats" = "Tus chats";
|
||||
|
||||
@@ -413,9 +413,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Can't invite contacts!" = "Impossible d'inviter les contacts !";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* chat item action */
|
||||
"Cancel" = "Annuler";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Cancel file transfer?" = "Annuler le transfert de fichiers ?";
|
||||
|
||||
/* feature offered item */
|
||||
"cancelled %@" = "annulé %@";
|
||||
|
||||
@@ -527,6 +530,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm" = "Confirmer";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm database upgrades" = "Confirmer la mise à niveau de la base de données";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm new passphrase…" = "Confirmer la nouvelle phrase secrète…";
|
||||
|
||||
@@ -692,6 +698,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Dark" = "Sombre";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database downgrade" = "Rétrogradation de la base de données";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database encrypted!" = "Base de données chiffrée !";
|
||||
|
||||
@@ -707,6 +716,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Database ID" = "ID de base de données";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database IDs and Transport isolation option." = "IDs de base de données et option d'isolation du transport.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database is encrypted using a random passphrase, you can change it." = "La base de données est chiffrée à l'aide d'une phrase secrète aléatoire, que vous pouvez modifier.";
|
||||
|
||||
@@ -725,6 +737,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Database passphrase is required to open chat." = "La phrase secrète de la base de données est nécessaire pour ouvrir le chat.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database upgrade" = "Mise à niveau de la base de données";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database will be encrypted and the passphrase stored in the keychain.\n" = "La base de données sera chiffrée et la phrase secrète sera stockée dans la keychain.\n";
|
||||
|
||||
@@ -761,6 +776,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat archive?" = "Supprimer l'archive du chat ?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat profile" = "Supprimer le profil de chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat profile?" = "Supprimer le profil du chat ?";
|
||||
|
||||
@@ -830,6 +848,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Delete pending connection?" = "Supprimer la connexion en attente ?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete profile" = "Supprimer le profil";
|
||||
|
||||
/* server test step */
|
||||
"Delete queue" = "Supprimer la file d'attente";
|
||||
|
||||
@@ -902,6 +923,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Don't show again" = "Ne plus afficher";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Downgrade and open chat" = "Rétrograder et ouvrir le chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Duplicate display name!" = "Nom d'affichage en double !";
|
||||
|
||||
@@ -984,7 +1008,7 @@
|
||||
"Enter passphrase…" = "Entrez la phrase secrète…";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Enter password above to show!" = "Entrez le mot de passe ci-dessus pour continuer !";
|
||||
"Enter password above to show!" = "Entrez ci-dessus le mot de passe pour afficher le profil !";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Enter server manually" = "Entrer un serveur manuellement";
|
||||
@@ -1109,6 +1133,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Error updating user privacy" = "Erreur de mise à jour de la confidentialité de l'utilisateur";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error: " = "Erreur : ";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error: %@" = "Erreur : %@";
|
||||
|
||||
@@ -1136,6 +1163,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"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.";
|
||||
|
||||
/* 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.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"File will be received when your contact is online, please wait or check later!" = "Le fichier sera reçu quand votre contact sera en ligne, merci d'attendre ou de revenir plus tard !";
|
||||
|
||||
@@ -1259,6 +1292,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Hide profile" = "Masquer le profil";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Hide:" = "Cacher :";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"How it works" = "Comment ça fonctionne";
|
||||
|
||||
@@ -1289,6 +1325,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Ignore" = "Ignorer";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Image will be received when your contact completes uploading it." = "L'image sera reçue lorsque votre contact aura terminé de la mettre en ligne.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Image will be received when your contact is online, please wait or check later!" = "L'image sera reçue quand votre contact sera en ligne, merci d'attendre ou de revenir plus tard !";
|
||||
|
||||
@@ -1340,6 +1379,9 @@
|
||||
/* notification */
|
||||
"Incoming video call" = "Appel vidéo entrant";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Incompatible database version" = "Version de la base de données incompatible";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Incorrect security code!" = "Code de sécurité incorrect !";
|
||||
|
||||
@@ -1488,7 +1530,7 @@
|
||||
"Make a private connection" = "Établir une connexion privée";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Make profile private!" = "Rendre le profil privé !";
|
||||
"Make profile private!" = "Rendre un profil privé !";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Make sure SMP server addresses are in correct format, line separated and are not duplicated (%@)." = "Assurez-vous que les adresses des serveurs SMP sont au bon format et ne sont pas dupliquées, un par ligne.";
|
||||
@@ -1756,7 +1798,7 @@
|
||||
"owner" = "propriétaire";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Password to show" = "Mot de passe à afficher";
|
||||
"Password to show" = "Mot de passe à entrer";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Paste" = "Coller";
|
||||
@@ -1842,6 +1884,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Profile image" = "Image de profil";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Profile password" = "Mot de passe de profil";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Prohibit irreversible message deletion." = "Interdire la suppression irréversible des messages.";
|
||||
|
||||
@@ -2142,12 +2187,18 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Show calls in phone history" = "Afficher les appels dans l'historique du téléphone";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show developer options" = "Afficher les options pour les développeurs";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show preview" = "Montrer l'aperçu";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show QR code" = "Afficher le code QR";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show:" = "Afficher :";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html)." = "La sécurité de SimpleX Chat a été [auditée par Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).";
|
||||
|
||||
@@ -2365,7 +2416,7 @@
|
||||
"To record voice message please grant permission to use Microphone." = "Pour enregistrer un message vocal, veuillez accorder la permission d'utiliser le microphone.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"To reveal your hidden profile, enter a full password into a search field in **Your chat profiles** page." = "Pour révéler votre profil caché, entrez un mot de passe complet dans le champ de recherche de la page **Vos profils de chat**.";
|
||||
"To reveal your hidden profile, enter a full password into a search field in **Your chat profiles** page." = "Pour révéler votre profil caché, entrez le mot de passe dans le champ de recherche de la page **Vos profils de chat**.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"To support instant push notifications the chat database has to be migrated." = "Pour prendre en charge les notifications push instantanées, la base de données du chat doit être migrée.";
|
||||
@@ -2403,6 +2454,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide" = "Dévoiler";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide chat profile" = "Dévoiler le profil de chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide profile" = "Dévoiler le profil";
|
||||
|
||||
/* connection info */
|
||||
"unknown" = "inconnu";
|
||||
|
||||
@@ -2454,6 +2511,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Updating this setting will re-connect the client to all servers." = "La mise à jour de ce paramètre reconnectera le client à tous les serveurs.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Upgrade and open chat" = "Mettre à niveau et ouvrir le chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use .onion hosts" = "Utiliser les hôtes .onions";
|
||||
|
||||
@@ -2484,6 +2544,9 @@
|
||||
/* 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";
|
||||
|
||||
@@ -2544,6 +2607,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"wants to connect to you!" = "veut établir une connexion !";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Warning: you may lose some data!" = "Attention : vous risquez de perdre des données !";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"WebRTC ICE servers" = "Serveurs WebRTC ICE";
|
||||
|
||||
|
||||
@@ -413,9 +413,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Can't invite contacts!" = "Impossibile invitare i contatti!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* chat item action */
|
||||
"Cancel" = "Annulla";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Cancel file transfer?" = "Annullare il trasferimento di file?";
|
||||
|
||||
/* feature offered item */
|
||||
"cancelled %@" = "annullato %@";
|
||||
|
||||
@@ -527,6 +530,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm" = "Conferma";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm database upgrades" = "Conferma aggiornamenti database";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm new passphrase…" = "Conferma password nuova…";
|
||||
|
||||
@@ -692,6 +698,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Dark" = "Scuro";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database downgrade" = "Downgrade del database";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database encrypted!" = "Database crittografato!";
|
||||
|
||||
@@ -707,6 +716,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Database ID" = "ID database";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database IDs and Transport isolation option." = "ID del database e opzione isolamento del trasporto.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database is encrypted using a random passphrase, you can change it." = "Il database è crittografato con una password casuale, puoi cambiarla.";
|
||||
|
||||
@@ -725,6 +737,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Database passphrase is required to open chat." = "La password del database è necessaria per aprire la chat.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database upgrade" = "Aggiornamento del database";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database will be encrypted and the passphrase stored in the keychain.\n" = "Il database verrà crittografato e la password conservata nel portachiavi.\n";
|
||||
|
||||
@@ -761,6 +776,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat archive?" = "Eliminare l'archivio della chat?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat profile" = "Elimina il profilo di chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat profile?" = "Eliminare il profilo di chat?";
|
||||
|
||||
@@ -830,6 +848,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Delete pending connection?" = "Eliminare la connessione in attesa?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete profile" = "Elimina profilo";
|
||||
|
||||
/* server test step */
|
||||
"Delete queue" = "Elimina coda";
|
||||
|
||||
@@ -902,6 +923,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Don't show again" = "Non mostrare più";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Downgrade and open chat" = "Esegui downgrade e apri chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Duplicate display name!" = "Nome da mostrare doppio!";
|
||||
|
||||
@@ -1109,6 +1133,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Error updating user privacy" = "Errore nell'aggiornamento della privacy dell'utente";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error: " = "Errore: ";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error: %@" = "Errore: %@";
|
||||
|
||||
@@ -1136,6 +1163,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"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.";
|
||||
|
||||
/* 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.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"File will be received when your contact is online, please wait or check later!" = "Il file verrà ricevuto quando il tuo contatto sarà in linea, attendi o controlla più tardi!";
|
||||
|
||||
@@ -1259,6 +1292,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Hide profile" = "Nascondi il profilo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Hide:" = "Nascondi:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"How it works" = "Come funziona";
|
||||
|
||||
@@ -1289,6 +1325,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Ignore" = "Ignora";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Image will be received when your contact completes uploading it." = "L'immagine verrà ricevuta quando il tuo contatto completerà l'invio.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Image will be received when your contact is online, please wait or check later!" = "L'immagine verrà ricevuta quando il tuo contatto sarà in linea, aspetta o controlla più tardi!";
|
||||
|
||||
@@ -1340,6 +1379,9 @@
|
||||
/* notification */
|
||||
"Incoming video call" = "Videochiamata in arrivo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Incompatible database version" = "Versione del database incompatibile";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Incorrect security code!" = "Codice di sicurezza sbagliato!";
|
||||
|
||||
@@ -1842,6 +1884,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Profile image" = "Immagine del profilo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Profile password" = "Password del profilo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Prohibit irreversible message deletion." = "Proibisci l'eliminazione irreversibile dei messaggi.";
|
||||
|
||||
@@ -2142,12 +2187,18 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Show calls in phone history" = "Mostra le chiamate nella cronologia del telefono";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show developer options" = "Mostra opzioni sviluppatore";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show preview" = "Mostra anteprima";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show QR code" = "Mostra codice QR";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show:" = "Mostra:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html)." = "La sicurezza di SimpleX Chat è stata [verificata da Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).";
|
||||
|
||||
@@ -2403,6 +2454,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide" = "Svela";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide chat profile" = "Svela il profilo chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide profile" = "Svela profilo";
|
||||
|
||||
/* connection info */
|
||||
"unknown" = "sconosciuto";
|
||||
|
||||
@@ -2454,6 +2511,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Updating this setting will re-connect the client to all servers." = "L'aggiornamento di questa impostazione riconnetterà il client a tutti i server.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Upgrade and open chat" = "Aggiorna e apri chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use .onion hosts" = "Usa gli host .onion";
|
||||
|
||||
@@ -2484,6 +2544,9 @@
|
||||
/* 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";
|
||||
|
||||
@@ -2544,6 +2607,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"wants to connect to you!" = "vuole connettersi con te!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Warning: you may lose some data!" = "Attenzione: potresti perdere alcuni dati!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"WebRTC ICE servers" = "Server WebRTC ICE";
|
||||
|
||||
|
||||
@@ -413,9 +413,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Can't invite contacts!" = "Kan geen contacten uitnodigen!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* chat item action */
|
||||
"Cancel" = "Annuleren";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Cancel file transfer?" = "Bestand overdracht annuleren?";
|
||||
|
||||
/* feature offered item */
|
||||
"cancelled %@" = "geannuleerd %@";
|
||||
|
||||
@@ -527,6 +530,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm" = "Bevestigen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm database upgrades" = "Bevestig database upgrades";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm new passphrase…" = "Bevestig nieuw wachtwoord…";
|
||||
|
||||
@@ -692,6 +698,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Dark" = "Donker";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database downgrade" = "Database downgraden";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database encrypted!" = "Database versleuteld!";
|
||||
|
||||
@@ -707,6 +716,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Database ID" = "Database ID";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database IDs and Transport isolation option." = "Database ID's en Transport isolatie optie.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database is encrypted using a random passphrase, you can change it." = "De database is versleuteld met een willekeurig wachtwoord, u kunt deze wijzigen.";
|
||||
|
||||
@@ -725,6 +737,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Database passphrase is required to open chat." = "Database wachtwoord is vereist om je gesprekken te openen.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database upgrade" = "Database upgrade";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database will be encrypted and the passphrase stored in the keychain.\n" = "De database wordt versleuteld en het wachtwoord wordt opgeslagen in de keychain.\n";
|
||||
|
||||
@@ -761,6 +776,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat archive?" = "Chat archief verwijderen?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat profile" = "Chat profiel verwijderen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat profile?" = "Chat profiel verwijderen?";
|
||||
|
||||
@@ -830,6 +848,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Delete pending connection?" = "Wachtende verbinding verwijderen?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete profile" = "Verwijder profiel";
|
||||
|
||||
/* server test step */
|
||||
"Delete queue" = "Wachtrij verwijderen";
|
||||
|
||||
@@ -902,6 +923,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Don't show again" = "Niet meer weergeven";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Downgrade and open chat" = "Downgraden en chat openen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Duplicate display name!" = "Dubbele weergavenaam!";
|
||||
|
||||
@@ -1109,6 +1133,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Error updating user privacy" = "Fout bij updaten van gebruikers privacy";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error: " = "Fout: ";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error: %@" = "Fout: %@";
|
||||
|
||||
@@ -1136,6 +1163,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"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.";
|
||||
|
||||
/* 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.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"File will be received when your contact is online, please wait or check later!" = "Het bestand wordt ontvangen wanneer uw contact persoon online is, even geduld a.u.b. of controleer later!";
|
||||
|
||||
@@ -1259,6 +1292,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Hide profile" = "Profiel verbergen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Hide:" = "Verbergen:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"How it works" = "Hoe het werkt";
|
||||
|
||||
@@ -1289,6 +1325,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Ignore" = "Negeren";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Image will be received when your contact completes uploading it." = "De afbeelding wordt ontvangen wanneer uw contactpersoon het uploaden heeft voltooid.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Image will be received when your contact is online, please wait or check later!" = "De afbeelding wordt ontvangen wanneer uw contact online is, even geduld a.u.b. of kijk later!";
|
||||
|
||||
@@ -1340,6 +1379,9 @@
|
||||
/* notification */
|
||||
"Incoming video call" = "Inkomend video gesprek";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Incompatible database version" = "Incompatibele database versie";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Incorrect security code!" = "Onjuiste beveiligingscode!";
|
||||
|
||||
@@ -1780,7 +1822,7 @@
|
||||
"Periodically" = "Periodiek";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"PING count" = "PING telling";
|
||||
"PING count" = "PING count";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"PING interval" = "PING interval";
|
||||
@@ -1842,6 +1884,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Profile image" = "profielfoto";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Profile password" = "Profiel wachtwoord";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Prohibit irreversible message deletion." = "Verbied het onomkeerbaar verwijderen van berichten.";
|
||||
|
||||
@@ -2142,12 +2187,18 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Show calls in phone history" = "Toon oproepen in de telefoongeschiedenis";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show developer options" = "Ontwikkelaars opties tonen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show preview" = "Toon voorbeeld";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show QR code" = "Toon QR-code";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show:" = "Toon:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html)." = "De beveiliging van SimpleX Chat is [gecontroleerd door Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).";
|
||||
|
||||
@@ -2403,6 +2454,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide" = "zichtbaar maken";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide chat profile" = "Chat profiel zichtbaar maken";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide profile" = "Profiel zichtbaar maken";
|
||||
|
||||
/* connection info */
|
||||
"unknown" = "onbekend";
|
||||
|
||||
@@ -2454,6 +2511,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Updating this setting will re-connect the client to all servers." = "Als u deze instelling bijwerkt, wordt de client opnieuw verbonden met alle servers.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Upgrade and open chat" = "Upgrade en open chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use .onion hosts" = "Gebruik .onion-hosts";
|
||||
|
||||
@@ -2484,6 +2544,9 @@
|
||||
/* 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";
|
||||
|
||||
@@ -2544,6 +2607,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"wants to connect to you!" = "wil met je in contact komen!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Warning: you may lose some data!" = "Waarschuwing: u kunt sommige gegevens verliezen!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"WebRTC ICE servers" = "WebRTC ICE servers";
|
||||
|
||||
|
||||
@@ -47,10 +47,10 @@
|
||||
"[Star on GitHub](https://github.com/simplex-chat/simplex-chat)" = "[Поставить звездочку в GitHub](https://github.com/simplex-chat/simplex-chat)";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"**Add new contact**: to create your one-time QR Code for your contact." = "**Добавить новый контакт**: чтобы создать одноразовый QR код или ссылку для вашего контакта.";
|
||||
"**Add new contact**: to create your one-time QR Code for your contact." = "**Добавить новый контакт**: чтобы создать одноразовый QR код или ссылку для Вашего контакта.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"**Create link / QR code** for your contact to use." = "**Создать ссылку / QR код** для вашего контакта.";
|
||||
"**Create link / QR code** for your contact to use." = "**Создать ссылку / QR код** для Вашего контакта.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"**e2e encrypted** audio call" = "**e2e зашифрованный** аудиозвонок";
|
||||
@@ -62,19 +62,19 @@
|
||||
"**More private**: check new messages every 20 minutes. Device token is shared with SimpleX Chat server, but not how many contacts or messages you have." = "**Более конфиденциально**: проверять новые сообщения каждые 20 минут. Токен устройства будет отправлен на сервер уведомлений SimpleX Chat, но у сервера не будет информации о количестве контактов и сообщений.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app)." = "**Самый конфиденциальный**: не использовать сервер уведомлений SimpleX Chat, проверять сообщения периодически в фоновом режиме (зависит от того насколько часто вы используете приложение).";
|
||||
"**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app)." = "**Самый конфиденциальный**: не использовать сервер уведомлений SimpleX Chat, проверять сообщения периодически в фоновом режиме (зависит от того насколько часто Вы используете приложение).";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"**Paste received link** or open it in the browser and tap **Open in mobile app**." = "**Вставить полученную ссылку**, или откройте её в браузере и нажмите **Open in mobile app**.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"**Please note**: you will NOT be able to recover or change passphrase if you lose it." = "**Внимание**: вы не сможете восстановить или поменять пароль, если вы его потеряете.";
|
||||
"**Please note**: you will NOT be able to recover or change passphrase if you lose it." = "**Внимание**: Вы не сможете восстановить или поменять пароль, если Вы его потеряете.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"**Recommended**: device token and notifications are sent to SimpleX Chat notification server, but not the message content, size or who it is from." = "**Рекомендовано**: токен устройства и уведомления отправляются на сервер SimpleX Chat, но сервер не получает сами сообщения, их размер или от кого они.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"**Scan QR code**: to connect to your contact in person or via video call." = "**Сканировать QR код**: соединиться с вашим контактом при встрече или во время видеозвонка.";
|
||||
"**Scan QR code**: to connect to your contact in person or via video call." = "**Сканировать QR код**: соединиться с Вашим контактом при встрече или во время видеозвонка.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"**Warning**: Instant push notifications require passphrase saved in Keychain." = "**Внимание**: для работы мгновенных уведомлений пароль должен быть сохранен в Keychain.";
|
||||
@@ -191,16 +191,16 @@
|
||||
"A new contact" = "Новый контакт";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"A random profile will be sent to the contact that you received this link from" = "Контакту, от которого вы получили эту ссылку, будет отправлен случайный профиль";
|
||||
"A random profile will be sent to the contact that you received this link from" = "Контакту, от которого Вы получили эту ссылку, будет отправлен случайный профиль";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"A random profile will be sent to your contact" = "Вашему контакту будет отправлен случайный профиль";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"A separate TCP connection will be used **for each chat profile you have in the app**." = "Отдельное TCP-соединение будет использоваться **для каждого профиля чата, который вы имеете в приложении**.";
|
||||
"A separate TCP connection will be used **for each chat profile you have in the app**." = "Отдельное TCP-соединение будет использоваться **для каждого профиля чата, который Вы имеете в приложении**.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"A separate TCP connection will be used **for each contact and group member**.\n**Please note**: if you have many connections, your battery and traffic consumption can be substantially higher and some connections may fail." = "Отдельное TCP-соединение (и авторизация SOCKS) будет использоваться **для каждого контакта и члена группы**.\n**Обратите внимание**: если у вас много контактов, потребление батареи и трафика может быть значительно выше, и некоторые соединения могут не работать.";
|
||||
"A separate TCP connection will be used **for each contact and group member**.\n**Please note**: if you have many connections, your battery and traffic consumption can be substantially higher and some connections may fail." = "Отдельное TCP-соединение (и авторизация SOCKS) будет использоваться **для каждого контакта и члена группы**.\n**Обратите внимание**: если у Вас много контактов, потребление батареи и трафика может быть значительно выше, и некоторые соединения могут не работать.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"About SimpleX" = "О SimpleX";
|
||||
@@ -267,7 +267,7 @@
|
||||
"All group members will remain connected." = "Все члены группы, которые соединились через эту ссылку, останутся в группе.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you." = "Все сообщения будут удалены - это действие нельзя отменить! Сообщения будут удалены только для вас.";
|
||||
"All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you." = "Все сообщения будут удалены - это действие нельзя отменить! Сообщения будут удалены только для Вас.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"All your contacts will remain connected" = "Все контакты, которые соединились через этот адрес, сохранятся.";
|
||||
@@ -276,10 +276,10 @@
|
||||
"Allow" = "Разрешить";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Allow disappearing messages only if your contact allows it to you." = "Разрешить исчезающие сообщения, только если ваш контакт разрешает их вам.";
|
||||
"Allow disappearing messages only if your contact allows it to you." = "Разрешить исчезающие сообщения, только если Ваш контакт разрешает их Вам.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Allow irreversible message deletion only if your contact allows it to you." = "Разрешить необратимое удаление сообщений, только если ваш контакт разрешает это вам.";
|
||||
"Allow irreversible message deletion only if your contact allows it to you." = "Разрешить необратимое удаление сообщений, только если Ваш контакт разрешает это Вам.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Allow sending direct messages to members." = "Разрешить посылать прямые сообщения членам группы.";
|
||||
@@ -294,19 +294,19 @@
|
||||
"Allow to send voice messages." = "Разрешить отправлять голосовые сообщения.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Allow voice messages only if your contact allows them." = "Разрешить голосовые сообщения, только если их разрешает ваш контакт.";
|
||||
"Allow voice messages only if your contact allows them." = "Разрешить голосовые сообщения, только если их разрешает Ваш контакт.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Allow voice messages?" = "Разрешить голосовые сообщения?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Allow your contacts to irreversibly delete sent messages." = "Разрешить вашим контактам необратимо удалять отправленные сообщения.";
|
||||
"Allow your contacts to irreversibly delete sent messages." = "Разрешить Вашим контактам необратимо удалять отправленные сообщения.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Allow your contacts to send disappearing messages." = "Разрешить вашим контактам отправлять исчезающие сообщения.";
|
||||
"Allow your contacts to send disappearing messages." = "Разрешить Вашим контактам отправлять исчезающие сообщения.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Allow your contacts to send voice messages." = "Разрешить вашим контактам отправлять голосовые сообщения.";
|
||||
"Allow your contacts to send voice messages." = "Разрешить Вашим контактам отправлять голосовые сообщения.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Already connected?" = "Соединение уже установлено?";
|
||||
@@ -351,7 +351,7 @@
|
||||
"Authentication failed" = "Ошибка аутентификации";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Authentication is required before the call is connected, but you may miss calls." = "Аутентификация требуется до того, как звонок соединится, но вы можете пропустить звонки.";
|
||||
"Authentication is required before the call is connected, but you may miss calls." = "Аутентификация требуется до того, как звонок соединится, но Вы можете пропустить звонки.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Authentication unavailable" = "Аутентификация недоступна";
|
||||
@@ -378,13 +378,13 @@
|
||||
"bold" = "жирный";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Both you and your contact can irreversibly delete sent messages." = "Вы и ваш контакт можете необратимо удалять отправленные сообщения.";
|
||||
"Both you and your contact can irreversibly delete sent messages." = "Вы и Ваш контакт можете необратимо удалять отправленные сообщения.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Both you and your contact can send disappearing messages." = "Вы и ваш контакт можете отправлять исчезающие сообщения.";
|
||||
"Both you and your contact can send disappearing messages." = "Вы и Ваш контакт можете отправлять исчезающие сообщения.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Both you and your contact can send voice messages." = "Вы и ваш контакт можете отправлять голосовые сообщения.";
|
||||
"Both you and your contact can send voice messages." = "Вы и Ваш контакт можете отправлять голосовые сообщения.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." = "По профилю чата или [по соединению](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (БЕТА).";
|
||||
@@ -413,9 +413,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Can't invite contacts!" = "Нельзя пригласить контакты!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* chat item action */
|
||||
"Cancel" = "Отменить";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Cancel file transfer?" = "Прекратить передачу файла?";
|
||||
|
||||
/* feature offered item */
|
||||
"cancelled %@" = "отменил(a) %@";
|
||||
|
||||
@@ -444,13 +447,13 @@
|
||||
"Change role" = "Поменять роль";
|
||||
|
||||
/* chat item text */
|
||||
"changed address for you" = "поменял(а) адрес для вас";
|
||||
"changed address for you" = "поменял(а) адрес для Вас";
|
||||
|
||||
/* rcv group event chat item */
|
||||
"changed role of %@ to %@" = "поменял(а) роль члена %1$@ на: %2$@";
|
||||
|
||||
/* rcv group event chat item */
|
||||
"changed your role to %@" = "поменял(а) вашу роль на: %@";
|
||||
"changed your role to %@" = "поменял(а) Вашу роль на: %@";
|
||||
|
||||
/* chat item text */
|
||||
"changing address for %@..." = "смена адреса для %@...";
|
||||
@@ -516,7 +519,7 @@
|
||||
"Colors" = "Цвета";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Compare security codes with your contacts." = "Сравните код безопасности с вашими контактами.";
|
||||
"Compare security codes with your contacts." = "Сравните код безопасности с Вашими контактами.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"complete" = "соединение завершено";
|
||||
@@ -527,6 +530,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm" = "Подтвердить";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm database upgrades" = "Подтвердить обновление базы данных";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm new passphrase…" = "Подтвердите новый пароль…";
|
||||
|
||||
@@ -642,7 +648,7 @@
|
||||
"Contact requests" = "Запросы контактов";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Contacts can mark messages for deletion; you will be able to view them." = "Контакты могут помечать сообщения для удаления; вы сможете просмотреть их.";
|
||||
"Contacts can mark messages for deletion; you will be able to view them." = "Контакты могут помечать сообщения для удаления; Вы сможете просмотреть их.";
|
||||
|
||||
/* chat item action */
|
||||
"Copy" = "Скопировать";
|
||||
@@ -692,6 +698,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Dark" = "Тёмная";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database downgrade" = "Откат базы данных";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database encrypted!" = "База данных зашифрована!";
|
||||
|
||||
@@ -708,7 +717,10 @@
|
||||
"Database ID" = "ID базы данных";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database is encrypted using a random passphrase, you can change it." = "База данных зашифрована случайным паролем, вы можете его поменять.";
|
||||
"Database IDs and Transport isolation option." = "ID базы данных и опция Отдельные транспортные сессии.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database is encrypted using a random passphrase, you can change it." = "База данных зашифрована случайным паролем, Вы можете его поменять.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database is encrypted using a random passphrase. Please change it before exporting." = "База данных зашифрована случайным паролем. Пожалуйста, поменяйте его перед экспортом.";
|
||||
@@ -725,6 +737,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Database passphrase is required to open chat." = "Введите пароль базы данных чтобы открыть чат.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database upgrade" = "Обновление базы данных";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"database version is newer than the app, but no down migration for: %@" = "версия базы данных новее чем приложения, но нет миграции для отката: %@";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database will be encrypted and the passphrase stored in the keychain.\n" = "База данных будет зашифрована и пароль сохранен в Keychain.\n";
|
||||
|
||||
@@ -761,6 +779,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat archive?" = "Удалить архив чата?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat profile" = "Удалить профиль чата";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat profile?" = "Удалить профиль?";
|
||||
|
||||
@@ -830,6 +851,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Delete pending connection?" = "Удалить ожидаемое соединение?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete profile" = "Удалить профиль";
|
||||
|
||||
/* server test step */
|
||||
"Delete queue" = "Удаление очереди";
|
||||
|
||||
@@ -860,6 +884,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Device authentication is not enabled. You can turn on SimpleX Lock via Settings, once you enable device authentication." = "Аутентификация устройства не включена. Вы можете включить блокировку SimpleX в Настройках после включения аутентификации.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"different migration in the app/database: %@ / %@" = "разная миграция в приложении/базе данных: %@ / %@";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Different names, avatars and transport isolation." = "Разные имена, аватары и транспортные сессии.";
|
||||
|
||||
@@ -902,6 +929,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Don't show again" = "Не показывать";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Downgrade and open chat" = "Откатить версию и открыть чат";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Duplicate display name!" = "Имя профиля уже используется!";
|
||||
|
||||
@@ -945,7 +975,7 @@
|
||||
"enabled for contact" = "включено для контакта";
|
||||
|
||||
/* enabled status */
|
||||
"enabled for you" = "включено для вас";
|
||||
"enabled for you" = "включено для Вас";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Encrypt" = "Зашифровать";
|
||||
@@ -962,6 +992,9 @@
|
||||
/* notification */
|
||||
"Encrypted message: database error" = "Зашифрованное сообщение: ошибка базы данных";
|
||||
|
||||
/* notification */
|
||||
"Encrypted message: database migration error" = "Зашифрованное сообщение: ошибка миграции базы";
|
||||
|
||||
/* notification */
|
||||
"Encrypted message: keychain error" = "Зашифрованное сообщение: ошибка Keychain";
|
||||
|
||||
@@ -1109,6 +1142,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Error updating user privacy" = "Ошибка при обновлении конфиденциальности";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error: " = "Ошибка: ";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error: %@" = "Ошибка: %@";
|
||||
|
||||
@@ -1121,6 +1157,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Exit without saving" = "Выйти без сохранения";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Experimental" = "Экспериментальные";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Export database" = "Экспорт архива чата";
|
||||
|
||||
@@ -1137,7 +1176,13 @@
|
||||
"Failed to remove passphrase" = "Ошибка удаления пароля";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"File will be received when your contact is online, please wait or check later!" = "Файл будет принят, когда ваш контакт будет в сети, подождите или проверьте позже!";
|
||||
"File transfer will be cancelled. If it's in progress it will be stoppped." = "Передача файла будет прекращена. Если она в процессе, она будет остановлена.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"File will be received when your contact completes uploading it." = "Файл будет принят когда Ваш контакт загрузит его.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"File will be received when your contact is online, please wait or check later!" = "Файл будет принят, когда Ваш контакт будет в сети, подождите или проверьте позже!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"File: %@" = "Файл: %@";
|
||||
@@ -1236,7 +1281,7 @@
|
||||
"Group will be deleted for all members - this cannot be undone!" = "Группа будет удалена для всех членов - это действие нельзя отменить!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Group will be deleted for you - this cannot be undone!" = "Группа будет удалена для вас - это действие нельзя отменить!";
|
||||
"Group will be deleted for you - this cannot be undone!" = "Группа будет удалена для Вас - это действие нельзя отменить!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Help" = "Помощь";
|
||||
@@ -1259,6 +1304,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Hide profile" = "Скрыть профиль";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Hide:" = "Скрыть:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"How it works" = "Как это работает";
|
||||
|
||||
@@ -1278,19 +1326,22 @@
|
||||
"ICE servers (one per line)" = "ICE серверы (один на строке)";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"If you can't meet in person, **show QR code in the video call**, or share the link." = "Если вы не можете встретиться лично, вы можете **показать QR код во время видеозвонка**, или поделиться ссылкой.";
|
||||
"If you can't meet in person, **show QR code in the video call**, or share the link." = "Если Вы не можете встретиться лично, Вы можете **показать QR код во время видеозвонка**, или поделиться ссылкой.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link." = "Если вы не можете встретиться лично, вы можете **сосканировать QR код во время видеозвонка**, или ваш контакт может отправить вам ссылку.";
|
||||
"If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link." = "Если Вы не можете встретиться лично, Вы можете **сосканировать QR код во время видеозвонка**, или Ваш контакт может отправить Вам ссылку.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"If you need to use the chat now tap **Do it later** below (you will be offered to migrate the database when you restart the app)." = "Если сейчас вам нужно использовать чат, нажмите **Отложить** внизу (вы сможете мигрировать данные чата при следующем запуске приложения).";
|
||||
"If you need to use the chat now tap **Do it later** below (you will be offered to migrate the database when you restart the app)." = "Если сейчас Вам нужно использовать чат, нажмите **Отложить** внизу (Вы сможете мигрировать данные чата при следующем запуске приложения).";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Ignore" = "Не отвечать";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Image will be received when your contact is online, please wait or check later!" = "Изображение будет принято, когда ваш контакт будет в сети, подождите или проверьте позже!";
|
||||
"Image will be received when your contact completes uploading it." = "Изображение будет принято, когда Ваш контакт его загрузит.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Image will be received when your contact is online, please wait or check later!" = "Изображение будет принято, когда Ваш контакт будет в сети, подождите или проверьте позже!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Immune to spam and abuse" = "Защищен от спама";
|
||||
@@ -1317,10 +1368,10 @@
|
||||
"Incognito mode" = "Режим Инкогнито";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Incognito mode is not supported here - your main profile will be sent to group members" = "Режим Инкогнито здесь не поддерживается - ваш основной профиль будет отправлен членам группы";
|
||||
"Incognito mode is not supported here - your main profile will be sent to group members" = "Режим Инкогнито здесь не поддерживается - Ваш основной профиль будет отправлен членам группы";
|
||||
|
||||
/* 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." = "Режим Инкогнито защищает конфиденциальность имени и изображения вашего основного профиля — для каждого нового контакта создается новый случайный профиль.";
|
||||
"Incognito mode protects the privacy of your main profile name and image — for each new contact a new random profile is created." = "Режим Инкогнито защищает конфиденциальность имени и изображения Вашего основного профиля — для каждого нового контакта создается новый случайный профиль.";
|
||||
|
||||
/* chat list item description */
|
||||
"incognito via contact address link" = "инкогнито через ссылку-контакт";
|
||||
@@ -1340,6 +1391,9 @@
|
||||
/* notification */
|
||||
"Incoming video call" = "Входящий видеозвонок";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Incompatible database version" = "Несовместимая версия базы данных";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Incorrect security code!" = "Неправильный код безопасности!";
|
||||
|
||||
@@ -1398,7 +1452,7 @@
|
||||
"invited to connect" = "приглашение";
|
||||
|
||||
/* rcv group event chat item */
|
||||
"invited via your group link" = "приглашен(а) через вашу ссылку группы";
|
||||
"invited via your group link" = "приглашен(а) через Вашу ссылку группы";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"iOS Keychain is used to securely store passphrase - it allows receiving push notifications." = "iOS Keychain используется для безопасного хранения пароля - это позволяет получать мгновенные уведомления.";
|
||||
@@ -1419,10 +1473,10 @@
|
||||
"It allows having many anonymous connections without any shared data between them in a single chat profile." = "Это позволяет иметь много анонимных соединений без общих данных между ними в одном профиле пользователя.";
|
||||
|
||||
/* 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." = "Это может случится, когда:\n1. Сервер удалил сообщения, если они не были доставлены в течение 30 дней.\n2. Сервер, через который вы получаете сообщения от контакта, был обновлён и перезапущен.\n3. Соединение компроментировано.\nПожалуйста, соединитесь с девелоперами через Настройки, чтобы получать уведомления о серверах.\nМы планируем добавить избыточную доставку сообщений, чтобы не терять сообщения.";
|
||||
"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." = "Это может случится, когда:\n1. Сервер удалил сообщения, если они не были доставлены в течение 30 дней.\n2. Сервер, через который Вы получаете сообщения от контакта, был обновлён и перезапущен.\n3. Соединение компроментировано.\nПожалуйста, соединитесь с девелоперами через Настройки, чтобы получать уведомления о серверах.\nМы планируем добавить избыточную доставку сообщений, чтобы не терять сообщения.";
|
||||
|
||||
/* 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 (%@)." = "Возможно, вы уже соединились через эту ссылку. Если это не так, то это ошибка (%@).";
|
||||
"It seems like you are already connected via this link. If it is not the case, there was an error (%@)." = "Возможно, Вы уже соединились через эту ссылку. Если это не так, то это ошибка (%@).";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Italian interface" = "Итальянский интерфейс";
|
||||
@@ -1562,6 +1616,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Migration is completed" = "Перемещение данных завершено";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrations: %@" = "Миграции: %@";
|
||||
|
||||
/* call status */
|
||||
"missed call" = "пропущенный звонок";
|
||||
|
||||
@@ -1578,7 +1635,7 @@
|
||||
"More improvements are coming soon!" = "Дополнительные улучшения скоро!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Most likely this contact has deleted the connection with you." = "Скорее всего, этот контакт удалил соединение с вами.";
|
||||
"Most likely this contact has deleted the connection with you." = "Скорее всего, этот контакт удалил соединение с Вами.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Multiple chat profiles" = "Много профилей чата";
|
||||
@@ -1714,22 +1771,22 @@
|
||||
"Only group owners can enable voice messages." = "Только владельцы группы могут разрешить голосовые сообщения.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Only you can irreversibly delete messages (your contact can mark them for deletion)." = "Только вы можете необратимо удалять сообщения (ваш контакт может помечать их на удаление).";
|
||||
"Only you can irreversibly delete messages (your contact can mark them for deletion)." = "Только Вы можете необратимо удалять сообщения (Ваш контакт может помечать их на удаление).";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Only you can send disappearing messages." = "Только вы можете отправлять исчезающие сообщения.";
|
||||
"Only you can send disappearing messages." = "Только Вы можете отправлять исчезающие сообщения.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Only you can send voice messages." = "Только вы можете отправлять голосовые сообщения.";
|
||||
"Only you can send voice messages." = "Только Вы можете отправлять голосовые сообщения.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Only your contact can irreversibly delete messages (you can mark them for deletion)." = "Только ваш контакт может необратимо удалять сообщения (вы можете помечать их на удаление).";
|
||||
"Only your contact can irreversibly delete messages (you can mark them for deletion)." = "Только Ваш контакт может необратимо удалять сообщения (Вы можете помечать их на удаление).";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Only your contact can send disappearing messages." = "Только ваш контакт может отправлять исчезающие сообщения.";
|
||||
"Only your contact can send disappearing messages." = "Только Ваш контакт может отправлять исчезающие сообщения.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Only your contact can send voice messages." = "Только ваш контакт может отправлять голосовые сообщения.";
|
||||
"Only your contact can send voice messages." = "Только Ваш контакт может отправлять голосовые сообщения.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Open chat" = "Открыть чат";
|
||||
@@ -1768,13 +1825,13 @@
|
||||
"Paste received link" = "Вставить полученную ссылку";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Paste the link you received into the box below to connect with your contact." = "Чтобы соединиться, вставьте ссылку, полученную от вашего контакта.";
|
||||
"Paste the link you received into the box below to connect with your contact." = "Чтобы соединиться, вставьте ссылку, полученную от Вашего контакта.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"peer-to-peer" = "peer-to-peer";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"People can connect to you only via the links you share." = "С вами можно соединиться только через созданные вами ссылки.";
|
||||
"People can connect to you only via the links you share." = "С Вами можно соединиться только через созданные Вами ссылки.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Periodically" = "Периодически";
|
||||
@@ -1786,16 +1843,16 @@
|
||||
"PING interval" = "Интервал PING";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Please ask your contact to enable sending voice messages." = "Попросите у вашего контакта разрешить отправку голосовых сообщений.";
|
||||
"Please ask your contact to enable sending voice messages." = "Попросите у Вашего контакта разрешить отправку голосовых сообщений.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Please check that you used the correct link or ask your contact to send you another one." = "Пожалуйста, проверьте, что вы использовали правильную ссылку или попросите, чтобы ваш контакт отправил вам другую ссылку.";
|
||||
"Please check that you used the correct link or ask your contact to send you another one." = "Пожалуйста, проверьте, что Вы использовали правильную ссылку или попросите, чтобы Ваш контакт отправил Вам другую ссылку.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Please check your network connection with %@ and try again." = "Пожалуйста, проверьте ваше соединение с %@ и попробуйте еще раз.";
|
||||
"Please check your network connection with %@ and try again." = "Пожалуйста, проверьте Ваше соединение с %@ и попробуйте еще раз.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Please check yours and your contact preferences." = "Проверьте предпочтения вашего контакта.";
|
||||
"Please check yours and your contact preferences." = "Проверьте предпочтения Вашего контакта.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Please contact group admin." = "Пожалуйста, свяжитесь с админом группы.";
|
||||
@@ -1810,10 +1867,10 @@
|
||||
"Please restart the app and migrate the database to enable push notifications." = "Пожалуйста, перезапустите приложение и переместите данные чата, чтобы включить доставку уведомлений.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Please store passphrase securely, you will NOT be able to access chat if you lose it." = "Пожалуйста, надежно сохраните пароль, вы НЕ сможете открыть чат, если потеряете его.";
|
||||
"Please store passphrase securely, you will NOT be able to access chat if you lose it." = "Пожалуйста, надежно сохраните пароль, Вы НЕ сможете открыть чат, если потеряете его.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Please store passphrase securely, you will NOT be able to change it if you lose it." = "Пожалуйста, надежно сохраните пароль, вы НЕ сможете его поменять, если потеряете.";
|
||||
"Please store passphrase securely, you will NOT be able to change it if you lose it." = "Пожалуйста, надежно сохраните пароль, Вы НЕ сможете его поменять, если потеряете.";
|
||||
|
||||
/* server test error */
|
||||
"Possibly, certificate fingerprint in server address is incorrect" = "Возможно, хэш сертификата в адресе сервера неверный";
|
||||
@@ -1842,6 +1899,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Profile image" = "Аватар";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Profile password" = "Пароль профиля";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Prohibit irreversible message deletion." = "Запретить необратимое удаление сообщений.";
|
||||
|
||||
@@ -1858,7 +1918,7 @@
|
||||
"Protect app screen" = "Защитить экран приложения";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Protect your chat profiles with a password!" = "Защитите ваши профили чата паролем!";
|
||||
"Protect your chat profiles with a password!" = "Защитите Ваши профили чата паролем!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Protocol timeout" = "Таймаут протокола";
|
||||
@@ -1891,7 +1951,7 @@
|
||||
"Receiving via" = "Получение через";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Recipients see updates as you type them." = "Получатели видят их в то время как вы их набираете.";
|
||||
"Recipients see updates as you type them." = "Получатели видят их в то время как Вы их набираете.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Reduced battery usage" = "Уменьшенное потребление батареи";
|
||||
@@ -1909,10 +1969,10 @@
|
||||
"rejected call" = "отклонённый звонок";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Relay server is only used if necessary. Another party can observe your IP address." = "Relay сервер используется только при необходимости. Другая сторона может видеть ваш IP адрес.";
|
||||
"Relay server is only used if necessary. Another party can observe your IP address." = "Relay сервер используется только при необходимости. Другая сторона может видеть Ваш IP адрес.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Relay server protects your IP address, but it can observe the duration of the call." = "Relay сервер защищает ваш IP адрес, но может отслеживать продолжительность звонка.";
|
||||
"Relay server protects your IP address, but it can observe the duration of the call." = "Relay сервер защищает Ваш IP адрес, но может отслеживать продолжительность звонка.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Remove" = "Удалить";
|
||||
@@ -1933,7 +1993,7 @@
|
||||
"removed %@" = "удалил(а) %@";
|
||||
|
||||
/* rcv group event chat item */
|
||||
"removed you" = "удалил(а) вас из группы";
|
||||
"removed you" = "удалил(а) Вас из группы";
|
||||
|
||||
/* chat item action */
|
||||
"Reply" = "Ответить";
|
||||
@@ -2059,11 +2119,14 @@
|
||||
"Send" = "Отправить";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Send a live message - it will update for the recipient(s) as you type it" = "Отправить живое сообщение — оно будет обновляться для получателей по мере того, как вы его вводите";
|
||||
"Send a live message - it will update for the recipient(s) as you type it" = "Отправить живое сообщение — оно будет обновляться для получателей по мере того, как Вы его вводите";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Send direct message" = "Отправить сообщение";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Send videos and files via XFTP" = "Отправлять видео и файлы через XFTP";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Send link previews" = "Отправлять картинки ссылок";
|
||||
|
||||
@@ -2142,12 +2205,18 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Show calls in phone history" = "Показать звонки в истории телефона";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show developer options" = "Показать опции для девелоперов";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show preview" = "Показывать уведомления";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show QR code" = "Показать QR код";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show:" = "Показать:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html)." = "Безопасность SimpleX Chat была [проверена Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html).";
|
||||
|
||||
@@ -2275,7 +2344,7 @@
|
||||
"The 1st platform without any user identifiers – private by design." = "Первая в мире платформа без идентификаторов пользователей.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"The app can notify you when you receive messages or contact requests - please open settings to enable." = "Приложение может посылать вам уведомления о сообщениях и запросах на соединение - уведомления можно включить в Настройках.";
|
||||
"The app can notify you when you receive messages or contact requests - please open settings to enable." = "Приложение может посылать Вам уведомления о сообщениях и запросах на соединение - уведомления можно включить в Настройках.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"The attempt to change database passphrase was not completed." = "Попытка поменять пароль базы данных не была завершена.";
|
||||
@@ -2284,7 +2353,7 @@
|
||||
"The connection you accepted will be cancelled!" = "Подтвержденное соединение будет отменено!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"The contact you shared this link with will NOT be able to connect!" = "Контакт, которому вы отправили эту ссылку, не сможет соединиться!";
|
||||
"The contact you shared this link with will NOT be able to connect!" = "Контакт, которому Вы отправили эту ссылку, не сможет соединиться!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"The created archive is available via app Settings / Database / Old database archive." = "Созданный архив доступен через Настройки приложения.";
|
||||
@@ -2305,13 +2374,13 @@
|
||||
"The old database was not removed during the migration, it can be deleted." = "Предыдущая версия данных чата не удалена при перемещении, её можно удалить.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"The profile is only shared with your contacts." = "Профиль отправляется только вашим контактам.";
|
||||
"The profile is only shared with your contacts." = "Профиль отправляется только Вашим контактам.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"The sender will NOT be notified" = "Отправитель не будет уведомлён";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"The servers for new connections of your current chat profile **%@**." = "Серверы для новых соединений вашего текущего профиля чата **%@**.";
|
||||
"The servers for new connections of your current chat profile **%@**." = "Серверы для новых соединений Вашего текущего профиля чата **%@**.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Theme" = "Тема";
|
||||
@@ -2329,19 +2398,19 @@
|
||||
"This action cannot be undone - the messages sent and received earlier than selected will be deleted. It may take several minutes." = "Это действие нельзя отменить — все сообщения, отправленные или полученные раньше чем выбрано, будут удалены. Это может занять несколько минут.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "Это действие нельзя отменить — ваш профиль, контакты, сообщения и файлы будут безвозвратно утеряны.";
|
||||
"This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "Это действие нельзя отменить — Ваш профиль, контакты, сообщения и файлы будут безвозвратно утеряны.";
|
||||
|
||||
/* notification title */
|
||||
"this contact" = "этот контакт";
|
||||
|
||||
/* 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)." = "Это экспериментальная функция! Она будет работать, только если на другом клиенте установлена версия 4.2. После завершения смены адреса вы увидите сообщение — убедитесь, что вы все еще можете получать сообщения от этого контакта (или члена группы).";
|
||||
"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)." = "Это экспериментальная функция! Она будет работать, только если на другом клиенте установлена версия 4.2. После завершения смены адреса Вы увидите сообщение — убедитесь, что Вы все еще можете получать сообщения от этого контакта (или члена группы).";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"This group no longer exists." = "Эта группа больше не существует.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"This setting applies to messages in your current chat profile **%@**." = "Эта настройка применяется к сообщениям в вашем текущем профиле чата **%@**.";
|
||||
"This setting applies to messages in your current chat profile **%@**." = "Эта настройка применяется к сообщениям в Вашем текущем профиле чата **%@**.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"To ask any questions and to receive updates:" = "Чтобы задать вопросы и получать уведомления о новых версиях,";
|
||||
@@ -2353,13 +2422,13 @@
|
||||
"To make a new connection" = "Чтобы соединиться";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"To protect privacy, instead of user IDs used by all other platforms, SimpleX has identifiers for message queues, separate for each of your contacts." = "Чтобы защитить вашу конфиденциальность, вместо ID пользователей, которые есть в других платформах, SimpleX использует ID для очередей сообщений, разные для каждого контакта.";
|
||||
"To protect privacy, instead of user IDs used by all other platforms, SimpleX has identifiers for message queues, separate for each of your contacts." = "Чтобы защитить Вашу конфиденциальность, вместо ID пользователей, которые есть в других платформах, SimpleX использует ID для очередей сообщений, разные для каждого контакта.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"To protect timezone, image/voice files use UTC." = "Чтобы защитить ваш часовой пояс, файлы картинок и голосовых сообщений используют UTC.";
|
||||
"To protect timezone, image/voice files use UTC." = "Чтобы защитить Ваш часовой пояс, файлы картинок и голосовых сообщений используют 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." = "Чтобы защитить вашу информацию, включите блокировку SimpleX Chat.\nВам будет нужно пройти аутентификацию для включения блокировки.";
|
||||
"To protect your information, turn on SimpleX Lock.\nYou will be prompted to complete authentication before this feature is enabled." = "Чтобы защитить Вашу информацию, включите блокировку SimpleX Chat.\nВам будет нужно пройти аутентификацию для включения блокировки.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"To record voice message please grant permission to use Microphone." = "Для записи голосового сообщения, пожалуйста разрешите доступ к микрофону.";
|
||||
@@ -2371,16 +2440,16 @@
|
||||
"To support instant push notifications the chat database has to be migrated." = "Для поддержки мгновенный доставки уведомлений данные чата должны быть перемещены.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"To verify end-to-end encryption with your contact compare (or scan) the code on your devices." = "Чтобы подтвердить end-to-end шифрование с вашим контактом сравните (или сканируйте) код безопасности на ваших устройствах.";
|
||||
"To verify end-to-end encryption with your contact compare (or scan) the code on your devices." = "Чтобы подтвердить end-to-end шифрование с Вашим контактом сравните (или сканируйте) код безопасности на Ваших устройствах.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Transport isolation" = "Отдельные сессии для";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Trying to connect to the server used to receive messages from this contact (error: %@)." = "Устанавливается соединение с сервером, через который вы получаете сообщения от этого контакта (ошибка: %@).";
|
||||
"Trying to connect to the server used to receive messages from this contact (error: %@)." = "Устанавливается соединение с сервером, через который Вы получаете сообщения от этого контакта (ошибка: %@).";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Trying to connect to the server used to receive messages from this contact." = "Устанавливается соединение с сервером, через который вы получаете сообщения от этого контакта.";
|
||||
"Trying to connect to the server used to receive messages from this contact." = "Устанавливается соединение с сервером, через который Вы получаете сообщения от этого контакта.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Turn off" = "Выключить";
|
||||
@@ -2403,6 +2472,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide" = "Раскрыть";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide chat profile" = "Раскрыть профиль чата";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide profile" = "Раскрыть профиль";
|
||||
|
||||
/* connection info */
|
||||
"unknown" = "неизвестно";
|
||||
|
||||
@@ -2416,10 +2491,10 @@
|
||||
"Unknown error" = "Неизвестная ошибка";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." = "Если вы не используете интерфейс iOS, включите режим Не отвлекать, чтобы звонок не прерывался.";
|
||||
"Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." = "Если Вы не используете интерфейс iOS, включите режим Не отвлекать, чтобы звонок не прерывался.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unless your contact deleted the connection or this link was already used, it might be a bug - please report it.\nTo connect, please ask your contact to create another connection link and check that you have a stable network connection." = "Возможно, ваш контакт удалил ссылку, или она уже была использована. Если это не так, то это может быть ошибкой - пожалуйста, сообщите нам об этом.\nЧтобы установить соединение, попросите ваш контакт создать еще одну ссылку и проверьте ваше соединение с сетью.";
|
||||
"Unless your contact deleted the connection or this link was already used, it might be a bug - please report it.\nTo connect, please ask your contact to create another connection link and check that you have a stable network connection." = "Возможно, Ваш контакт удалил ссылку, или она уже была использована. Если это не так, то это может быть ошибкой - пожалуйста, сообщите нам об этом.\nЧтобы установить соединение, попросите Ваш контакт создать еще одну ссылку и проверьте Ваше соединение с сетью.";
|
||||
|
||||
/* authentication reason */
|
||||
"Unlock" = "Разблокировать";
|
||||
@@ -2454,6 +2529,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Updating this setting will re-connect the client to all servers." = "Обновление этих настроек приведет к сбросу и установке нового соединения со всеми серверами.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Upgrade and open chat" = "Обновить и открыть чат";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use .onion hosts" = "Использовать .onion хосты";
|
||||
|
||||
@@ -2484,6 +2562,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"v%@ (%@)" = "v%@ (%@)";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"v4.6.1+ is required to receive via XFTP." = "v4.6.1+ необходима для приема файлов через XFTP.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Verify connection security" = "Проверить безопасность соединения";
|
||||
|
||||
@@ -2542,7 +2623,10 @@
|
||||
"Waiting for image" = "Ожидается прием изображения";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"wants to connect to you!" = "хочет соединиться с вами!";
|
||||
"wants to connect to you!" = "хочет соединиться с Вами!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Warning: you may lose some data!" = "Предупреждение: Вы можете потерять какие то данные!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"WebRTC ICE servers" = "WebRTC ICE серверы";
|
||||
@@ -2560,7 +2644,7 @@
|
||||
"When available" = "Когда возможно";
|
||||
|
||||
/* 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." = "Когда вы соединены с контактом инкогнито, тот же самый инкогнито профиль будет использоваться для групп с этим контактом.";
|
||||
"When you share an incognito profile with somebody, this profile will be used for the groups they invite you to." = "Когда Вы соединены с контактом инкогнито, тот же самый инкогнито профиль будет использоваться для групп с этим контактом.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"With optional welcome message." = "С опциональным авто-ответом.";
|
||||
@@ -2584,16 +2668,16 @@
|
||||
"You allow" = "Вы разрешаете";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You already have a chat profile with the same display name. Please choose another name." = "У вас уже есть профиль с таким именем. Пожалуйста, выберите другое имя.";
|
||||
"You already have a chat profile with the same display name. Please choose another name." = "У Вас уже есть профиль с таким именем. Пожалуйста, выберите другое имя.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You are already connected to %@." = "Вы уже соединены с контактом %@.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You are connected to the server used to receive messages from this contact." = "Установлено соединение с сервером, через который вы получаете сообщения от этого контакта.";
|
||||
"You are connected to the server used to receive messages from this contact." = "Установлено соединение с сервером, через который Вы получаете сообщения от этого контакта.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"you are invited to group" = "вы приглашены в группу";
|
||||
"you are invited to group" = "Вы приглашены в группу";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You are invited to group" = "Вы приглашены в группу";
|
||||
@@ -2620,7 +2704,7 @@
|
||||
"You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it." = "Вы можете поделиться ссылкой или QR кодом - через них можно присоединиться к группе. Вы сможете удалить ссылку, сохранив членов группы, которые через нее соединились.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You can share your address as a link or as a QR code - anybody will be able to connect to you. You won't lose your contacts if you later delete it." = "Вы можете использовать ваш адрес как ссылку или как QR код - кто угодно сможет соединиться с вами. Вы сможете удалить адрес, сохранив контакты, которые через него соединились.";
|
||||
"You can share your address as a link or as a QR code - anybody will be able to connect to you. You won't lose your contacts if you later delete it." = "Вы можете использовать Ваш адрес как ссылку или как QR код - кто угодно сможет соединиться с Вами. Вы сможете удалить адрес, сохранив контакты, которые через него соединились.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You can start chat via app Settings / Database or by restarting the app" = "Вы можете запустить чат через Настройки приложения или перезапустив приложение.";
|
||||
@@ -2632,31 +2716,31 @@
|
||||
"You can't send messages!" = "Вы не можете отправлять сообщения!";
|
||||
|
||||
/* chat item text */
|
||||
"you changed address" = "вы поменяли адрес";
|
||||
"you changed address" = "Вы поменяли адрес";
|
||||
|
||||
/* chat item text */
|
||||
"you changed address for %@" = "вы поменяли адрес для %@";
|
||||
"you changed address for %@" = "Вы поменяли адрес для %@";
|
||||
|
||||
/* snd group event chat item */
|
||||
"you changed role for yourself to %@" = "вы поменяли роль себе на: %@";
|
||||
"you changed role for yourself to %@" = "Вы поменяли роль себе на: %@";
|
||||
|
||||
/* snd group event chat item */
|
||||
"you changed role of %@ to %@" = "вы поменяли роль члена %1$@ на: %2$@";
|
||||
"you changed role of %@ to %@" = "Вы поменяли роль члена %1$@ на: %2$@";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You control through which server(s) **to receive** the messages, your contacts – the servers you use to message them." = "Вы определяете через какие серверы вы **получаете сообщения**, ваши контакты - серверы, которые вы используете для отправки.";
|
||||
"You control through which server(s) **to receive** the messages, your contacts – the servers you use to message them." = "Вы определяете через какие серверы Вы **получаете сообщения**, Ваши контакты - серверы, которые Вы используете для отправки.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You could not be verified; please try again." = "Верификация не удалась; пожалуйста, попробуйте ещё раз.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You have no chats" = "У вас нет чатов";
|
||||
"You have no chats" = "У Вас нет чатов";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You have to enter passphrase every time the app starts - it is not stored on the device." = "Пароль не сохранен на устройстве — вы будете должны ввести его при каждом запуске чата.";
|
||||
"You have to enter passphrase every time the app starts - it is not stored on the device." = "Пароль не сохранен на устройстве — Вы будете должны ввести его при каждом запуске чата.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You invited your contact" = "Вы пригласили ваш контакт";
|
||||
"You invited your contact" = "Вы пригласили Ваш контакт";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You joined this group" = "Вы вступили в эту группу";
|
||||
@@ -2665,37 +2749,37 @@
|
||||
"You joined this group. Connecting to inviting group member." = "Вы вступили в эту группу. Устанавливается соединение с пригласившим членом группы.";
|
||||
|
||||
/* snd group event chat item */
|
||||
"you left" = "вы покинули группу";
|
||||
"you left" = "Вы покинули группу";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You must use the most recent version of your chat database on one device ONLY, otherwise you may stop receiving the messages from some contacts." = "Вы должны всегда использовать самую новую версию данных чата, ТОЛЬКО на одном устройстве, инача вы можете перестать получать сообщения от каких то контактов.";
|
||||
"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." = "Вы должны всегда использовать самую новую версию данных чата, ТОЛЬКО на одном устройстве, иначе Вы можете перестать получать сообщения от каких то контактов.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You need to allow your contact to send voice messages to be able to send them." = "Чтобы включить отправку голосовых сообщений, разрешите их вашему контакту.";
|
||||
"You need to allow your contact to send voice messages to be able to send them." = "Чтобы включить отправку голосовых сообщений, разрешите их Вашему контакту.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You rejected group invitation" = "Вы отклонили приглашение в группу";
|
||||
|
||||
/* snd group event chat item */
|
||||
"you removed %@" = "вы удалили %@";
|
||||
"you removed %@" = "Вы удалили %@";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You sent group invitation" = "Вы отправили приглашение в группу";
|
||||
|
||||
/* chat list item description */
|
||||
"you shared one-time link" = "вы создали ссылку";
|
||||
"you shared one-time link" = "Вы создали ссылку";
|
||||
|
||||
/* chat list item description */
|
||||
"you shared one-time link incognito" = "вы создали ссылку инкогнито";
|
||||
"you shared one-time link incognito" = "Вы создали ссылку инкогнито";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You will be connected to group when the group host's device is online, please wait or check later!" = "Соединение с группой будет установлено, когда хост группы будет онлайн. Пожалуйста, подождите или проверьте позже!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You will be connected when your connection request is accepted, please wait or check later!" = "Соединение будет установлено, когда ваш запрос будет принят. Пожалуйста, подождите или проверьте позже!";
|
||||
"You will be connected when your connection request is accepted, please wait or check later!" = "Соединение будет установлено, когда Ваш запрос будет принят. Пожалуйста, подождите или проверьте позже!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You will be connected when your contact's device is online, please wait or check later!" = "Соединение будет установлено, когда ваш контакт будет онлайн. Пожалуйста, подождите или проверьте позже!";
|
||||
"You will be connected when your contact's device is online, please wait or check later!" = "Соединение будет установлено, когда Ваш контакт будет онлайн. Пожалуйста, подождите или проверьте позже!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You will be required to authenticate when you start or resume the app after 30 seconds in background." = "Вы будете аутентифицированы при запуске и возобновлении приложения, которое было 30 секунд в фоновом режиме.";
|
||||
@@ -2710,13 +2794,13 @@
|
||||
"You will stop receiving messages from this group. Chat history will be preserved." = "Вы перестанете получать сообщения от этой группы. История чата будет сохранена.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"you: " = "вы: ";
|
||||
"you: " = "Вы: ";
|
||||
|
||||
/* 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" = "Вы пытаетесь пригласить инкогнито контакт в группу, где вы используете свой основной профиль";
|
||||
"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" = "Вы пытаетесь пригласить инкогнито контакт в группу, где Вы используете свой основной профиль";
|
||||
|
||||
/* 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" = "Вы используете инкогнито профиль для этой группы - чтобы предотвратить раскрытие вашего основного профиля, приглашать контакты не разрешено";
|
||||
"You're using an incognito profile for this group - to prevent sharing your main profile inviting contacts is not allowed" = "Вы используете инкогнито профиль для этой группы - чтобы предотвратить раскрытие Вашего основного профиля, приглашать контакты не разрешено";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Your calls" = "Ваши звонки";
|
||||
@@ -2725,13 +2809,13 @@
|
||||
"Your chat database" = "База данных";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Your chat database is not encrypted - set passphrase to encrypt it." = "База данных НЕ зашифрована. Установите пароль, чтобы защитить ваши данные.";
|
||||
"Your chat database is not encrypted - set passphrase to encrypt it." = "База данных НЕ зашифрована. Установите пароль, чтобы защитить Ваши данные.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Your chat profile will be sent to group members" = "Ваш профиль чата будет отправлен членам группы";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Your chat profile will be sent to your contact" = "Ваш профиль будет отправлен вашему контакту";
|
||||
"Your chat profile will be sent to your contact" = "Ваш профиль будет отправлен Вашему контакту";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Your chat profiles" = "Ваши профили чата";
|
||||
@@ -2755,7 +2839,7 @@
|
||||
"Your contacts can allow full message deletion." = "Ваши контакты могут разрешить окончательное удаление сообщений.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Your current chat database will be DELETED and REPLACED with the imported one." = "Текущие данные вашего чата будет УДАЛЕНЫ и ЗАМЕНЕНЫ импортированными.";
|
||||
"Your current chat database will be DELETED and REPLACED with the imported one." = "Текущие данные Вашего чата будет УДАЛЕНЫ и ЗАМЕНЕНЫ импортированными.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Your current profile" = "Ваш активный профиль";
|
||||
@@ -2770,13 +2854,13 @@
|
||||
"Your privacy" = "Конфиденциальность";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Your profile is stored on your device and shared only with your contacts.\nSimpleX servers cannot see your profile." = "Ваш профиль хранится на вашем устройстве и отправляется только вашим контактам.\nSimpleX серверы не могут получить доступ к вашему профилю.";
|
||||
"Your profile is stored on your device and shared only with your contacts.\nSimpleX servers cannot see your profile." = "Ваш профиль хранится на Вашем устройстве и отправляется только Вашим контактам.\nSimpleX серверы не могут получить доступ к Вашему профилю.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Your profile will be sent to the contact that you received this link from" = "Ваш профиль будет отправлен вашему контакту.";
|
||||
"Your profile will be sent to the contact that you received this link from" = "Ваш профиль будет отправлен Вашему контакту.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Your profile, contacts and delivered messages are stored on your device." = "Ваш профиль, контакты и доставленные сообщения хранятся на вашем устройстве.";
|
||||
"Your profile, contacts and delivered messages are stored on your device." = "Ваш профиль, контакты и доставленные сообщения хранятся на Вашем устройстве.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Your random profile" = "Случайный профиль";
|
||||
@@ -2785,7 +2869,7 @@
|
||||
"Your server" = "Ваш сервер";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Your server address" = "Адрес вашего сервер";
|
||||
"Your server address" = "Адрес Вашего сервера";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Your settings" = "Настройки";
|
||||
|
||||
@@ -413,9 +413,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Can't invite contacts!" = "无法邀请联系人!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* chat item action */
|
||||
"Cancel" = "取消";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Cancel file transfer?" = "取消文件传输?";
|
||||
|
||||
/* feature offered item */
|
||||
"cancelled %@" = "已取消 %@";
|
||||
|
||||
@@ -527,6 +530,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm" = "确认";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm database upgrades" = "确认数据库升级";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm new passphrase…" = "确认新密码……";
|
||||
|
||||
@@ -692,6 +698,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Dark" = "深色";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database downgrade" = "数据库降级";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database encrypted!" = "数据库已加密!";
|
||||
|
||||
@@ -707,6 +716,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Database ID" = "数据库 ID";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database IDs and Transport isolation option." = "数据库 ID 和传输隔离选项。";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database is encrypted using a random passphrase, you can change it." = "数据库使用随机密码进行加密,您可以更改它。";
|
||||
|
||||
@@ -725,6 +737,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Database passphrase is required to open chat." = "打开聊天需要数据库密码。";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database upgrade" = "数据库升级";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Database will be encrypted and the passphrase stored in the keychain.\n" = "数据库将被加密,密码保存在钥匙串中。\n";
|
||||
|
||||
@@ -761,6 +776,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat archive?" = "删除聊天档案?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat profile" = "删除聊天资料";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete chat profile?" = "删除聊天资料?";
|
||||
|
||||
@@ -830,6 +848,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Delete pending connection?" = "删除待定连接?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete profile" = "删除个人资料";
|
||||
|
||||
/* server test step */
|
||||
"Delete queue" = "删除队列";
|
||||
|
||||
@@ -902,6 +923,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Don't show again" = "不再显示";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Downgrade and open chat" = "降级并打开聊天";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Duplicate display name!" = "重复的显示名!";
|
||||
|
||||
@@ -1136,6 +1160,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Failed to remove passphrase" = "移除密码失败";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"File transfer will be cancelled. If it's in progress it will be stoppped." = "文件传输将被取消。文件传输将被终止如果它正在进行中。";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"File will be received when your contact completes uploading it." = "文件将在您的联系人完成上传后收到。";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"File will be received when your contact is online, please wait or check later!" = "文件将在您的联系人在线时收到,请稍等或稍后再查看!";
|
||||
|
||||
@@ -1259,6 +1289,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Hide profile" = "隐藏个人资料";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Hide:" = "隐藏:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"How it works" = "工作原理";
|
||||
|
||||
@@ -1289,6 +1322,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Ignore" = "忽视";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Image will be received when your contact completes uploading it." = "图片将在您的联系人完成上传后收到。";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Image will be received when your contact is online, please wait or check later!" = "图片将在您的联系人在线时收到,请稍等或稍后查看!";
|
||||
|
||||
@@ -1340,6 +1376,9 @@
|
||||
/* notification */
|
||||
"Incoming video call" = "视频通话来电";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Incompatible database version" = "数据库版本不兼容";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Incorrect security code!" = "安全码不正确!";
|
||||
|
||||
@@ -1842,6 +1881,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Profile image" = "资料图片";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Profile password" = "个人资料密码";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Prohibit irreversible message deletion." = "禁止不可撤回消息删除。";
|
||||
|
||||
@@ -2142,12 +2184,18 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Show calls in phone history" = "在电话历史记录中显示通话";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show developer options" = "显示开发者选项";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show preview" = "显示预览";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show QR code" = "显示二维码";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show:" = "显示:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"SimpleX Chat security was [audited by Trail of Bits](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html)." = "SimpleX Chat 的安全性 [由 Trail of Bits 审核](https://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html)。";
|
||||
|
||||
@@ -2403,6 +2451,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide" = "取消隐藏";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide chat profile" = "取消隐藏聊天资料";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unhide profile" = "取消隐藏个人资料";
|
||||
|
||||
/* connection info */
|
||||
"unknown" = "未知";
|
||||
|
||||
@@ -2454,6 +2508,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Updating this setting will re-connect the client to all servers." = "更新此设置将重新连接客户端到所有服务器。";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Upgrade and open chat" = "升级并打开聊天";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use .onion hosts" = "使用 .onion 主机";
|
||||
|
||||
@@ -2484,6 +2541,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"v%@ (%@)" = "v%@ (%@)";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"v4.6.1+ is required to receive via XFTP." = "通过 XFTP 接收需要 v4.6.1 以上版本。";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Verify connection security" = "验证连接安全";
|
||||
|
||||
@@ -2544,6 +2604,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"wants to connect to you!" = "想要与您连接!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Warning: you may lose some data!" = "警告:您可能会丢失部分数据!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"WebRTC ICE servers" = "WebRTC ICE 服务器";
|
||||
|
||||
|
||||
+2
-2
@@ -7,7 +7,7 @@ constraints: zip +disable-bzip2 +disable-zstd
|
||||
source-repository-package
|
||||
type: git
|
||||
location: https://github.com/simplex-chat/simplexmq.git
|
||||
tag: 0f23b4ab5c4c8bf5b937344c865fb195040f3c33
|
||||
tag: 215d2414b7a76e3d501017b24fb6b301bf022546
|
||||
|
||||
source-repository-package
|
||||
type: git
|
||||
@@ -17,7 +17,7 @@ source-repository-package
|
||||
source-repository-package
|
||||
type: git
|
||||
location: https://github.com/kazu-yamamoto/http2.git
|
||||
tag: 78e18f52295a7f89e828539a03fbcb24931461a3
|
||||
tag: b5a1b7200cf5bc7044af34ba325284271f6dff25
|
||||
|
||||
source-repository-package
|
||||
type: git
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
| Updated 07.02.2023 | Languages: EN, [CZ](/docs/lang/cs/ANDROID.md) |
|
||||
| 07.02.2023 | EN, [CZ](/docs/lang/cs/ANDROID.md), [FR](/docs/lang/fr/ANDROID.md) |
|
||||
|
||||
# Accessing files in Android app
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
| Updated 07.02.2023 | Languages: EN, [CZ](/docs/lang/cs/TRANSLATIONS.md) |
|
||||
| 19.03.2023 | EN, [CZ](/docs/lang/cs/TRANSLATIONS.md), [FR](/docs/lang/fr/TRANSLATIONS.md) |
|
||||
|
||||
# Contributing translations to SimpleX Chat
|
||||
|
||||
|
||||
+11
-16
@@ -67,29 +67,24 @@ SimpleX Chat stores all user data only on client devices using a portable encryp
|
||||
To export your SimpleX Chat data:
|
||||
|
||||
- [Open the app settings](./app-settings.md#opening-the-app-settings).
|
||||
- Tap on your user profile image in the upper right-hand of the screen.
|
||||
- If you have more than one profile, tap it again or choose Settings
|
||||
- Select "Database passphrase & export".
|
||||
- Stop chat by toggling "Chat is running".
|
||||
- Click on "Stop” on the prompt window.
|
||||
- Confirm it with fingerprint or PIN.
|
||||
- If you didn't set it before, set a passphrase on "Database passphrase". Initially, the database is encrypted with a random passphrase that is stored in KeyChain (iOS) or with KeyStore (Android).
|
||||
- Tap on "Export database" - it won't allow exporting unless you choose a passphrase.
|
||||
- Save the file on your device or share it via any available option, e.g. via AirDrop on iOS.
|
||||
- Stop chat by toggling "Chat is running" (tap "Stop” in the confirmation dialog).
|
||||
- Confirm it with fingerprint or PIN, in case you have [SimpleX Lock](./app-settings.md#simplex-lock) enabled.
|
||||
- If you didn't set it before, [set a passphrase](./managing-data.md#database-passphrase) in "Database passphrase". Initially, the database is encrypted with a random passphrase that is stored in KeyChain (iOS) or with KeyStore (Android).
|
||||
- Tap on "Export database" - it won't allow exporting unless you have set a passphrase.
|
||||
- Save the file on your device or share it via any available option.
|
||||
|
||||
To import your SimpleX Chat data in the app on another device:
|
||||
|
||||
- Transfer the database file to this device.
|
||||
- Download SimpleX and install it on your new device.
|
||||
- Create chat profile by following the steps in [Create your first chat profile](#create-yout-first-chat-profile).
|
||||
- Tap on your user profile image in the upper right-hand corner of the screen to open Settings.
|
||||
- Transfer the database file to the new device.
|
||||
- Install SimpleX Chat app.
|
||||
- Create chat profile with any name by following the steps in [Create your first chat profile](#create-yout-first-chat-profile) – you will replace it soon.
|
||||
- Open the app settings
|
||||
- Select "Database passphrase & export".
|
||||
- Disable chat by tapping the switch on "Chat is running".
|
||||
- Click on "Stop” on the prompt window.
|
||||
- Confirm it with fingerprint or PIN.
|
||||
- Stop chat by tapping the switch on "Chat is running".
|
||||
- Tap "Import database".
|
||||
- Select the .zip file of the exported chat data.
|
||||
- Tap "Import” on the pop-up prompt.
|
||||
- Tap "Import” in the confirmation dialog.
|
||||
- Start chat via toggle or close and start the app – you will be prompted to enter the passphrase for your chat database.
|
||||
|
||||
**Please note**:
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
| 07.02.2023 | FR, [EN](/docs/ANDROID.md), [CZ](/docs/lang/cs/ANDROID.md) |
|
||||
|
||||
# Accès aux fichiers dans l'application Android
|
||||
|
||||
SimpleX utilise des bases de données et stocke ses préférences dans le répertoire de données privées d'Android. Ce répertoire contient
|
||||
- des bases de données
|
||||
- les fichiers envoyés et reçus
|
||||
- les fichiers temporaires qui seront supprimés lorsqu'ils ne sont pas nécessaires
|
||||
- les préférences de l'utilisateur.
|
||||
|
||||
|
||||
Si vous voulez voir ce qui est stocké dans le répertoire de données de SimpleX, vous devez avoir :
|
||||
- Un système d'exploitation Unix (ou [MinGW](https://www.mingw-w64.org/downloads/) sous Windows)
|
||||
- l'outil ADB (Android Debug Bridge) installé sur un ordinateur ([téléchargez-le ici](https://developer.android.com/studio/releases/platform-tools) et installez-le)
|
||||
- votre appareil connecté via USB ou Wi-Fi à l'ordinateur.
|
||||
|
||||
## La procédure :
|
||||
- Ouvrez SimpleX, allez dans `Phrase secrète et exportation de la base de données`, activez `Sauvegarde des données de l'app`. Cela permettra aux autres étapes de fonctionner
|
||||
- optionnel_ : si vous voulez voir le contenu de la base de données, changez la phrase secrète de la base de données aléatoire pour la vôtre. Pour ce faire, arrêtez le chat dans le menu "Phrase secrète et exportation de la base de données", ouvrez "Phrase secrète de la base de données", entrez la nouvelle phrase secrète et confirmez-la, puis mettez-la à jour. Ne l'oubliez pas, sinon vous perdrez toutes vos données au cas où la phrase d'authentification vous serait redemandée plus tard.
|
||||
- ouvrez un émulateur de terminal (Windows CMD/Powershell ne fonctionnera pas) et changez de répertoire pour celui que vous voulez utiliser pour stocker la sauvegarde :
|
||||
|
||||
```bash
|
||||
cd /tmp # juste un exemple
|
||||
```
|
||||
Exécutez ensuite la méthode suivante :
|
||||
```bash
|
||||
adb -d backup -f chat.ab -noapk chat.simplex.app &&
|
||||
tail -n +5 chat.ab > chat.dat &&
|
||||
printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" | cat - chat.dat > chat.gz &&
|
||||
tar -xvzf chat.gz
|
||||
```
|
||||
|
||||
Déverrouillez maintenant l'appareil et confirmez une opération de sauvegarde sans utiliser de mot de passe pour le chiffrement, sinon les commandes ne fonctionneront pas.
|
||||
|
||||
Ensuite, la sauvegarde doit être terminée. Si vous voyez une erreur disant `tar : Error is not recoverable : exiting now` mais qu'avant cela vous avez enregistré quelques noms de fichiers, ne vous inquiétez pas, tout va bien.
|
||||
|
||||
Maintenant les fichiers sauvegardés seront dans `./apps/chat.simplex.app/`.
|
||||
|
||||
Veuillez noter que si vous utilisez une version récente de SimpleX, les bases de données seront chiffrées, et vous ne pourrez pas en voir le contenu sans utiliser l'application `sqlcipher` et sans connaître la phrase secrète de déchiffrement (vous devez d'abord la changer pour la vôtre à partir de celle qui est générée aléatoirement dans l'application).
|
||||
|
||||
Veuillez suivre le guide [SQL.md](/SQL.md) pour plus d'informations sur la manière de déchiffrer vos bases de données et d'y effectuer des requêtes.
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
| Updated 07.02.2023 | Languages: [EN](/docs/CLI.md), FR |
|
||||
| 31.01.2023 | FR, [EN](/docs/CLI.md), [CZ](/docs/lang/cs/CLI.md) |
|
||||
|
||||
# Application de terminal (console) SimpleX Chat pour Linux/MacOS/Windows
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
| Updated 31.01.2023 | Languages: [EN](/docs/CONTRIBUTING.md), FR |
|
||||
| 31.01.2023 | FR, [EN](/docs/CONTRIBUTING.md), [CZ](/docs/lang/cs/CONTRIBUTING.md) |
|
||||
|
||||
# Guide pour contribuer
|
||||
|
||||
|
||||
+125
-101
@@ -1,15 +1,29 @@
|
||||
| Updated 07.02.2023 | Languages: [EN](/README.md), FR |
|
||||
|
||||
<img src="/images/simplex-chat-logo.svg" alt="SimpleX logo" width="100%">
|
||||
|
||||
# SimpleX - la première plateforme de messagerie qui n'a pas le moindre identifiant d'utilisateur - 100% privé par définition !
|
||||
|
||||
[](https://github.com/simplex-chat/simplex-chat/actions/workflows/build.yml)
|
||||
[](https://github.com/simplex-chat/simplex-chat/releases)
|
||||
[](https://github.com/simplex-chat/simplex-chat/releases)
|
||||
[](https://www.reddit.com/r/SimpleXChat)
|
||||
[](https://mastodon.social/@simplex)
|
||||
|
||||
| 30/03/2023 | FR, [EN](/README.md), [CZ](/docs/lang/cs/README.md) |
|
||||
|
||||
<img src="images/simplex-chat-logo.svg" alt="SimpleX logo" width="100%">
|
||||
|
||||
# SimpleX - la première plateforme de messagerie qui n'a pas le moindre identifiant d'utilisateur - 100% privé par définition !
|
||||
|
||||
[<img src="./images/trail-of-bits.jpg" height="100">](http://simplex.chat/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html) [<img src="./images/privacy-guides.jpg" height="80">](https://www.privacyguides.org/en/real-time-communication/#simplex-chat) [<img src="./images/kuketz-blog.jpg" height="80">](https://www.kuketz-blog.de/simplex-eindruecke-vom-messenger-ohne-identifier/)
|
||||
|
||||
## Bienvenue sur SimpleX Chat !
|
||||
|
||||
1. 📲 [Installer l'app](#installer-lapp).
|
||||
2. ↔️ [Se connecter aux développeurs](#se-connecter-aux-développeurs-via-lapp) et [rejoindre des groupes d'utilisateurs](#rejoindre-des-groupes-dutilisateurs).
|
||||
3. 🤝 [Établir une connexion privée](#établir-une-connexion-privée) avec un(e) ami(e).
|
||||
4. 🔤 [Aider à traduire SimpleX Chat](#aider-à-traduire-simplex-chat).
|
||||
5. ⚡️ [Contribuer](#contribute) et [nous aider avec des dons](#aidez-nous-en-faisant-des-dons).
|
||||
|
||||
[En savoir plus sur SimpleX Chat](#contents).
|
||||
|
||||
## Installer l'app
|
||||
|
||||
[<img src="https://github.com/simplex-chat/.github/blob/master/profile/images/apple_store.svg" alt="iOS app" height="42">](https://apps.apple.com/us/app/simplex-chat/id1605771084)
|
||||
|
||||
[](https://play.google.com/store/apps/details?id=chat.simplex.app)
|
||||
@@ -20,13 +34,95 @@
|
||||
|
||||
[<img src="https://github.com/simplex-chat/.github/blob/master/profile/images/apk_icon.png" alt="APK" height="41">](https://github.com/simplex-chat/simplex-chat/releases/latest/download/simplex.apk)
|
||||
|
||||
- 🖲 Protège vos messages et vos métadonnées - avec qui vous parlez et quand.
|
||||
- 🖲 Protégez vos messages et vos métadonnées - avec qui vous parlez et quand.
|
||||
- 🔐 Chiffrement de bout en bout à double ratchet, avec couche de chiffrement supplémentaire.
|
||||
- 📱 Apps mobiles pour Android ([Google Play](https://play.google.com/store/apps/details?id=chat.simplex.app), [APK](https://github.com/simplex-chat/simplex-chat/releases/latest/download/simplex.apk)) et [iOS](https://apps.apple.com/us/app/simplex-chat/id1605771084).
|
||||
- 🚀 [Bêta TestFlight pour iOS](https://testflight.apple.com/join/DWuT2LQu) avec les nouvelles fonctionnalités 1 à 2 semaines plus tôt - **limitée à 10 000 utilisateurs** !
|
||||
- 🖥 Disponible en tant que terminal (console) / CLI sur Linux, MacOS, Windows.
|
||||
- 🖥 Disponible en tant que [terminal (console) / CLI](#⚡-installation-rapide-dune-application-pour-terminal) sur Linux, MacOS, Windows.
|
||||
|
||||
**NOUVEAU** : Audit de sécurité par [Trail of Bits](https://www.trailofbits.com/about), le [nouveau site](https://simplex.chat) et la v4.2 est disponible ! [Voir l'annonce](/blog/20221108-simplex-chat-v4.2-security-audit-new-website.md)
|
||||
## Se connecter aux développeurs via l'app
|
||||
|
||||
- pour poser des questions
|
||||
- suggérer des améliorations
|
||||
- partager toute information pertinente
|
||||
|
||||
## Rejoindre des groupes d'utilisateurs
|
||||
|
||||
Vous pouvez rejoindre un groupe anglophone pour poser des questions : [#SimpleX-Group-2](https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2Fhpq7_4gGJiilmz5Rf-CswuU5kZGkm_zOIooSw6yALRg%3D%40smp5.simplex.im%2FQP8zaGjjmlXV-ix_Er4JgJ0lNPYGS1KX%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEApAgBkRZ3x12ayZ7sHrjHQWNMvqzZpWUgM_fFCUdLXwo%253D%26srv%3Djjbyvoemxysm7qxap7m5d5m35jzv5qq6gnlv7s4rsn7tdwwmuqciwpid.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22xWpPXEZZsQp_F7vwAcAYDw%3D%3D%22%7D)
|
||||
|
||||
Il existe des groupes dans d'autres langues, dans lesquelles l'interface de l'application a été traduite. Ces groupes servent à tester et à poser des questions aux autres utilisateurs de SimpleX Chat :
|
||||
|
||||
[\#SimpleX-DE](https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FkIEl7OQzcp-J6aDmjdlQbRJwqkcZE7XR%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAR16PCu02MobRmKAsjzhDWMZcWP9hS8l5AUZi-Gs8z18%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22puYPMCQt11yPUvgmI5jCiw%3D%3D%22%7D) (Germanophone),[\#SimpleX-FR](https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2Fhpq7_4gGJiilmz5Rf-CswuU5kZGkm_zOIooSw6yALRg%3D%40smp5.simplex.im%2FvIHQDxTor53nwnWWTy5cHNwQQAdWN5Hw%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAPdgK1eBnETmgiqEQufbUkydKBJafoRx4iRrtrC2NAGc%253D%26srv%3Djjbyvoemxysm7qxap7m5d5m35jzv5qq6gnlv7s4rsn7tdwwmuqciwpid.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%221FyUryBPza-1ZFFE80Ekbg%3D%3D%22%7D) (Francophone),[\#SimpleX-RU](https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FXZyt3hJmWsycpN7Dqve_wbrAqb6myk1R%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAMFVIoytozTEa_QXOgoZFq_oe0IwZBYKvW50trSFXzXo%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22xz05ngjA3pNIxLZ32a8Vxg%3D%3D%22%7D) (Russophone),[\#SimpleX-IT](https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2F0weR-ZgDUl7ruOtI_8TZwEsnJP6UiImA%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAq4PSThO9Fvb5ydF48wB0yNbpzCbuQJCW3vZ9BGUfcxk%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22e-iceLA0SctC62eARgYDWg%3D%3D%22%7D) (Italophone).
|
||||
|
||||
Vous pouvez rejoindre ces groupes soit en ouvrant ces liens dans l'application, soit en les ouvrant dans un navigateur de bureau et en scannant le code QR.
|
||||
|
||||
## Établir une connexion privée
|
||||
|
||||
Vous devez partager un lien avec votre ami ou scanner un code QR depuis son téléphone, en personne ou lors d'un appel vidéo, pour établir une connexion et commencer à envoyer des messages.
|
||||
|
||||
Le canal par lequel vous partagez le lien n'a pas besoin d'être sécurisé - il suffit que vous puissiez confirmer qui vous a envoyé le message et que votre connexion SimpleX soit établie.
|
||||
|
||||
<img src="https://github.com/simplex-chat/.github/blob/master/profile/images/app1.png" alt="Make a private connection" height="360"> <img src="https://github.com/simplex-chat/.github/blob/master/profile/images/arrow.png" height="360"> <img src="https://github.com/simplex-chat/.github/blob/master/profile/images/app2.png" alt="Conversation" height="360"> <img src="https://github.com/simplex-chat/.github/blob/master/profile/images/arrow.png" height="360"> <img src="https://github.com/simplex-chat/.github/blob/master/profile/images/app3.png" alt="Video call" height="360">
|
||||
|
||||
Une fois la connexion établie, vous pouvez [vérifier le code de sécurité de la connexion](/blog/20230103-simplex-chat-v4.4-disappearing-messages.md#connection-security-verification).
|
||||
|
||||
## Guide de l'utilisateur (NOUVEAU)
|
||||
|
||||
Découvrez les fonctionnalités et les paramètres de l'application dans le nouveau [Guide de l'utilisateur](../fr/guide/README.md). (PROCHAINEMENT EN FR)
|
||||
|
||||
## Aider à traduire SimpleX Chat
|
||||
|
||||
Merci à nos utilisateurs et à [Weblate](https://hosted.weblate.org/engage/simplex-chat/), les applications, le site web et les documents de SimpleX Chat sont traduits dans de nombreuses autres langues.
|
||||
|
||||
Rejoignez nos traducteurs pour aider SimpleX à se développer !
|
||||
|
||||
|région|langue |contributeur|[Android](https://play.google.com/store/apps/details?id=chat.simplex.app) et [iOS](https://apps.apple.com/us/app/simplex-chat/id1605771084)|[site web](https://simplex.chat)|Docs Github|
|
||||
|:----:|:-------:|:---------:|:---------:|:---------:|:---------:|
|
||||
|🇬🇧 en|English | |✓|✓|✓|✓|
|
||||
|🇨🇿 cs|Čeština |[zen0bit](https://github.com/zen0bit)|[](https://hosted.weblate.org/projects/simplex-chat/android/cs/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/cs/)|[](https://hosted.weblate.org/projects/simplex-chat/website/cs/)|[✓](https://github.com/simplex-chat/simplex-chat/tree/master/docs/lang/cs)|
|
||||
|🇩🇪 de|Deutsch |[mlanp](https://github.com/mlanp)|[](https://hosted.weblate.org/projects/simplex-chat/android/de/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/de/)|[](https://hosted.weblate.org/projects/simplex-chat/website/de/)||
|
||||
|🇪🇸 es|Español ||[](https://hosted.weblate.org/projects/simplex-chat/android/es/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/es/)|||
|
||||
|🇫🇷 fr|Français |[ishi_sama](https://github.com/ishi-sama)|[](https://hosted.weblate.org/projects/simplex-chat/android/fr/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/fr/)|[](https://hosted.weblate.org/projects/simplex-chat/website/fr/)|[✓](https://github.com/simplex-chat/simplex-chat/tree/master/docs/lang/fr)|
|
||||
|🇮🇹 it|Italiano |[unbranched](https://github.com/unbranched)|[](https://hosted.weblate.org/projects/simplex-chat/android/it/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/it/)|[](https://hosted.weblate.org/projects/simplex-chat/website/it/)||
|
||||
|🇳🇱 nl|Nederlands|[mika-nl](https://github.com/mika-nl)|[](https://hosted.weblate.org/projects/simplex-chat/android/nl/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/nl/)|[](https://hosted.weblate.org/projects/simplex-chat/website/nl/)||
|
||||
|🇷🇺 ru|Русский ||[](https://hosted.weblate.org/projects/simplex-chat/android/ru/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/ru/)|||
|
||||
|🇨🇳 zh-CHS|简体中文|[sith-on-mars](https://github.com/sith-on-mars)|[](https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/zh_Hans/)|||
|
||||
|
||||
Langues en préparation : Arabe, Hindi, Japonais, Espagnol et [beaucoup d'autres](https://hosted.weblate.org/projects/simplex-chat/#languages). Nous ajouterons d'autres langues au fur et à mesure que celles déjà ajoutées seront terminées. N'hésitez pas à suggérer de nouvelles langues, à consulter le [guide de traduction](/docs/TRANSLATIONS.md) et à nous contacter !
|
||||
|
||||
## Contribuer
|
||||
|
||||
Nous serions ravis que vous participiez à notre développement ! Vous pouvez nous aider :
|
||||
|
||||
- en écrivant un tutoriel ou des notes sur les serveurs d'hébergement, l'automatisation des chatbots, etc.
|
||||
- en contribuant à la base de connaissances de SimpleX Chat.
|
||||
- ou développer des fonctionnalités - merci de vous connecter à nous via le chat pour que nous puissions vous aider à démarrer.
|
||||
|
||||
## Aidez-nous en faisant des dons
|
||||
|
||||
Un grand merci à tous ceux qui ont fait un don à SimpleX Chat !
|
||||
|
||||
Nous donnons la priorité à la confidentialité et à la sécurité des utilisateurs - cela serait impossible sans votre soutien.
|
||||
|
||||
Notre engagement envers nos utilisateurs est que les protocoles SimpleX sont et resteront ouverts, et dans le domaine public, - ainsi n'importe qui peut construire les futures implémentations des clients et des serveurs. Nous construisons une plateforme SimpleX basée sur les mêmes principes que le courrier électronique et le web, mais beaucoup plus privée et sécurisée.
|
||||
|
||||
Vos dons nous aident à collecter davantage de fonds - tout montant, même le prix d'une tasse de café, ferait une grande différence pour nous.
|
||||
|
||||
Il est possible de faire un don via :
|
||||
|
||||
- [GitHub](https://github.com/sponsors/simplex-chat) - il n'y a pas de commission à payer.
|
||||
- [OpenCollective](https://opencollective.com/simplex-chat) - ils prélèvent une commission et acceptent également les dons en crypto-monnaies.
|
||||
- Adresse Monero : 8568eeVjaJ1RQ65ZUn9PRQ8ENtqeX9VVhcCYYhnVLxhV4JtBqw42so2VEUDQZNkFfsH5sXCuV7FN8VhRQ21DkNibTZP57Qt
|
||||
- Adresse Bitcoin : 1bpefFkzuRoMY3ZuBbZNZxycbg7NYPYTG
|
||||
- Adresse BCH : 1bpefFkzuRoMY3ZuBbZNZxycbg7NYPYTG
|
||||
- Adresse Ethereum : 0x83fd788f7241a2be61780ea9dc72d2151e6843e2
|
||||
- Adresse Solana : 43tWFWDczgAcn4Rzwkpqg2mqwnQETSiTwznmCgA2tf1L
|
||||
|
||||
Nous vous remercions,
|
||||
|
||||
Evgeny
|
||||
|
||||
Fondateur de SimpleX Chat
|
||||
|
||||
## Sommaire
|
||||
|
||||
@@ -38,16 +134,11 @@
|
||||
- [Les utilisateurs sont maîtres de leur réseau SimpleX](#les-utilisateurs-sont-maîtres-du-réseau-simplex)
|
||||
- [Foire aux questions](#foire-aux-questions)
|
||||
- [Nouvelles et mises à jour](#nouvelles-et-mises-à-jour)
|
||||
- [Établir une connexion privée](#établir-une-connexion-privée)
|
||||
- [Installation rapide d'une application terminale](#⚡-installation-rapide-dune-application-pour-terminal)
|
||||
- [Le modèle de la plateforme SimpleX](#le-modèle-de-la-plateforme-simplex)
|
||||
- [Vie privée : détails techniques et limites](#vie-privée--détails-techniques-et-limites)
|
||||
- [Pour les développeurs](#pour-les-développeurs)
|
||||
- [Feuille de route](#feuille-de-route)
|
||||
- [Rejoindre un groupe d'utilisateurs](#rejoindre-un-groupe-dutilisateurs)
|
||||
- [Traduire l'application](#traduire-lapplication)
|
||||
- [Contribuer](#contribuer)
|
||||
- [Aidez-nous en faisant des dons](#aidez-nous-en-faisant-des-dons)
|
||||
- [Avertissements, contact de sécurité, licence](#avertissements)
|
||||
|
||||
## Pourquoi la vie privée est importante
|
||||
@@ -78,7 +169,7 @@ Vous pouvez utiliser SimpleX avec vos propres serveurs et continuer à communiqu
|
||||
|
||||
## Foire aux questions
|
||||
|
||||
1. _Comment SimpleX peut distribuer des messages sans aucun identifiant d'utilisateur ?_ Voir [l'annonce de la v2](/blog/20220511-simplex-chat-v2-images-files.md#the-first-messaging-platform-without-user-identifiers) explaining how SimpleX works.
|
||||
1. _Comment SimpleX peut distribuer des messages sans aucun identifiant d'utilisateur ?_ Voir [l'annonce de la v2](/blog/20220511-simplex-chat-v2-images-files.md#the-first-messaging-platform-without-user-identifiers) expliquant comment fonctionne SimpleX.
|
||||
|
||||
2. _Pourquoi ne pas simplement utiliser Signal ?_ Signal est une plateforme centralisée qui utilise les numéros de téléphone pour identifier ses utilisateurs et leurs contacts. Cela signifie que, si le contenu de vos messages sur Signal est protégé par un chiffrement robuste de bout en bout, une importante quantité de métadonnées est visible pour Signal - avec qui vous parlez et quand.
|
||||
|
||||
@@ -88,26 +179,22 @@ Vous pouvez utiliser SimpleX avec vos propres serveurs et continuer à communiqu
|
||||
|
||||
Mises à jour récentes :
|
||||
|
||||
[04 févr. 2023. Sortie de la v4.5 - avec plusieurs profils d'utilisateurs, les brouillons de messages, l'isolation du transport et l'interface en italien](/blog/20230204-simplex-chat-v4-5-user-chat-profiles.md).
|
||||
[28 mars, 2023. Sortie de la v4.6 - support d'Android 8+ et d'ARMv7a, profiles cachés, outils de modération de communauté, amélioration des appels audio/vidéo et réduction de l'utilisation de la batterie](/blog/20230328-simplex-chat-v4-6-hidden-profiles.md).
|
||||
|
||||
[03 janv. 2023. Sortie de la v4.4 - avec les messages éphèmères, les messages "en direct" (dynamique), la vérification de sécurité de la connexion, les GIFs et les autocollants ainsi que la langue de l'interface en français](/blog/20230103-simplex-chat-v4.4-disappearing-messages.md).
|
||||
[1er mars, 2023. Protocole de transfert de fichiers SimpleX – envoyer des fichiers volumineux de manière efficace, privée et sécurisée, bientôt intégré dans les applications SimpleX Chat](/blog/20230301-simplex-file-transfer-protocol.md).
|
||||
|
||||
[06 déc. 2022. Revues de novembre et sortie de la v4.3 - avec les messages vocaux instantanés, la suppression irréversible de messages et une configuration améliorée des serveurs](/blog/20221206-simplex-chat-v4.3-voice-messages.md).
|
||||
[4 févr. 2023. Sortie de la v4.5 - avec plusieurs profils d'utilisateurs, les brouillons de messages, l'isolation du transport et l'interface en italien](/blog/20230204-simplex-chat-v4-5-user-chat-profiles.md).
|
||||
|
||||
[08 nov. 2022. Audit de sécurité par Trail of Bits, nouveau site web et sortie de la v4.2](/blog/20221108-simplex-chat-v4.2-security-audit-new-website.md).
|
||||
[3 janv. 2023. Sortie de la v4.4 - avec les messages éphèmères, les messages "en direct" (dynamique), la vérification de sécurité de la connexion, les GIFs et les autocollants ainsi que la langue de l'interface en français](/blog/20230103-simplex-chat-v4.4-disappearing-messages.md).
|
||||
|
||||
[6 déc. 2022. Revues de novembre et sortie de la v4.3 - avec les messages vocaux instantanés, la suppression irréversible de messages et une configuration améliorée des serveurs](/blog/20221206-simplex-chat-v4.3-voice-messages.md).
|
||||
|
||||
[8 nov. 2022. Audit de sécurité par Trail of Bits, nouveau site web et sortie de la v4.2](/blog/20221108-simplex-chat-v4.2-security-audit-new-website.md).
|
||||
|
||||
[28 sept. 2022. v4.0 : base de données de chat local chiffrée et beaucoup d'autres changements](/blog/20220928-simplex-chat-v4-encrypted-database.md).
|
||||
|
||||
[Toutes les mises à jour](/blog)
|
||||
|
||||
## Établir une connexion privée
|
||||
|
||||
Vous devez partager un lien ou scanner un code QR (en personne ou pendant un appel vidéo) pour établir une connexion et commencer à envoyer des messages.
|
||||
|
||||
Le canal par lequel vous partagez le lien n'a pas besoin d'être sécurisé - il suffit que vous puissiez confirmer qui vous a envoyé le message et que votre connexion SimpleX soit établie.
|
||||
|
||||
<img src="https://github.com/simplex-chat/.github/blob/master/profile/images/app1.png" alt="Établir une connexion privée" height="360"> <img src="https://github.com/simplex-chat/.github/blob/master/profile/images/arrow.png" height="360"> <img src="https://github.com/simplex-chat/.github/blob/master/profile/images/app2.png" alt="Conversation" height="360"> <img src="https://github.com/simplex-chat/.github/blob/master/profile/images/arrow.png" height="360"> <img src="https://github.com/simplex-chat/.github/blob/master/profile/images/app3.png" alt="Appel vidéo" height="360">
|
||||
|
||||
## ⚡ Installation rapide d'une application pour terminal
|
||||
|
||||
```sh
|
||||
@@ -130,9 +217,9 @@ Contrairement aux réseaux fédérés, les nœuds serveurs **ne possèdent pas d
|
||||
|
||||
Seuls les appareils clients disposent d'informations sur les utilisateurs, leurs contacts et leurs groupes.
|
||||
|
||||
Voir le [livre blanc de SimpleX](https://github.com/simplex-chat/simplexmq/blob/stable/protocol/overview-tjr.md) pour plus d'informations sur les objectifs et la conception technique de la plateforme.
|
||||
Voir le [whitepaper de SimpleX](https://github.com/simplex-chat/simplexmq/blob/stable/protocol/overview-tjr.md) pour plus d'informations sur les objectifs et la conception technique de la plateforme.
|
||||
|
||||
Voir [SimpleX Chat Protocol](/docs/protocol/simplex-chat.md) pour le format des messages envoyés entre les clients de chat sur [SimpleX Messaging Protocol](https://github.com/simplex-chat/simplexmq/blob/stable/protocol/simplex-messaging.md).
|
||||
Voir le [protocole de SimpleX Chat](/docs/protocol/simplex-chat.md) pour le format des messages envoyés entre les clients de chat sur [SimpleX Messaging Protocol](https://github.com/simplex-chat/simplexmq/blob/stable/protocol/simplex-messaging.md).
|
||||
|
||||
## Vie privée : détails techniques et limites
|
||||
|
||||
@@ -202,17 +289,21 @@ Si vous envisagez de développer avec la plateforme SimpleX, n'hésitez pas à n
|
||||
- ✅ Plusieurs profils d'utilisateurs dans la même base de données de chat.
|
||||
- ✅ Optionnellement, éviter de réutiliser la même session TCP pour plusieurs connexions.
|
||||
- ✅ Conservation des brouillons de message.
|
||||
- 🏗 Serveur de fichiers pour optimiser l'envoi efficace et privé de fichiers volumineux.
|
||||
- 🏗 Amélioration des appels audio et vidéo.
|
||||
- ✅ Serveur de fichiers pour optimiser l'envoi efficace et privé de fichiers volumineux.
|
||||
- ✅ Amélioration des appels audio et vidéo.
|
||||
- ✅ Prise en charge d'anciens OS d'Android et des processeurs 32 bits.
|
||||
- ✅ Profiles de chat cachés
|
||||
- 🏗 Envoi et réception de fichiers volumineux via le [protocole XFTP](/blog/20230301-simplex-file-transfer-protocol.md).
|
||||
- 🏗 Messages vidéo
|
||||
- 🏗 Redondance et rotation des files d'attente SMP (mode manuel déjà fonctionnel).
|
||||
- 🏗 Réduction de l'utilisation de la batterie et du trafic dans les grands groupes.
|
||||
- 🏗 Prise en charge d'anciens OS d'Android et des processeurs 32 bits.
|
||||
- Inclure un message facultatif dans la demande de connexion envoyée via l'adresse de contact.
|
||||
- Conversations éphémères/disparaissantes/OTR avec les contacts existants.
|
||||
- Mot de passe/pin d'accès (avec mot de passe d'accès alternatif facultatif).
|
||||
- Chiffrement des fichiers locaux de l'app.
|
||||
- Messages vidéo.
|
||||
- Amélioration de la navigation et de la recherche dans la conversation (développer et faire défiler jusqu'au message cité, faire défiler jusqu'aux résultats de la recherche, etc.)
|
||||
- Confirmation de la distribution du message (avec option d'acceptation ou de refus de l'expéditeur par contact, TBC).
|
||||
- Partager votre position en privé.
|
||||
- Flux/diffusion.
|
||||
- Widgets Web pour une interactivité personnalisée dans les chats.
|
||||
- Automatismes et règles de chat programmables (réponses/transferts/suppressions/envois automatiques, rappels, etc.)
|
||||
@@ -225,77 +316,10 @@ Si vous envisagez de développer avec la plateforme SimpleX, n'hésitez pas à n
|
||||
- Relais de distribution des messages pour les expéditeurs (pour dissimuler l'adresse IP des serveurs des destinataires et réduire le trafic).
|
||||
- Relais SMP multi-nœuds à haute capacité.
|
||||
|
||||
## Rejoindre un groupe d'utilisateurs
|
||||
|
||||
Vous pouvez rejoindre le groupe anglophone général : [#SimpleX-Group](https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2Fhpq7_4gGJiilmz5Rf-CswuU5kZGkm_zOIooSw6yALRg%3D%40smp5.simplex.im%2FcIS0gu1h0Y8pZpQkDaSz7HZGSHcKpMB9%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAKzzWAJYrVt1zdgRp4pD3FBst6eK7233DJeNElENLJRA%253D%26srv%3Djjbyvoemxysm7qxap7m5d5m35jzv5qq6gnlv7s4rsn7tdwwmuqciwpid.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%228mazMhefXoM5HxWBfZnvwQ%3D%3D%22%7D). Just bear in mind that it has ~300 members now, and that it is fully decentralized, so sending a message and connecting to all members in this group will take some time, only join it if you:
|
||||
- voir comment fonctionnent les grands groupes.
|
||||
- le réseau n'est pas un problème (l'envoi de chaque message est de ~5mb).
|
||||
|
||||
Vous pouvez également rejoindre un nouveau groupe anglophone, plus petit, si vous souhaitez poser des questions sans trop de trafic : [#SimpleX-Group-2](https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2Fhpq7_4gGJiilmz5Rf-CswuU5kZGkm_zOIooSw6yALRg%3D%40smp5.simplex.im%2FQP8zaGjjmlXV-ix_Er4JgJ0lNPYGS1KX%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEApAgBkRZ3x12ayZ7sHrjHQWNMvqzZpWUgM_fFCUdLXwo%253D%26srv%3Djjbyvoemxysm7qxap7m5d5m35jzv5qq6gnlv7s4rsn7tdwwmuqciwpid.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22xWpPXEZZsQp_F7vwAcAYDw%3D%3D%22%7D)
|
||||
|
||||
Il existe également plusieurs groupes dans des langues autres que l'anglais, dans lesquelles nous avons traduit l'interface de l'application. Ces groupes sont destinés à tester et à poser des questions aux autres utilisateurs de SimpleX Chat. Nous ne répondons pas toujours aux questions dans ces groupes, alors veuillez les poser dans l'un des groupes anglophones.
|
||||
|
||||
- [\#SimpleX-DE](https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FkIEl7OQzcp-J6aDmjdlQbRJwqkcZE7XR%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAR16PCu02MobRmKAsjzhDWMZcWP9hS8l5AUZi-Gs8z18%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22puYPMCQt11yPUvgmI5jCiw%3D%3D%22%7D) (Germanophone).
|
||||
- [\#SimpleX-FR](https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2Fhpq7_4gGJiilmz5Rf-CswuU5kZGkm_zOIooSw6yALRg%3D%40smp5.simplex.im%2FvIHQDxTor53nwnWWTy5cHNwQQAdWN5Hw%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAPdgK1eBnETmgiqEQufbUkydKBJafoRx4iRrtrC2NAGc%253D%26srv%3Djjbyvoemxysm7qxap7m5d5m35jzv5qq6gnlv7s4rsn7tdwwmuqciwpid.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%221FyUryBPza-1ZFFE80Ekbg%3D%3D%22%7D) (Francophone).
|
||||
- [\#SimpleX-RU](https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FXZyt3hJmWsycpN7Dqve_wbrAqb6myk1R%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAMFVIoytozTEa_QXOgoZFq_oe0IwZBYKvW50trSFXzXo%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22xz05ngjA3pNIxLZ32a8Vxg%3D%3D%22%7D) (Russophone).
|
||||
- [\#SimpleX-IT](https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2F0weR-ZgDUl7ruOtI_8TZwEsnJP6UiImA%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAq4PSThO9Fvb5ydF48wB0yNbpzCbuQJCW3vZ9BGUfcxk%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22e-iceLA0SctC62eARgYDWg%3D%3D%22%7D) (Italophone).
|
||||
|
||||
Vous pouvez rejoindre ces groupes soit en ouvrant ces liens dans l'application, soit en les ouvrant dans un navigateur de bureau et en scannant le code QR.
|
||||
|
||||
Rejoignez-nous via l'application pour échanger sur ce qui se passe et poser toutes vos questions !
|
||||
|
||||
## Traduire l'application
|
||||
|
||||
Grâce à nos utilisateurs et à [Weblate](https://hosted.weblate.org/engage/simplex-chat/), les applications de chat SimpleX sont traduites dans de nombreuses autres langues. Rejoignez nos traducteurs pour aider SimpleX à se développer plus rapidement !
|
||||
|
||||
Langues d'interface existantes :
|
||||
|
||||
Anglais (langue de développement)
|
||||
Allemand : [@mlanp](https://github.com/mlanp)
|
||||
Français : [@ishi_sama](https://github.com/ishi-sama)
|
||||
Italien : [@unbranched](https://github.com/unbranched)
|
||||
Russe : équipe du projet
|
||||
|
||||
Langues en cours : Chinois, hindi, japonais, néerlandais et [beaucoup d'autres](https://hosted.weblate.org/projects/simplex-chat/#languages). Nous ajouterons d'autres langues au fur et à mesure de l'achèvement de certaines d'entre elles. N'hésitez pas à suggérer de nouvelles langues et à nous contacter !
|
||||
|
||||
## Contribuer
|
||||
|
||||
Nous serions ravis de vous voir rejoindre le développement ! Vous pouvez contribuer à SimpleX Chat pour :
|
||||
|
||||
- traduire la page d'accueil du site web - il y a beaucoup de contenu que nous aimerions partager, cela permettrait d'attirer les nouveaux utilisateurs.
|
||||
- écrire un tutoriel ou des recommandations sur l'hébergement de serveurs, l'automatisation des bots de chat, etc.
|
||||
- développer des nouvelles fonctionnalités - veuillez nous contacter par chat pour que nous puissions vous aider à démarrer.
|
||||
|
||||
## Aidez-nous en faisant des dons
|
||||
|
||||
Un grand merci à tous ceux qui ont fait un don à SimpleX Chat !
|
||||
|
||||
Nous donnons la priorité à la confidentialité et à la sécurité des utilisateurs - ce serait impossible sans votre soutien.
|
||||
|
||||
Notre promesse à nos utilisateurs est que les protocoles SimpleX sont et resteront open-source, et dans le domaine public, - afin que tout le monde puisse créer les futures implémentations des clients et des serveurs. Nous créons une plateforme SimpleX basée sur les mêmes principes que l'e-mail et le web, mais bien plus privée et sécurisée.
|
||||
|
||||
Vos dons nous aident à collecter plus de fonds - tout montant, même le prix d'une tasse de café, ferait une grande différence pour nous.
|
||||
|
||||
Il est possible de faire un don via :
|
||||
|
||||
- [GitHub](https://github.com/sponsors/simplex-chat) - sans commission pour nous.
|
||||
- [OpenCollective](https://opencollective.com/simplex-chat) - perçoit une commission, et accepte également les dons en crypto-monnaies.
|
||||
- Adresse Monero : 8568eeVjaJ1RQ65ZUn9PRQ8ENtqeX9VVhcCYYhnVLxhV4JtBqw42so2VEUDQZNkFfsH5sXCuV7FN8VhRQ21DkNibTZP57Qt
|
||||
- Adresse Bitcoin : 1bpefFkzuRoMY3ZuBbZNZxycbg7NYPYTG
|
||||
- Adresse BCH : 1bpefFkzuRoMY3ZuBbZNZxycbg7NYPYTG
|
||||
- Adresse Ethereum : 0x83fd788f7241a2be61780ea9dc72d2151e6843e2
|
||||
- Adresse Solana : 43tWFWDczgAcn4Rzwkpqg2mqwnQETSiTwznmCgA2tf1L
|
||||
- si vous souhaitez effectuer un don dans une autre crypto-monnaie, veuillez nous en informer via une demande GitHub ou un chat. Nous ajouterons l'adresse à la liste.
|
||||
|
||||
Merci,
|
||||
|
||||
Evgeny
|
||||
|
||||
Fondateur de SimpleX Chat
|
||||
|
||||
## Avertissements
|
||||
|
||||
[Protocoles et modèle de sécurité de SimpleX](https://github.com/simplex-chat/simplexmq/blob/master/protocol/overview-tjr.md) a été revu et a fait l'objet de nombreuses modifications et améliorations dans la v1.0.0.
|
||||
Les [protocoles et le modèle de sécurité de SimpleX](https://github.com/simplex-chat/simplexmq/blob/master/protocol/overview-tjr.md) a été revu et a fait l'objet de nombreuses modifications et améliorations dans la v1.0.0.
|
||||
|
||||
L'audit de sécurité a été réalisé en octobre 2022 par [Trail of Bits](https://www.trailofbits.com/about), et la plupart des corrections ont été publiées dans la version 4.2.0 - voir [l'annonce](/blog/20221108-simplex-chat-v4.2-security-audit-new-website.md).
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
| Updated 07.02.2023 | Languages: [EN](/docs/SERVER.md), FR |
|
||||
| 31.01.2023 | FR, [EN](/docs/SERVER.md), [CZ](/docs/lang/cs/SERVER.md) |
|
||||
|
||||
# Héberger votre propre serveur SMP
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
| Updated 07.02.2023 | Languages: [EN](/docs/SIMPLEX.md), FR |
|
||||
| 07.02.2023 | FR, [EN](/docs/SIMPLEX.md), [CZ](/docs/lang/cs/SIMPLEX.md) |
|
||||
|
||||
# Plateforme SimpleX - motivation et comparaison
|
||||
|
||||
|
||||
+16
-2
@@ -1,6 +1,20 @@
|
||||
| Updated 31.01.2023 | Languages: [EN](/docs/SQL.md), FR |
|
||||
| 31.01.2023 | FR, [EN](/docs/SQL.md), [CZ](/docs/lang/cs/SQL.md) |
|
||||
|
||||
# Accès à l'historique des messages via des requêtes SQL
|
||||
# Accès aux messages de la base de données
|
||||
|
||||
## Déchiffrer les bases de données
|
||||
|
||||
Afin de visualiser les données de la base de données, vous devez d'abord les déchiffrer. Installez `sqlcipher` en utilisant votre gestionnaire de paquets préféré et exécutez les commandes suivantes dans le répertoire contenant les bases de données :
|
||||
```bash
|
||||
sqlcipher files_chat.db
|
||||
pragma key="youDecryptionPassphrase";
|
||||
# S'assurer qu'il fonctionne bien
|
||||
select * from users;
|
||||
```
|
||||
|
||||
Si vous voyez `Parse error : no such table : users`, assurez-vous que vous avez entré la bonne phrase secrète, et que vous avez changé la phrase secrète au hasard dans l'application Android (si vous avez obtenu cette base de données à partir d'un appareil Android, bien sûr).
|
||||
|
||||
# Requêtes SQL
|
||||
|
||||
Vous pouvez exécuter des requêtes `direct_messages`, `group_messages` et `all_messages` (ou leurs alternatives plus simples `direct_messages_plain`, `group_messages_plain` et `all_messages_plain`), par exemple :
|
||||
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
| 19.03.2023 | FR, [EN](/docs/TRANSLATIONS.md), [CZ](/docs/lang/cs/TRANSLATIONS.md) |
|
||||
|
||||
# Contribuer aux traductions de SimpleX Chat
|
||||
|
||||
Un grand merci pour votre intérêt pour la traduction de SimpleX Chat - cela nous aide beaucoup à rendre l'application accessible à un plus grand nombre d'utilisateurs, et nous vous remercions de votre aide.
|
||||
|
||||
Cela demande un investissement en temps considérable - la plupart des gens le sous-estiment au départ - et une maintenance continue au fur et à mesure que nous développons l'application.
|
||||
|
||||
Ce document est créé pour accélérer ce processus, et partager quelques astuces importantes que nous avons découverts en travaillant avec Weblate - la plateforme que nous utilisons pour les traductions d'interface.
|
||||
|
||||
## Avant de commencer la traduction
|
||||
|
||||
1. Créez un compte sur Weblate, en utilisant le même e-mail que celui que vous utilisez sur GitHub - cela permettra d'associer vos contributions à votre compte GitHub, et pourra vous aider dans certains cas. Une fois la traduction publiée pour les utilisateurs, nous ajouterons le nom de votre compte à la [liste des traducteurs](https://github.com/simplex-chat/simplex-chat#translate-the-apps).
|
||||
|
||||
2. Avant de commencer la traduction, il y a un simple accord de licence pour les contributeurs à signer via Weblate - ceci afin d'éviter tout conflit autour des droits de propriété intellectuelle. La copie de cet accord est également [disponible ici](https://github.com/simplex-chat/cla/blob/master/CLA.md).
|
||||
|
||||
3. Nous pouvons également vous ajouter au groupe de traducteurs pour toute question et mise à jour - veuillez vous connecter à moi via le chat.
|
||||
|
||||
## Avancement de la traduction
|
||||
|
||||
1. Veuillez commencer par [l'app Android](https://hosted.weblate.org/projects/simplex-chat/android/), à la fois lorsque vous effectuez la traduction initiale la plus longue, et que vous ajoutez les chaînes de caractères plus tard. Premièrement, les chaînes iOS peuvent être un peu retardées dans leur apparition dans Weblate, car elles nécessitent une étape manuelle de notre part avant d'être visibles. Deuxièmement, l'application Android est configurée comme un glossaire pour l'application iOS, et 2/3 de toutes les chaînes ne nécessitent que quelques clics pour les transférer d'Android à iOS (cela prend toujours un certain temps, Weblate ne l'automatise pas, malheureusement).
|
||||
|
||||
2. Certaines des chaînes n'ont pas besoin d'être traduites, mais elles doivent quand même être copiées - il y a un bouton dans l'interface weblate pour cela :
|
||||
|
||||
<img src="/images/weblate_1.png" alt="weblate: copy source to translation" width="100%">
|
||||
|
||||
3. Weblate propose également des suggestions automatiques qui peuvent accélérer le processus. Parfois, elles peuvent être utilisées telles quelles, parfois elles nécessitent quelques retouches - cliquez pour les utiliser dans les traductions.
|
||||
|
||||
4. Une fois que toutes les chaînes de caractères de l'application Android sont traduites, veuillez les réviser pour vous assurer de la cohérence du style et de la langue, afin que les mêmes mots soient systématiquement utilisés pour des actions similaires de l'utilisateur, comme en anglais. Parfois, vous devrez utiliser des mots différents dans des cas où l'anglais n'en a qu'un seul. Veuillez essayer d'utiliser ces choix de manière cohérente dans des contextes similaires, afin de faciliter la tâche des utilisateurs finaux.
|
||||
|
||||
5. Quand vous traduisez [l'app iOS](https://hosted.weblate.org/projects/simplex-chat/ios/), la plupart des chaînes de caractères sont identiques, elles peuvent être copiées en un clic dans la section Glossaire. L'indice visuel que cela est possible est que la chaîne source entière est surlignée en jaune. De nombreuses autres chaînes sont très similaires, elles ne diffèrent que par la syntaxe d'interpolation ou la façon dont la police en gras est utilisée - elles ne nécessitent qu'une édition minimale. Certaines chaînes sont propres à la plate-forme iOS. Elles doivent être traduites séparément.
|
||||
|
||||
<img src="/images/weblate_2.png" alt="weblate: automatic suggestions" width="100%">
|
||||
|
||||
## Une fois la traduction terminée
|
||||
|
||||
Une fois que les applications Android et iOS sont traduites, veuillez nous en informer.
|
||||
|
||||
Nous allons ensuite :
|
||||
- revoir toutes les traductions et suggérer des corrections - cela prend aussi un peu de temps :)
|
||||
- les fusionner avec le code source - pendant que nous le ferons, weblate sera verrouillé pour les changements.
|
||||
- créer des versions bêta des applications iOS et Android - nous pouvons également vous ajouter aux groupes de testeurs internes, afin que vous puissiez installer les applications avant tout le monde.
|
||||
- diffuser l'application auprès de nos utilisateurs bêta - ce sont plus d'un millier de personnes qui utilisent nos versions bêta.
|
||||
- publier l'application et inclure la nouvelle langue dans l'annonce.
|
||||
|
||||
*Remarque* : nous souhaitons que les fonctions de l'application restent cohérentes entre les plateformes Android et iOS, dans la mesure du possible. Nous publierons et annoncerons donc une nouvelle langue une fois que les deux plateformes auront été traduites. Cela ne signifie pas que vous devez le faire, mais nous devrons attendre que quelqu'un d'autre traduise la deuxième plateforme. Mais si vous commencez par Android, l'ajout d'iOS prend généralement 3 à 4 fois moins de temps.
|
||||
|
||||
## La suite
|
||||
|
||||
1. Lorsque nous mettons l'application à jour, nous publions les mises à jour dans le groupe de traducteurs. Vous n'avez absolument aucune obligation de traduire ces chaînes supplémentaires. Nous apprécions énormément que vous le fassiez, car l'expérience des utilisateurs est bien meilleure, ils dépendent de vos traductions, si une nouvelle partie de l'application n'est pas traduite.
|
||||
|
||||
2. Vous pouvez également aider à promouvoir l'application dans votre pays / groupe linguistique en traduisant nos documents - nous venons de commencer - ainsi que le contenu de notre site web. Il y a eu beaucoup de demandes pour le faire et nous sommes en train d'ajouter le cadre de traduction pour le site web.
|
||||
|
||||
3. De plus, si vous souhaitez être modérateur/administrateur du groupe d'utilisateurs dans votre langue, une fois l'application traduite, nous pourrons héberger un tel groupe. Nous sommes en train de préparer des règles de conduite pour la communauté et d'ajouter des outils de modération à l'application qui sortira dans la v5 en mars.
|
||||
|
||||
|
||||
Encore une fois un grand merci de nous aider à développer SimpleX Chat !
|
||||
|
||||
Evgeny, fondateur de SimpleX Chat.
|
||||
@@ -1,4 +1,4 @@
|
||||
| Updated 31.01.2023 | Languages: [EN](/docs/WEBRTC.md), FR |
|
||||
| 31.01.2023 | FR, [EN](/docs/WEBRTC.md), [CZ](/docs/lang/cs/WEBRTC.md) |
|
||||
|
||||
# Utilisation de serveurs WebRTC ICE personnalisés dans SimpleX Chat
|
||||
|
||||
|
||||
+3
-1
@@ -1,5 +1,5 @@
|
||||
name: simplex-chat
|
||||
version: 4.6.0.0
|
||||
version: 4.6.1.1
|
||||
#synopsis:
|
||||
#description:
|
||||
homepage: https://github.com/simplex-chat/simplex-chat#readme
|
||||
@@ -20,6 +20,7 @@ dependencies:
|
||||
- base64-bytestring >= 1.0 && < 1.3
|
||||
- bytestring == 0.10.*
|
||||
- composition == 1.0.*
|
||||
- constraints >= 0.12 && < 0.14
|
||||
- containers == 0.6.*
|
||||
- cryptonite >= 0.27 && < 0.30
|
||||
- directory == 1.3.*
|
||||
@@ -107,6 +108,7 @@ tests:
|
||||
- deepseq == 1.4.*
|
||||
- hspec == 2.7.*
|
||||
- network == 3.1.*
|
||||
- silently == 1.2.*
|
||||
- stm == 2.5.*
|
||||
ghc-options:
|
||||
- -threaded
|
||||
|
||||
@@ -12,37 +12,53 @@ store_password=$5
|
||||
key_alias=$6
|
||||
key_password=$7
|
||||
|
||||
if [ -z ${7} ]; then echo "You didn't enter all required params:
|
||||
if [ -z "${7}" ]; then echo "You didn't enter all required params:
|
||||
compress-and-sign-apk.sh level apk_parent_dir sdk_dir store_file store_password key_alias key_password"
|
||||
fi
|
||||
|
||||
cd $apk_parent_dir
|
||||
cd "$apk_parent_dir"
|
||||
|
||||
touch remove_this_file remove_this_FILE
|
||||
(( $(ls | grep "remove_this" | wc -l)==1 )) && case_insensitive=1 || case_insensitive=0
|
||||
#echo Case-insensitive file system: $case_insensitive
|
||||
rm remove_this_file remove_this_FILE 2> /dev/null || true
|
||||
|
||||
ORIG_NAMES=( $(echo app*.apk) )
|
||||
for ORIG_NAME in "${ORIG_NAMES[@]}"; do
|
||||
unzip -o -q -d apk $ORIG_NAME
|
||||
ORIG_NAME_COPY=$ORIG_NAME-copy
|
||||
mv "$ORIG_NAME" "$ORIG_NAME_COPY"
|
||||
|
||||
rm $ORIG_NAME
|
||||
|
||||
(cd apk && zip -r -q -$level ../$ORIG_NAME .)
|
||||
(cd apk && zip -r -q -"$level" ../"$ORIG_NAME" .)
|
||||
# Shouldn't be compressed because of Android requirement
|
||||
(cd apk && zip -r -q -0 ../$ORIG_NAME resources.arsc)
|
||||
(cd apk && zip -r -q -0 ../$ORIG_NAME res)
|
||||
(cd apk && zip -r -q -0 ../"$ORIG_NAME" resources.arsc)
|
||||
|
||||
if [ $case_insensitive -eq 1 ]; then
|
||||
# For case-insensitive file systems
|
||||
list_of_files=$(unzip -l "$ORIG_NAME_COPY" | grep res/ | sed -e "s|.*res/|res/|")
|
||||
for file in $list_of_files; do unzip -o -q -d apk "$ORIG_NAME_COPY" "$file" && (cd apk && zip -r -q -0 ../"$ORIG_NAME" "$file"); done
|
||||
else
|
||||
# This method is not working correctly on case-insensitive file systems since Android AAPT produce the same names of files
|
||||
# but with different case like xX.png, Xx.png, xx.png, etc
|
||||
(cd apk && zip -r -q -0 ../"$ORIG_NAME" res)
|
||||
fi
|
||||
|
||||
#(cd apk && 7z a -r -mx=$level -tzip -x!resources.arsc ../$ORIG_NAME .)
|
||||
#(cd apk && 7z a -r -mx=0 -tzip ../$ORIG_NAME resources.arsc)
|
||||
|
||||
ALL_TOOLS=($sdk_dir/build-tools/*/)
|
||||
ALL_TOOLS=("$sdk_dir"/build-tools/*/)
|
||||
BIN_DIR="${ALL_TOOLS[1]}"
|
||||
|
||||
$BIN_DIR/zipalign -p -f 4 $ORIG_NAME $ORIG_NAME-2
|
||||
"$BIN_DIR"/zipalign -p -f 4 "$ORIG_NAME" "$ORIG_NAME"-2
|
||||
|
||||
mv $ORIG_NAME{-2,}
|
||||
mv "$ORIG_NAME"{-2,}
|
||||
|
||||
$BIN_DIR/apksigner sign \
|
||||
"$BIN_DIR"/apksigner sign \
|
||||
--ks "$store_file" --ks-key-alias "$key_alias" --ks-pass "pass:$store_password" \
|
||||
--key-pass "pass:$key_password" $ORIG_NAME
|
||||
--key-pass "pass:$key_password" "$ORIG_NAME"
|
||||
|
||||
# cleanup
|
||||
rm "$ORIG_NAME_COPY" 2> /dev/null || true
|
||||
rm -rf apk || true
|
||||
rm ${ORIG_NAME}.idsig 2> /dev/null || true
|
||||
rm "${ORIG_NAME}".idsig 2> /dev/null || true
|
||||
done
|
||||
Executable
+17
@@ -0,0 +1,17 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
langs=( cs de es fr it nl ru zh-Hans )
|
||||
|
||||
for lang in "${langs[@]}"; do
|
||||
echo "***"
|
||||
echo "***"
|
||||
echo "***"
|
||||
echo "*** Exporting $lang"
|
||||
xcodebuild -exportLocalizations \
|
||||
-project ./apps/ios/SimpleX.xcodeproj
|
||||
-localizationPath ./apps/ios/SimpleX\ Localizations
|
||||
-exportLanguage $lang
|
||||
sleep 2
|
||||
done
|
||||
Executable
+18
@@ -0,0 +1,18 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
langs=( cs de es fr it nl ru zh-Hans )
|
||||
|
||||
for lang in "${langs[@]}"; do
|
||||
echo "***"
|
||||
echo "***"
|
||||
echo "***"
|
||||
echo "*** Importing $lang"
|
||||
xcodebuild -importLocalizations \
|
||||
-project ./apps/ios/SimpleX.xcodeproj \
|
||||
-localizationPath ./apps/ios/SimpleX\ Localizations/$lang.xcloc \
|
||||
-disableAutomaticPackageResolution \
|
||||
-skipPackageUpdates
|
||||
sleep 2
|
||||
done
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user