Merge branch 'master' into master-android

This commit is contained in:
Evgeny Poberezkin
2024-11-30 20:55:17 +00:00
237 changed files with 15104 additions and 8948 deletions
@@ -14,6 +14,7 @@ import chat.simplex.common.model.ChatController.appPrefs
import chat.simplex.common.ui.theme.DEFAULT_PADDING
import chat.simplex.common.views.chatlist.NavigationBarBackground
import chat.simplex.common.views.helpers.*
import chat.simplex.common.views.onboarding.OnboardingStage
import kotlinx.coroutines.flow.filter
import kotlin.math.absoluteValue
@@ -124,7 +125,7 @@ actual fun ColumnWithScrollBar(
}
}
}
val oneHandUI = remember { appPrefs.oneHandUI.state }
val oneHandUI = remember { derivedStateOf { if (appPrefs.onboardingStage.state.value == OnboardingStage.OnboardingComplete) appPrefs.oneHandUI.state.value else false } }
Box(Modifier.fillMaxHeight()) {
Column(
if (maxIntrinsicSize) {
@@ -431,8 +431,10 @@ fun DesktopScreen(userPickerState: MutableStateFlow<AnimatedViewState>) {
.fillMaxSize()
.padding(start = DEFAULT_START_MODAL_WIDTH * fontSizeSqrtMultiplier)
.clickable(interactionSource = remember { MutableInteractionSource() }, indication = null, onClick = {
ModalManager.start.closeModals()
userPickerState.value = AnimatedViewState.HIDING
if (chatModel.centerPanelBackgroundClickHandler == null || chatModel.centerPanelBackgroundClickHandler?.invoke() == false) {
ModalManager.start.closeModals()
userPickerState.value = AnimatedViewState.HIDING
}
})
)
}
@@ -167,6 +167,9 @@ object ChatModel {
val processedCriticalError: ProcessedErrors<AgentErrorType.CRITICAL> = ProcessedErrors(60_000)
val processedInternalError: ProcessedErrors<AgentErrorType.INTERNAL> = ProcessedErrors(20_000)
// return true if you handled the click
var centerPanelBackgroundClickHandler: (() -> Boolean)? = null
fun getUser(userId: Long): User? = if (currentUser.value?.userId == userId) {
currentUser.value
} else {
@@ -330,9 +333,8 @@ object ChatModel {
chatItems = arrayListOf(newPreviewItem),
chatStats =
if (cItem.meta.itemStatus is CIStatus.RcvNew) {
val minUnreadId = if(chat.chatStats.minUnreadItemId == 0L) cItem.id else chat.chatStats.minUnreadItemId
increaseUnreadCounter(rhId, currentUser.value!!)
chat.chatStats.copy(unreadCount = chat.chatStats.unreadCount + 1, minUnreadItemId = minUnreadId)
chat.chatStats.copy(unreadCount = chat.chatStats.unreadCount + 1)
}
else
chat.chatStats
@@ -511,23 +513,19 @@ object ChatModel {
}
}
fun markChatItemsRead(remoteHostId: Long?, chatInfo: ChatInfo, range: CC.ItemRange? = null, unreadCountAfter: Int? = null) {
fun markChatItemsRead(remoteHostId: Long?, chatInfo: ChatInfo, itemIds: List<Long>? = null) {
val cInfo = chatInfo
val markedRead = markItemsReadInCurrentChat(chatInfo, range)
val markedRead = markItemsReadInCurrentChat(chatInfo, itemIds)
// update preview
val chatIdx = getChatIndex(remoteHostId, cInfo.id)
if (chatIdx >= 0) {
val chat = chats[chatIdx]
val lastId = chat.chatItems.lastOrNull()?.id
if (lastId != null) {
val unreadCount = unreadCountAfter ?: if (range != null) chat.chatStats.unreadCount - markedRead else 0
val unreadCount = if (itemIds != null) chat.chatStats.unreadCount - markedRead else 0
decreaseUnreadCounter(remoteHostId, currentUser.value!!, chat.chatStats.unreadCount - unreadCount)
chats[chatIdx] = chat.copy(
chatStats = chat.chatStats.copy(
unreadCount = unreadCount,
// Can't use minUnreadItemId currently since chat items can have unread items between read items
//minUnreadItemId = if (range != null) kotlin.math.max(chat.chatStats.minUnreadItemId, range.to + 1) else lastId + 1
)
chatStats = chat.chatStats.copy(unreadCount = unreadCount)
)
}
}
@@ -639,21 +637,17 @@ object ChatModel {
}
}
private fun markItemsReadInCurrentChat(chatInfo: ChatInfo, range: CC.ItemRange? = null): Int {
private fun markItemsReadInCurrentChat(chatInfo: ChatInfo, itemIds: List<Long>? = null): Int {
val cInfo = chatInfo
var markedRead = 0
if (chatId.value == cInfo.id) {
val items = chatItems.value
var i = items.lastIndex
val itemIdsFromRange = if (range != null) {
(range.from .. range.to).toMutableSet()
} else {
mutableSetOf()
}
val itemIdsFromRange = itemIds?.toMutableSet() ?: mutableSetOf()
val markedReadIds = mutableSetOf<Long>()
while (i >= 0) {
val item = items[i]
if (item.meta.itemStatus is CIStatus.RcvNew && (range == null || itemIdsFromRange.contains(item.id))) {
if (item.meta.itemStatus is CIStatus.RcvNew && (itemIds == null || itemIdsFromRange.contains(item.id))) {
val newItem = item.withStatus(CIStatus.RcvRead())
items[i] = newItem
if (newItem.meta.itemLive != true && newItem.meta.itemTimed?.ttl != null) {
@@ -663,7 +657,7 @@ object ChatModel {
}
markedReadIds.add(item.id)
markedRead++
if (range != null) {
if (itemIds != null) {
itemIdsFromRange.remove(item.id)
// already set all needed items as read, can finish the loop
if (itemIdsFromRange.isEmpty()) break
@@ -671,7 +665,7 @@ object ChatModel {
}
i--
}
chatItemsChangesListener?.read(if (range != null) markedReadIds else null, items)
chatItemsChangesListener?.read(if (itemIds != null) markedReadIds else null, items)
}
return markedRead
}
@@ -1968,6 +1962,12 @@ class ACIReaction(
val chatReaction: CIReaction
)
@Serializable
data class MemberReaction(
val groupMember: GroupMember,
val reactionTs: Instant
)
@Serializable
class CIReaction(
val chatDir: CIDirection,
@@ -211,6 +211,9 @@ class AppPreferences {
// Note that this situation can only happen if passphrase for the first database is incorrect because, otherwise, backend will re-create second database automatically
val newDatabaseInitialized = mkBoolPreference(SHARED_PREFS_NEW_DATABASE_INITIALIZED, false)
/** after importing new database, this flag will be set and unset only after importing app settings in [initChatController] */
val shouldImportAppSettings = mkBoolPreference(SHARED_PREFS_SHOULD_IMPORT_APP_SETTINGS, false)
val currentTheme = mkStrPreference(SHARED_PREFS_CURRENT_THEME, DefaultTheme.SYSTEM_THEME_NAME)
val systemDarkTheme = mkStrPreference(SHARED_PREFS_SYSTEM_DARK_THEME, DefaultTheme.SIMPLEX.themeName)
val currentThemeIds = mkMapPreference(SHARED_PREFS_CURRENT_THEME_IDs, mapOf(), encode = {
@@ -425,6 +428,7 @@ class AppPreferences {
private const val SHARED_PREFS_INITIALIZATION_VECTOR_SELF_DESTRUCT_PASSPHRASE = "InitializationVectorSelfDestructPassphrase"
private const val SHARED_PREFS_ENCRYPTION_STARTED_AT = "EncryptionStartedAt"
private const val SHARED_PREFS_NEW_DATABASE_INITIALIZED = "NewDatabaseInitialized"
private const val SHARED_PREFS_SHOULD_IMPORT_APP_SETTINGS = "ShouldImportAppSettings"
private const val SHARED_PREFS_CONFIRM_DB_UPGRADES = "ConfirmDBUpgrades"
private const val SHARED_PREFS_ONE_HAND_UI = "OneHandUI"
private const val SHARED_PREFS_SELF_DESTRUCT = "LocalAuthenticationSelfDestruct"
@@ -951,6 +955,14 @@ object ChatController {
return null
}
suspend fun apiGetReactionMembers(rh: Long?, groupId: Long, itemId: Long, reaction: MsgReaction): List<MemberReaction>? {
val userId = currentUserId("apiGetReactionMembers")
val r = sendCmd(rh, CC.ApiGetReactionMembers(userId, groupId, itemId, reaction))
if (r is CR.ReactionMembers) return r.memberReactions
Log.e(TAG, "apiGetReactionMembers bad response: ${r.responseType} ${r.details}")
return null
}
suspend fun apiDeleteChatItems(rh: Long?, type: ChatType, id: Long, itemIds: List<Long>, mode: CIDeleteMode): List<ChatItemDeletion>? {
val r = sendCmd(rh, CC.ApiDeleteChatItem(type, id, itemIds, mode))
if (r is CR.ChatItemsDeleted) return r.chatItemDeletions
@@ -1599,8 +1611,8 @@ object ChatController {
return null
}
suspend fun apiChatRead(rh: Long?, type: ChatType, id: Long, range: CC.ItemRange): Boolean {
val r = sendCmd(rh, CC.ApiChatRead(type, id, range))
suspend fun apiChatRead(rh: Long?, type: ChatType, id: Long): Boolean {
val r = sendCmd(rh, CC.ApiChatRead(type, id))
if (r is CR.CmdOk) return true
Log.e(TAG, "apiChatRead bad response: ${r.responseType} ${r.details}")
return false
@@ -3092,6 +3104,7 @@ sealed class CC {
class ApiDeleteChatItem(val type: ChatType, val id: Long, val itemIds: List<Long>, val mode: CIDeleteMode): CC()
class ApiDeleteMemberChatItem(val groupId: Long, val itemIds: List<Long>): CC()
class ApiChatItemReaction(val type: ChatType, val id: Long, val itemId: Long, val add: Boolean, val reaction: MsgReaction): CC()
class ApiGetReactionMembers(val userId: Long, val groupId: Long, val itemId: Long, val reaction: MsgReaction): CC()
class ApiPlanForwardChatItems(val fromChatType: ChatType, val fromChatId: Long, val chatItemIds: List<Long>): CC()
class ApiForwardChatItems(val toChatType: ChatType, val toChatId: Long, val fromChatType: ChatType, val fromChatId: Long, val itemIds: List<Long>, val ttl: Int?): CC()
class ApiNewGroup(val userId: Long, val incognito: Boolean, val groupProfile: GroupProfile): CC()
@@ -3172,7 +3185,7 @@ sealed class CC {
class ApiGetNetworkStatuses(): CC()
class ApiAcceptContact(val incognito: Boolean, val contactReqId: Long): CC()
class ApiRejectContact(val contactReqId: Long): CC()
class ApiChatRead(val type: ChatType, val id: Long, val range: ItemRange): CC()
class ApiChatRead(val type: ChatType, val id: Long): CC()
class ApiChatItemsRead(val type: ChatType, val id: Long, val itemIds: List<Long>): CC()
class ApiChatUnread(val type: ChatType, val id: Long, val unreadChat: Boolean): CC()
class ReceiveFile(val fileId: Long, val userApprovedRelays: Boolean, val encrypt: Boolean, val inline: Boolean?): CC()
@@ -3253,6 +3266,7 @@ sealed class CC {
is ApiDeleteChatItem -> "/_delete item ${chatRef(type, id)} ${itemIds.joinToString(",")} ${mode.deleteMode}"
is ApiDeleteMemberChatItem -> "/_delete member item #$groupId ${itemIds.joinToString(",")}"
is ApiChatItemReaction -> "/_reaction ${chatRef(type, id)} $itemId ${onOff(add)} ${json.encodeToString(reaction)}"
is ApiGetReactionMembers -> "/_reaction members $userId #$groupId $itemId ${json.encodeToString(reaction)}"
is ApiForwardChatItems -> {
val ttlStr = if (ttl != null) "$ttl" else "default"
"/_forward ${chatRef(toChatType, toChatId)} ${chatRef(fromChatType, fromChatId)} ${itemIds.joinToString(",")} ttl=${ttlStr}"
@@ -3338,7 +3352,7 @@ sealed class CC {
is ApiEndCall -> "/_call end @${contact.apiId}"
is ApiCallStatus -> "/_call status @${contact.apiId} ${callStatus.value}"
is ApiGetNetworkStatuses -> "/_network_statuses"
is ApiChatRead -> "/_read chat ${chatRef(type, id)} from=${range.from} to=${range.to}"
is ApiChatRead -> "/_read chat ${chatRef(type, id)}"
is ApiChatItemsRead -> "/_read chat items ${chatRef(type, id)} ${itemIds.joinToString(",")}"
is ApiChatUnread -> "/_unread chat ${chatRef(type, id)} ${onOff(unreadChat)}"
is ReceiveFile ->
@@ -3409,6 +3423,7 @@ sealed class CC {
is ApiDeleteChatItem -> "apiDeleteChatItem"
is ApiDeleteMemberChatItem -> "apiDeleteMemberChatItem"
is ApiChatItemReaction -> "apiChatItemReaction"
is ApiGetReactionMembers -> "apiGetReactionMembers"
is ApiForwardChatItems -> "apiForwardChatItems"
is ApiPlanForwardChatItems -> "apiPlanForwardChatItems"
is ApiNewGroup -> "apiNewGroup"
@@ -5429,6 +5444,7 @@ sealed class CR {
@Serializable @SerialName("chatItemUpdated") class ChatItemUpdated(val user: UserRef, val chatItem: AChatItem): CR()
@Serializable @SerialName("chatItemNotChanged") class ChatItemNotChanged(val user: UserRef, val chatItem: AChatItem): CR()
@Serializable @SerialName("chatItemReaction") class ChatItemReaction(val user: UserRef, val added: Boolean, val reaction: ACIReaction): CR()
@Serializable @SerialName("reactionMembers") class ReactionMembers(val user: UserRef, val memberReactions: List<MemberReaction>): CR()
@Serializable @SerialName("chatItemsDeleted") class ChatItemsDeleted(val user: UserRef, val chatItemDeletions: List<ChatItemDeletion>, val byUser: Boolean): CR()
@Serializable @SerialName("forwardPlan") class ForwardPlan(val user: UserRef, val itemsCount: Int, val chatItemIds: List<Long>, val forwardConfirmation: ForwardConfirmation? = null): CR()
// group events
@@ -5610,6 +5626,7 @@ sealed class CR {
is ChatItemUpdated -> "chatItemUpdated"
is ChatItemNotChanged -> "chatItemNotChanged"
is ChatItemReaction -> "chatItemReaction"
is ReactionMembers -> "reactionMembers"
is ChatItemsDeleted -> "chatItemsDeleted"
is ForwardPlan -> "forwardPlan"
is GroupCreated -> "groupCreated"
@@ -5783,6 +5800,7 @@ sealed class CR {
is ChatItemUpdated -> withUser(user, json.encodeToString(chatItem))
is ChatItemNotChanged -> withUser(user, json.encodeToString(chatItem))
is ChatItemReaction -> withUser(user, "added: $added\n${json.encodeToString(reaction)}")
is ReactionMembers -> withUser(user, "memberReactions: ${json.encodeToString(memberReactions)}")
is ChatItemsDeleted -> withUser(user, "${chatItemDeletions.map { (deletedChatItem, toChatItem) -> "deletedChatItem: ${json.encodeToString(deletedChatItem)}\ntoChatItem: ${json.encodeToString(toChatItem)}" }} \nbyUser: $byUser")
is ForwardPlan -> withUser(user, "itemsCount: $itemsCount\nchatItemIds: ${json.encodeToString(chatItemIds)}\nforwardConfirmation: ${json.encodeToString(forwardConfirmation)}")
is GroupCreated -> withUser(user, json.encodeToString(groupInfo))
@@ -6895,7 +6913,7 @@ data class AppSettings(
uiDarkColorScheme?.let { def.systemDarkTheme.set(it) }
uiCurrentThemeIds?.let { def.currentThemeIds.set(it) }
uiThemes?.let { def.themeOverrides.set(it.skipDuplicates()) }
oneHandUI?.let { def.oneHandUI.set(if (appPlatform.isAndroid) it else false) }
oneHandUI?.let { def.oneHandUI.set(it) }
}
companion object {
@@ -119,6 +119,15 @@ suspend fun initChatController(useKey: String? = null, confirmMigrations: Migrat
val user = chatController.apiGetActiveUser(null)
chatModel.currentUser.value = user
chatModel.conditions.value = chatController.getServerOperators(null) ?: ServerOperatorConditionsDetail.empty
if (appPrefs.shouldImportAppSettings.get()) {
try {
val appSettings = controller.apiGetAppSettings(AppSettings.current.prepareForExport())
appSettings.importIntoApp()
appPrefs.shouldImportAppSettings.set(false)
} catch (e: Exception) {
Log.e(TAG, "Error while importing app settings: " + e.stackTraceToString())
}
}
if (user == null) {
chatModel.controller.appPrefs.privacyDeliveryReceiptsSet.set(true)
chatModel.currentUser.value = null
@@ -26,7 +26,7 @@ expect val agentDatabaseFileName: String
/**
* This is used only for temporary storing db archive for export.
* Providing [tmpDir] instead crashes the app. Check db export before moving from this path to something else
* Providing [tmpDir] instead crashes the app on Android (only). Check db export before moving from this path to something else
* */
expect val databaseExportDir: File
@@ -117,14 +117,15 @@ fun CreateFirstProfile(chatModel: ChatModel, close: () -> Unit) {
ColumnWithScrollBar {
val displayName = rememberSaveable { mutableStateOf("") }
val focusRequester = remember { FocusRequester() }
Column(if (appPlatform.isAndroid) Modifier.fillMaxSize().padding(horizontal = DEFAULT_PADDING) else Modifier.widthIn(max = 600.dp).fillMaxHeight().padding(horizontal = DEFAULT_PADDING).align(Alignment.CenterHorizontally)) {
Column(if (appPlatform.isAndroid) Modifier.fillMaxSize().padding(start = DEFAULT_PADDING * 2, end = DEFAULT_PADDING * 2, bottom = DEFAULT_PADDING) else Modifier.widthIn(max = 600.dp).fillMaxHeight().padding(horizontal = DEFAULT_PADDING).align(Alignment.CenterHorizontally)) {
Box(Modifier.align(Alignment.CenterHorizontally)) {
AppBarTitle(stringResource(MR.strings.create_profile), bottomPadding = DEFAULT_PADDING, withPadding = false)
AppBarTitle(stringResource(MR.strings.create_your_profile), bottomPadding = DEFAULT_PADDING, withPadding = false)
}
ProfileNameField(displayName, stringResource(MR.strings.display_name), { it.trim() == mkValidName(it) }, focusRequester)
ReadableText(MR.strings.your_profile_is_stored_on_your_device, TextAlign.Center, padding = PaddingValues(), style = MaterialTheme.typography.body1.copy(color = MaterialTheme.colors.secondary))
Spacer(Modifier.height(DEFAULT_PADDING))
ReadableText(MR.strings.your_profile_is_stored_on_your_device, TextAlign.Start, padding = PaddingValues(), style = MaterialTheme.typography.body1.copy(color = MaterialTheme.colors.secondary))
ReadableText(MR.strings.profile_is_only_shared_with_your_contacts, TextAlign.Start, style = MaterialTheme.typography.body1.copy(color = MaterialTheme.colors.secondary))
ReadableText(MR.strings.profile_is_only_shared_with_your_contacts, TextAlign.Center, style = MaterialTheme.typography.body1.copy(color = MaterialTheme.colors.secondary))
Spacer(Modifier.height(DEFAULT_PADDING))
ProfileNameField(displayName, stringResource(MR.strings.display_name), { it.trim() == mkValidName(it) }, focusRequester)
}
Spacer(Modifier.fillMaxHeight().weight(1f))
Column(Modifier.widthIn(max = if (appPlatform.isAndroid) 450.dp else 1000.dp).align(Alignment.CenterHorizontally), horizontalAlignment = Alignment.CenterHorizontally) {
@@ -10,6 +10,16 @@ import kotlin.math.min
const val TRIM_KEEP_COUNT = 200
suspend fun apiLoadSingleMessage(
rhId: Long?,
chatType: ChatType,
apiId: Long,
itemId: Long
): ChatItem? = coroutineScope {
val (chat, _) = chatModel.controller.apiGetChat(rhId, chatType, apiId, ChatPagination.Around(itemId, 0), "") ?: return@coroutineScope null
chat.chatItems.firstOrNull()
}
suspend fun apiLoadMessages(
rhId: Long?,
chatType: ChatType,
@@ -490,19 +490,35 @@ fun ChatView(staleChatId: State<String?>, onComposed: suspend (chatId: String) -
},
addMembers = { groupInfo -> addGroupMembers(view = view, groupInfo = groupInfo, rhId = chatRh, close = { ModalManager.end.closeModals() }) },
openGroupLink = { groupInfo -> openGroupLink(view = view, groupInfo = groupInfo, rhId = chatRh, close = { ModalManager.end.closeModals() }) },
markRead = { range, unreadCountAfter ->
markItemsRead = { itemsIds ->
withBGApi {
withChats {
// It's important to call it on Main thread. Otherwise, composable crash occurs from time-to-time without useful stacktrace
withContext(Dispatchers.Main) {
markChatItemsRead(chatRh, chatInfo, range, unreadCountAfter)
markChatItemsRead(chatRh, chatInfo, itemsIds)
}
ntfManager.cancelNotificationsForChat(chatInfo.id)
chatModel.controller.apiChatItemsRead(
chatRh,
chatInfo.chatType,
chatInfo.apiId,
itemsIds
)
}
}
},
markChatRead = {
withBGApi {
withChats {
// It's important to call it on Main thread. Otherwise, composable crash occurs from time-to-time without useful stacktrace
withContext(Dispatchers.Main) {
markChatItemsRead(chatRh, chatInfo)
}
ntfManager.cancelNotificationsForChat(chatInfo.id)
chatModel.controller.apiChatRead(
chatRh,
chatInfo.chatType,
chatInfo.apiId,
range
chatInfo.apiId
)
}
}
@@ -602,7 +618,8 @@ fun ChatLayout(
showItemDetails: (ChatInfo, ChatItem) -> Unit,
addMembers: (GroupInfo) -> Unit,
openGroupLink: (GroupInfo) -> Unit,
markRead: (CC.ItemRange, unreadCountAfter: Int?) -> Unit,
markItemsRead: (List<Long>) -> Unit,
markChatRead: () -> Unit,
changeNtfsState: (Boolean, currentValue: MutableState<Boolean>) -> Unit,
onSearchValueChanged: (String) -> Unit,
onComposed: suspend (chatId: String) -> Unit,
@@ -649,7 +666,7 @@ fun ChatLayout(
useLinkPreviews, linkMode, selectedChatItems, showMemberInfo, loadMessages, deleteMessage, deleteMessages,
receiveFile, cancelFile, joinGroup, acceptCall, acceptFeature, openDirectChat, forwardItem,
updateContactStats, updateMemberStats, syncContactConnection, syncMemberConnection, findModelChat, findModelMember,
setReaction, showItemDetails, markRead, remember { { onComposed(it) } }, developerTools, showViaProxy,
setReaction, showItemDetails, markItemsRead, markChatRead, remember { { onComposed(it) } }, developerTools, showViaProxy,
)
}
}
@@ -937,7 +954,8 @@ fun BoxScope.ChatItemsList(
findModelMember: (String) -> GroupMember?,
setReaction: (ChatInfo, ChatItem, Boolean, MsgReaction) -> Unit,
showItemDetails: (ChatInfo, ChatItem) -> Unit,
markRead: (CC.ItemRange, unreadCountAfter: Int?) -> Unit,
markItemsRead: (List<Long>) -> Unit,
markChatRead: () -> Unit,
onComposed: suspend (chatId: String) -> Unit,
developerTools: Boolean,
showViaProxy: Boolean
@@ -979,10 +997,12 @@ fun BoxScope.ChatItemsList(
}
}
val remoteHostIdUpdated = rememberUpdatedState(remoteHostId)
val chatInfoUpdated = rememberUpdatedState(chatInfo)
val highlightedItems = remember { mutableStateOf(setOf<Long>()) }
val scope = rememberCoroutineScope()
val scrollToItem: (Long) -> Unit = remember { scrollToItem(loadingMoreItems, highlightedItems, chatInfoUpdated, maxHeight, scope, reversedChatItems, mergedItems, listState, loadMessages) }
val scrollToQuotedItemFromItem: (Long) -> Unit = remember { findQuotedItemFromItem(remoteHostIdUpdated, chatInfoUpdated, scope, scrollToItem) }
LoadLastItems(loadingMoreItems, remoteHostId, chatInfo)
SmallScrollOnNewMessage(listState, chatModel.chatItems)
@@ -1042,7 +1062,7 @@ fun BoxScope.ChatItemsList(
highlightedItems.value = setOf()
}
}
ChatItemView(remoteHostId, chatInfo, cItem, composeState, provider, useLinkPreviews = useLinkPreviews, linkMode = linkMode, revealed = revealed, highlighted = highlighted, range = range, fillMaxWidth = fillMaxWidth, selectedChatItems = selectedChatItems, selectChatItem = { selectUnselectChatItem(true, cItem, revealed, selectedChatItems) }, deleteMessage = deleteMessage, deleteMessages = deleteMessages, receiveFile = receiveFile, cancelFile = cancelFile, joinGroup = joinGroup, acceptCall = acceptCall, acceptFeature = acceptFeature, openDirectChat = openDirectChat, forwardItem = forwardItem, updateContactStats = updateContactStats, updateMemberStats = updateMemberStats, syncContactConnection = syncContactConnection, syncMemberConnection = syncMemberConnection, findModelChat = findModelChat, findModelMember = findModelMember, scrollToItem = scrollToItem, setReaction = setReaction, showItemDetails = showItemDetails, reveal = reveal, developerTools = developerTools, showViaProxy = showViaProxy, itemSeparation = itemSeparation, showTimestamp = itemSeparation.timestamp)
ChatItemView(remoteHostId, chatInfo, cItem, composeState, provider, useLinkPreviews = useLinkPreviews, linkMode = linkMode, revealed = revealed, highlighted = highlighted, range = range, fillMaxWidth = fillMaxWidth, selectedChatItems = selectedChatItems, selectChatItem = { selectUnselectChatItem(true, cItem, revealed, selectedChatItems) }, deleteMessage = deleteMessage, deleteMessages = deleteMessages, receiveFile = receiveFile, cancelFile = cancelFile, joinGroup = joinGroup, acceptCall = acceptCall, acceptFeature = acceptFeature, openDirectChat = openDirectChat, forwardItem = forwardItem, updateContactStats = updateContactStats, updateMemberStats = updateMemberStats, syncContactConnection = syncContactConnection, syncMemberConnection = syncMemberConnection, findModelChat = findModelChat, findModelMember = findModelMember, scrollToItem = scrollToItem, scrollToQuotedItemFromItem = scrollToQuotedItemFromItem, setReaction = setReaction, showItemDetails = showItemDetails, reveal = reveal, showMemberInfo = showMemberInfo, developerTools = developerTools, showViaProxy = showViaProxy, itemSeparation = itemSeparation, showTimestamp = itemSeparation.timestamp)
}
}
@@ -1282,15 +1302,15 @@ fun BoxScope.ChatItemsList(
DateSeparator(last.meta.itemTs)
}
if (item.isRcvNew) {
val (itemIdStart, itemIdEnd) = when (merged) {
is MergedItem.Single -> merged.item.item.id to merged.item.item.id
is MergedItem.Grouped -> merged.items.last().item.id to merged.items.first().item.id
val itemIds = when (merged) {
is MergedItem.Single -> listOf(merged.item.item.id)
is MergedItem.Grouped -> merged.items.map { it.item.id }
}
MarkItemsReadAfterDelay(keyForItem(item), itemIdStart, itemIdEnd, finishedInitialComposition, chatInfo.id, listState, markRead)
MarkItemsReadAfterDelay(keyForItem(item), itemIds, finishedInitialComposition, chatInfo.id, listState, markItemsRead)
}
}
}
FloatingButtons(loadingMoreItems, mergedItems, unreadCount, maxHeight, composeViewHeight, remoteHostId, chatInfo, searchValue, markRead, listState)
FloatingButtons(loadingMoreItems, mergedItems, unreadCount, maxHeight, composeViewHeight, remoteHostId, chatInfo, searchValue, markChatRead, listState)
FloatingDate(Modifier.padding(top = 10.dp + topPaddingToContent()).align(Alignment.TopCenter), mergedItems, listState)
LaunchedEffect(Unit) {
@@ -1383,7 +1403,7 @@ fun BoxScope.FloatingButtons(
remoteHostId: Long?,
chatInfo: ChatInfo,
searchValue: State<String>,
markRead: (CC.ItemRange, unreadCountAfter: Int?) -> Unit,
markChatRead: () -> Unit,
listState: State<LazyListState>
) {
val scope = rememberCoroutineScope()
@@ -1451,12 +1471,7 @@ fun BoxScope.FloatingButtons(
generalGetString(MR.strings.mark_read),
painterResource(MR.images.ic_check),
onClick = {
val chat = chatModel.chats.value.firstOrNull { it.remoteHostId == remoteHostId && it.id == chatInfo.id } ?: return@ItemAction
val minUnreadItemId = chat.chatStats.minUnreadItemId
markRead(
CC.ItemRange(minUnreadItemId, chat.chatItems.lastOrNull()?.id ?: return@ItemAction),
0
)
markChatRead()
showDropDown.value = false
})
}
@@ -1777,12 +1792,11 @@ private fun DateSeparator(date: Instant) {
@Composable
private fun MarkItemsReadAfterDelay(
itemKey: String,
itemIdStart: Long,
itemIdEnd: Long,
itemIds: List<Long>,
finishedInitialComposition: State<Boolean>,
chatId: ChatId,
listState: State<LazyListState>,
markRead: (CC.ItemRange, unreadCountAfter: Int?) -> Unit
markItemsRead: (List<Long>) -> Unit
) {
// items can be "visible" in terms of LazyColumn but hidden behind compose view/appBar. So don't count such item as visible and not mark read
val itemIsPartiallyAboveCompose = remember { derivedStateOf {
@@ -1793,11 +1807,11 @@ private fun MarkItemsReadAfterDelay(
false
}
} }
LaunchedEffect(itemIsPartiallyAboveCompose.value, itemIdStart, itemIdEnd, finishedInitialComposition.value, chatId) {
LaunchedEffect(itemIsPartiallyAboveCompose.value, itemIds, finishedInitialComposition.value, chatId) {
if (chatId != ChatModel.chatId.value || !itemIsPartiallyAboveCompose.value || !finishedInitialComposition.value) return@LaunchedEffect
delay(600L)
markRead(CC.ItemRange(itemIdStart, itemIdEnd), null)
markItemsRead(itemIds)
}
}
@@ -1867,6 +1881,27 @@ private fun scrollToItem(
}
}
private fun findQuotedItemFromItem(
rhId: State<Long?>,
chatInfo: State<ChatInfo>,
scope: CoroutineScope,
scrollToItem: (Long) -> Unit
): (Long) -> Unit = { itemId: Long ->
scope.launch(Dispatchers.Default) {
val item = apiLoadSingleMessage(rhId.value, chatInfo.value.chatType, chatInfo.value.apiId, itemId)
if (item != null) {
withChats {
updateChatItem(chatInfo.value, item)
}
if (item.quotedItem?.itemId != null) {
scrollToItem(item.quotedItem.itemId)
} else {
showQuotedItemDoesNotExistAlert()
}
}
}
}
val chatViewScrollState = MutableStateFlow(false)
fun addGroupMembers(groupInfo: GroupInfo, rhId: Long?, view: Any? = null, close: (() -> Unit)? = null) {
@@ -2383,7 +2418,8 @@ fun PreviewChatLayout() {
showItemDetails = { _, _ -> },
addMembers = { _ -> },
openGroupLink = {},
markRead = { _, _ -> },
markItemsRead = { _ -> },
markChatRead = {},
changeNtfsState = { _, _ -> },
onSearchValueChanged = {},
onComposed = {},
@@ -2455,7 +2491,8 @@ fun PreviewGroupChatLayout() {
showItemDetails = { _, _ -> },
addMembers = { _ -> },
openGroupLink = {},
markRead = { _, _ -> },
markItemsRead = { _ -> },
markChatRead = {},
changeNtfsState = { _, _ -> },
onSearchValueChanged = {},
onComposed = {},
@@ -20,6 +20,7 @@ import androidx.compose.ui.text.*
import dev.icerock.moko.resources.compose.painterResource
import dev.icerock.moko.resources.compose.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.*
import chat.simplex.common.model.*
import chat.simplex.common.model.ChatModel.controller
@@ -28,6 +29,7 @@ import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.chat.*
import chat.simplex.common.views.helpers.*
import chat.simplex.res.MR
import kotlinx.coroutines.launch
import kotlinx.datetime.Clock
import kotlin.math.*
@@ -71,6 +73,7 @@ fun ChatItemView(
joinGroup: (Long, () -> Unit) -> Unit,
acceptCall: (Contact) -> Unit,
scrollToItem: (Long) -> Unit,
scrollToQuotedItemFromItem: (Long) -> Unit,
acceptFeature: (Contact, ChatFeature, Int?) -> Unit,
openDirectChat: (Long) -> Unit,
forwardItem: (ChatInfo, ChatItem) -> Unit,
@@ -83,6 +86,7 @@ fun ChatItemView(
setReaction: (ChatInfo, ChatItem, Boolean, MsgReaction) -> Unit,
showItemDetails: (ChatInfo, ChatItem) -> Unit,
reveal: (Boolean) -> Unit,
showMemberInfo: (GroupInfo, GroupMember) -> Unit,
developerTools: Boolean,
showViaProxy: Boolean,
showTimestamp: Boolean,
@@ -115,14 +119,54 @@ fun ChatItemView(
fun ChatItemReactions() {
Row(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.chatItemOffset(cItem, itemSeparation.largeGap, inverted = true, revealed = true)) {
cItem.reactions.forEach { r ->
val showReactionMenu = remember { mutableStateOf(false) }
val reactionMembers = remember { mutableStateOf(emptyList<MemberReaction>()) }
var modifier = Modifier.padding(horizontal = 5.dp, vertical = 2.dp).clip(RoundedCornerShape(8.dp))
if (cInfo.featureEnabled(ChatFeature.Reactions) && (cItem.allowAddReaction || r.userReacted)) {
modifier = modifier.clickable {
setReaction(cInfo, cItem, !r.userReacted, r.reaction)
}
if (cInfo.featureEnabled(ChatFeature.Reactions)) {
modifier = modifier
.combinedClickable(
onClick = {
if (cItem.allowAddReaction || r.userReacted) {
setReaction(cInfo, cItem, !r.userReacted, r.reaction)
}
},
onLongClick = {
if (cInfo is ChatInfo.Group) {
withBGApi {
try {
val members = controller.apiGetReactionMembers(rhId, cInfo.groupInfo.groupId, cItem.id, r.reaction)
if (members != null) {
showReactionMenu.value = true
reactionMembers.value = members
}
} catch (e: Exception) {
Log.d(TAG, "hatItemView ChatItemReactions onLongClick: unexpected exception: ${e.stackTraceToString()}")
}
}
}
}
)
}
Row(modifier.padding(2.dp), verticalAlignment = Alignment.CenterVertically) {
ReactionIcon(r.reaction.text, fontSize = 12.sp)
DefaultDropdownMenu(showMenu = showReactionMenu) {
reactionMembers.value.forEach { m ->
ItemAction(
text = m.groupMember.displayName,
composable = { ProfileImage(44.dp, m.groupMember.image) },
onClick = {
if (cInfo is ChatInfo.Group && cInfo.groupInfo.membership.groupMemberId != m.groupMember.groupMemberId) {
showMemberInfo(cInfo.groupInfo, m.groupMember)
showReactionMenu.value = false
} else {
showReactionMenu.value = false
}
},
lineLimit = 1
)
}
}
if (r.totalReacted > 1) {
Spacer(Modifier.width(4.dp))
Text(
@@ -155,7 +199,7 @@ fun ChatItemView(
) {
@Composable
fun framedItemView() {
FramedItemView(cInfo, cItem, uriHandler, imageProvider, linkMode = linkMode, showViaProxy = showViaProxy, showMenu, showTimestamp = showTimestamp, tailVisible = itemSeparation.largeGap, receiveFile, onLinkLongClick, scrollToItem)
FramedItemView(cInfo, cItem, uriHandler, imageProvider, linkMode = linkMode, showViaProxy = showViaProxy, showMenu, showTimestamp = showTimestamp, tailVisible = itemSeparation.largeGap, receiveFile, onLinkLongClick, scrollToItem, scrollToQuotedItemFromItem)
}
fun deleteMessageQuestionText(): String {
@@ -780,6 +824,34 @@ fun ItemAction(text: String, icon: Painter, color: Color = Color.Unspecified, on
}
}
@Composable
fun ItemAction(
text: String,
composable: @Composable () -> Unit,
color: Color = Color.Unspecified,
onClick: () -> Unit,
lineLimit: Int = Int.MAX_VALUE
) {
val finalColor = if (color == Color.Unspecified) {
MenuTextColor
} else color
DropdownMenuItem(onClick, contentPadding = PaddingValues(horizontal = DEFAULT_PADDING * 1.5f)) {
Row(verticalAlignment = Alignment.CenterVertically) {
Text(
text,
modifier = Modifier
.fillMaxWidth()
.weight(1F)
.padding(end = 15.dp),
color = finalColor,
maxLines = lineLimit,
overflow = TextOverflow.Ellipsis
)
composable()
}
}
}
@Composable
fun ItemAction(text: String, icon: ImageVector, onClick: () -> Unit, color: Color = Color.Unspecified) {
val finalColor = if (color == Color.Unspecified) {
@@ -1087,6 +1159,7 @@ fun PreviewChatItemView(
joinGroup = { _, _ -> },
acceptCall = { _ -> },
scrollToItem = {},
scrollToQuotedItemFromItem = {},
acceptFeature = { _, _, _ -> },
openDirectChat = { _ -> },
forwardItem = { _, _ -> },
@@ -1099,6 +1172,7 @@ fun PreviewChatItemView(
setReaction = { _, _, _, _ -> },
showItemDetails = { _, _ -> },
reveal = {},
showMemberInfo = { _, _ ->},
developerTools = false,
showViaProxy = false,
showTimestamp = true,
@@ -1130,6 +1204,7 @@ fun PreviewChatItemViewDeletedContent() {
joinGroup = { _, _ -> },
acceptCall = { _ -> },
scrollToItem = {},
scrollToQuotedItemFromItem = {},
acceptFeature = { _, _, _ -> },
openDirectChat = { _ -> },
forwardItem = { _, _ -> },
@@ -1142,6 +1217,7 @@ fun PreviewChatItemViewDeletedContent() {
setReaction = { _, _, _, _ -> },
showItemDetails = { _, _ -> },
reveal = {},
showMemberInfo = { _, _ ->},
developerTools = false,
showViaProxy = false,
preview = true,
@@ -39,6 +39,7 @@ fun FramedItemView(
receiveFile: (Long) -> Unit,
onLinkLongClick: (link: String) -> Unit = {},
scrollToItem: (Long) -> Unit = {},
scrollToQuotedItemFromItem: (Long) -> Unit = {},
) {
val sent = ci.chatDir.sent
val chatTTL = chatInfo.timedMessagesTTL
@@ -130,11 +131,10 @@ fun FramedItemView(
.combinedClickable(
onLongClick = { showMenu.value = true },
onClick = {
val itemId = qi.itemId
if (itemId != null) {
scrollToItem(itemId)
if (qi.itemId != null) {
scrollToItem(qi.itemId)
} else {
showQuotedItemDoesNotExistAlert()
scrollToQuotedItemFromItem(ci.id)
}
}
)
@@ -537,15 +537,13 @@ fun markChatRead(c: Chat, chatModel: ChatModel) {
var chat = c
withApi {
if (chat.chatStats.unreadCount > 0) {
val minUnreadItemId = chat.chatStats.minUnreadItemId
withChats {
markChatItemsRead(chat.remoteHostId, chat.chatInfo)
}
chatModel.controller.apiChatRead(
chat.remoteHostId,
chat.chatInfo.chatType,
chat.chatInfo.apiId,
CC.ItemRange(minUnreadItemId, chat.chatItems.last().id)
chat.chatInfo.apiId
)
chat = chatModel.getChat(chat.id) ?: return@withApi
}
@@ -1,108 +0,0 @@
package chat.simplex.common.views.database
import SectionBottomSpacer
import SectionTextFooter
import SectionView
import androidx.compose.desktop.ui.tooling.preview.Preview
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import dev.icerock.moko.resources.compose.painterResource
import dev.icerock.moko.resources.compose.stringResource
import chat.simplex.common.model.ChatModel
import chat.simplex.common.platform.*
import chat.simplex.common.ui.theme.SimpleXTheme
import chat.simplex.common.views.helpers.*
import chat.simplex.common.views.usersettings.*
import chat.simplex.res.MR
import kotlinx.datetime.*
import java.io.File
import java.net.URI
import java.text.SimpleDateFormat
import java.util.*
@Composable
fun ChatArchiveView(m: ChatModel, title: String, archiveName: String, archiveTime: Instant) {
val archivePath = filesDir.absolutePath + File.separator + archiveName
val saveArchiveLauncher = rememberFileChooserLauncher(false) { to: URI? ->
if (to != null) {
copyFileToFile(File(archivePath), to) {}
}
}
ChatArchiveLayout(
title,
archiveTime,
saveArchive = { withLongRunningApi { saveArchiveLauncher.launch(archivePath.substringAfterLast(File.separator)) }},
deleteArchiveAlert = { deleteArchiveAlert(m, archivePath) }
)
}
@Composable
fun ChatArchiveLayout(
title: String,
archiveTime: Instant,
saveArchive: () -> Unit,
deleteArchiveAlert: () -> Unit
) {
ColumnWithScrollBar {
AppBarTitle(title)
SectionView(stringResource(MR.strings.chat_archive_section)) {
SettingsActionItem(
painterResource(MR.images.ic_ios_share),
stringResource(MR.strings.save_archive),
saveArchive,
textColor = MaterialTheme.colors.primary,
iconColor = MaterialTheme.colors.primary,
)
SettingsActionItem(
painterResource(MR.images.ic_delete),
stringResource(MR.strings.delete_archive),
deleteArchiveAlert,
textColor = Color.Red,
iconColor = Color.Red,
)
}
val archiveTs = SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z", Locale.US).format(Date.from(archiveTime.toJavaInstant()))
SectionTextFooter(
String.format(generalGetString(MR.strings.archive_created_on_ts), archiveTs)
)
SectionBottomSpacer()
}
}
private fun deleteArchiveAlert(m: ChatModel, archivePath: String) {
AlertManager.shared.showAlertDialog(
title = generalGetString(MR.strings.delete_chat_archive_question),
confirmText = generalGetString(MR.strings.delete_verb),
onConfirm = {
val fileDeleted = File(archivePath).delete()
if (fileDeleted) {
m.controller.appPrefs.chatArchiveName.set(null)
m.controller.appPrefs.chatArchiveTime.set(null)
ModalManager.start.closeModal()
} else {
Log.e(TAG, "deleteArchiveAlert delete() error")
}
},
destructive = true,
)
}
@Preview/*(
uiMode = Configuration.UI_MODE_NIGHT_YES,
showBackground = true,
name = "Dark Mode"
)*/
@Composable
fun PreviewChatArchiveLayout() {
SimpleXTheme {
ChatArchiveLayout(
"New database archive",
archiveTime = Clock.System.now(),
saveArchive = {},
deleteArchiveAlert = {}
)
}
}
@@ -48,6 +48,7 @@ fun DatabaseEncryptionView(m: ChatModel, migration: Boolean) {
val currentKey = remember { mutableStateOf(if (initialRandomDBPassphrase.value) DatabaseUtils.ksDatabasePassword.get() ?: "" else "") }
val newKey = rememberSaveable { mutableStateOf("") }
val confirmNewKey = rememberSaveable { mutableStateOf("") }
val chatLastStart = remember { mutableStateOf(appPrefs.chatLastStart.get()) }
Box(
Modifier.fillMaxSize(),
@@ -63,8 +64,9 @@ fun DatabaseEncryptionView(m: ChatModel, migration: Boolean) {
progressIndicator,
migration,
onConfirmEncrypt = {
withLongRunningApi {
encryptDatabase(
// it will try to stop and start the chat in case of: non-migration && successful encryption. In migration the chat will remain stopped
stopChatRunBlockStartChat(migration, chatLastStart, progressIndicator, ) {
val success = encryptDatabase(
currentKey = currentKey,
newKey = newKey,
confirmNewKey = confirmNewKey,
@@ -74,6 +76,7 @@ fun DatabaseEncryptionView(m: ChatModel, migration: Boolean) {
progressIndicator = progressIndicator,
migration = migration
)
success && !migration
}
}
)
@@ -306,7 +309,6 @@ private fun operationEnded(m: ChatModel, progressIndicator: MutableState<Boolean
alert.invoke()
}
@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun PassphraseField(
key: MutableState<String>,
@@ -26,7 +26,6 @@ import chat.simplex.common.views.helpers.*
import chat.simplex.common.views.usersettings.*
import chat.simplex.common.platform.*
import chat.simplex.res.MR
import kotlinx.coroutines.sync.withLock
import kotlinx.datetime.*
import java.io.*
import java.net.URI
@@ -36,18 +35,14 @@ import java.util.*
import kotlin.collections.ArrayList
@Composable
fun DatabaseView(
m: ChatModel,
showSettingsModal: (@Composable (ChatModel) -> Unit) -> (() -> Unit)
) {
val currentRemoteHost by remember { chatModel.currentRemoteHost }
fun DatabaseView() {
val m = chatModel
val progressIndicator = remember { mutableStateOf(false) }
val prefs = m.controller.appPrefs
val useKeychain = remember { mutableStateOf(prefs.storeDBPassphrase.get()) }
val chatArchiveName = remember { mutableStateOf(prefs.chatArchiveName.get()) }
val chatArchiveTime = remember { mutableStateOf(prefs.chatArchiveTime.get()) }
val chatLastStart = remember { mutableStateOf(prefs.chatLastStart.get()) }
val chatArchiveFile = remember { mutableStateOf<String?>(null) }
val stopped = remember { m.chatRunning }.value == false
val saveArchiveLauncher = rememberFileChooserLauncher(false) { to: URI? ->
val file = chatArchiveFile.value
if (file != null && to != null) {
@@ -59,8 +54,11 @@ fun DatabaseView(
val appFilesCountAndSize = remember { mutableStateOf(directoryFileCountAndSize(appFilesDir.absolutePath)) }
val importArchiveLauncher = rememberFileChooserLauncher(true) { to: URI? ->
if (to != null) {
importArchiveAlert(m, to, appFilesCountAndSize, progressIndicator) {
startChat(m, chatLastStart, m.chatDbChanged)
importArchiveAlert {
stopChatRunBlockStartChat(stopped, chatLastStart, progressIndicator) {
importArchive(to, appFilesCountAndSize, progressIndicator)
true
}
}
}
}
@@ -71,27 +69,40 @@ fun DatabaseView(
val user = m.currentUser.value
val rhId = user?.remoteHostId
DatabaseLayout(
currentRemoteHost = currentRemoteHost,
progressIndicator.value,
remember { m.chatRunning }.value != false,
m.chatDbChanged.value,
stopped,
useKeychain.value,
m.chatDbEncrypted.value,
m.controller.appPrefs.storeDBPassphrase.state.value,
m.controller.appPrefs.initialRandomDBPassphrase,
importArchiveLauncher,
chatArchiveName,
chatArchiveTime,
chatLastStart,
appFilesCountAndSize,
chatItemTTL,
user,
m.users,
startChat = { startChat(m, chatLastStart, m.chatDbChanged, progressIndicator) },
stopChatAlert = { stopChatAlert(m, progressIndicator) },
exportArchive = { exportArchive(m, progressIndicator, chatArchiveName, chatArchiveTime, chatArchiveFile, saveArchiveLauncher) },
deleteChatAlert = { deleteChatAlert(m, progressIndicator) },
deleteAppFilesAndMedia = { deleteFilesAndMediaAlert(appFilesCountAndSize) },
exportArchive = {
stopChatRunBlockStartChat(stopped, chatLastStart, progressIndicator) {
exportArchive(m, progressIndicator, chatArchiveFile, saveArchiveLauncher)
}
},
deleteChatAlert = {
deleteChatAlert {
stopChatRunBlockStartChat(stopped, chatLastStart, progressIndicator) {
deleteChat(m, progressIndicator)
true
}
}
},
deleteAppFilesAndMedia = {
deleteFilesAndMediaAlert {
stopChatRunBlockStartChat(stopped, chatLastStart, progressIndicator) {
deleteFiles(appFilesCountAndSize)
true
}
}
},
onChatItemTTLSelected = {
val oldValue = chatItemTTL.value
chatItemTTL.value = it
@@ -101,7 +112,6 @@ fun DatabaseView(
setCiTTL(m, rhId, chatItemTTL, progressIndicator, appFilesCountAndSize)
}
},
showSettingsModal,
disconnectAllHosts = {
val connected = chatModel.remoteHosts.filter { it.sessionState is RemoteHostSessionState.Connected }
connected.forEachIndexed { index, h ->
@@ -128,18 +138,13 @@ fun DatabaseView(
@Composable
fun DatabaseLayout(
currentRemoteHost: RemoteHostInfo?,
progressIndicator: Boolean,
runChat: Boolean,
chatDbChanged: Boolean,
stopped: Boolean,
useKeyChain: Boolean,
chatDbEncrypted: Boolean?,
passphraseSaved: Boolean,
initialRandomDBPassphrase: SharedPreference<Boolean>,
importArchiveLauncher: FileChooserLauncher,
chatArchiveName: MutableState<String?>,
chatArchiveTime: MutableState<Instant?>,
chatLastStart: MutableState<Instant?>,
appFilesCountAndSize: MutableState<Pair<Int, Long>>,
chatItemTTL: MutableState<ChatItemTTL>,
currentUser: User?,
@@ -150,11 +155,9 @@ fun DatabaseLayout(
deleteChatAlert: () -> Unit,
deleteAppFilesAndMedia: () -> Unit,
onChatItemTTLSelected: (ChatItemTTL) -> Unit,
showSettingsModal: (@Composable (ChatModel) -> Unit) -> (() -> Unit),
disconnectAllHosts: () -> Unit,
) {
val stopped = !runChat
val operationsDisabled = (!stopped || progressIndicator) && !chatModel.desktopNoUserNoRemote
val operationsDisabled = progressIndicator && !chatModel.desktopNoUserNoRemote
ColumnWithScrollBar {
AppBarTitle(stringResource(MR.strings.your_chat_database))
@@ -178,13 +181,16 @@ fun DatabaseLayout(
}
val toggleEnabled = remember { chatModel.remoteHosts }.none { it.sessionState is RemoteHostSessionState.Connected }
if (chatModel.localUserCreated.value == true) {
// still show the toggle in case database was stopped when the user opened this screen because it can be in the following situations:
// - database was stopped after migration and the app relaunched
// - something wrong happened with database operations and the database couldn't be launched when it should
SectionView(stringResource(MR.strings.run_chat_section)) {
if (!toggleEnabled) {
SectionItemView(disconnectAllHosts) {
Text(generalGetString(MR.strings.disconnect_remote_hosts), Modifier.fillMaxWidth(), color = WarningOrange)
}
}
RunChatSetting(runChat, stopped, toggleEnabled && !progressIndicator, startChat, stopChatAlert)
RunChatSetting(stopped, toggleEnabled && !progressIndicator, startChat, stopChatAlert)
}
SectionTextFooter(
if (stopped) {
@@ -207,7 +213,7 @@ fun DatabaseLayout(
if (unencrypted) painterResource(MR.images.ic_lock_open_right) else if (useKeyChain) painterResource(MR.images.ic_vpn_key_filled)
else painterResource(MR.images.ic_lock),
stringResource(MR.strings.database_passphrase),
click = showSettingsModal() { DatabaseEncryptionView(it, false) },
click = { ModalManager.start.showModal { DatabaseEncryptionView(chatModel, false) } },
iconColor = if (unencrypted || (appPlatform.isDesktop && passphraseSaved)) WarningOrange else MaterialTheme.colors.secondary,
disabled = operationsDisabled
)
@@ -225,6 +231,9 @@ fun DatabaseLayout(
click = {
if (initialRandomDBPassphrase.get()) {
exportProhibitedAlert()
ModalManager.start.showModal {
DatabaseEncryptionView(chatModel, false)
}
} else {
exportArchive()
}
@@ -241,18 +250,6 @@ fun DatabaseLayout(
iconColor = Color.Red,
disabled = operationsDisabled
)
val chatArchiveNameVal = chatArchiveName.value
val chatArchiveTimeVal = chatArchiveTime.value
val chatLastStartVal = chatLastStart.value
if (chatArchiveNameVal != null && chatArchiveTimeVal != null && chatLastStartVal != null) {
val title = chatArchiveTitle(chatArchiveTimeVal, chatLastStartVal)
SettingsActionItem(
painterResource(MR.images.ic_inventory_2),
title,
click = showSettingsModal { ChatArchiveView(it, title, chatArchiveNameVal, chatArchiveTimeVal) },
disabled = operationsDisabled
)
}
SettingsActionItem(
painterResource(MR.images.ic_delete_forever),
stringResource(MR.strings.delete_database),
@@ -333,7 +330,6 @@ private fun TtlOptions(current: State<ChatItemTTL>, enabled: State<Boolean>, onS
@Composable
fun RunChatSetting(
runChat: Boolean,
stopped: Boolean,
enabled: Boolean,
startChat: () -> Unit,
@@ -346,7 +342,7 @@ fun RunChatSetting(
iconColor = if (stopped) Color.Red else MaterialTheme.colors.primary,
) {
DefaultSwitch(
checked = runChat,
checked = !stopped,
onCheckedChange = { runChatSwitch ->
if (runChatSwitch) {
startChat()
@@ -359,12 +355,12 @@ fun RunChatSetting(
}
}
@Composable
fun chatArchiveTitle(chatArchiveTime: Instant, chatLastStart: Instant): String {
return stringResource(if (chatArchiveTime < chatLastStart) MR.strings.old_database_archive else MR.strings.new_database_archive)
}
fun startChat(m: ChatModel, chatLastStart: MutableState<Instant?>, chatDbChanged: MutableState<Boolean>, progressIndicator: MutableState<Boolean>? = null) {
fun startChat(
m: ChatModel,
chatLastStart: MutableState<Instant?>,
chatDbChanged: MutableState<Boolean>,
progressIndicator: MutableState<Boolean>? = null
) {
withLongRunningApi {
try {
progressIndicator?.value = true
@@ -469,6 +465,40 @@ suspend fun stopChatAsync(m: ChatModel) {
controller.appPrefs.chatStopped.set(true)
}
fun stopChatRunBlockStartChat(
stopped: Boolean,
chatLastStart: MutableState<Instant?>,
progressIndicator: MutableState<Boolean>,
block: suspend () -> Boolean
) {
// if the chat was running, the sequence is: stop chat, run block, start chat.
// Otherwise, just run block and do nothing - the toggle will be visible anyway and the user can start the chat or not
if (stopped) {
withLongRunningApi {
try {
block()
} catch (e: Throwable) {
Log.e(TAG, e.stackTraceToString())
}
}
} else {
authStopChat(chatModel, progressIndicator) {
withLongRunningApi {
// if it throws, let's start chat again anyway
val canStart = try {
block()
} catch (e: Throwable) {
Log.e(TAG, e.stackTraceToString())
true
}
if (canStart) {
startChat(chatModel, chatLastStart, chatModel.chatDbChanged, progressIndicator)
}
}
}
}
}
suspend fun deleteChatAsync(m: ChatModel) {
m.controller.apiDeleteStorage()
DatabaseUtils.ksDatabasePassword.remove()
@@ -511,47 +541,42 @@ fun deleteChatDatabaseFilesAndState() {
ntfManager.cancelAllNotifications()
}
private fun exportArchive(
private suspend fun exportArchive(
m: ChatModel,
progressIndicator: MutableState<Boolean>,
chatArchiveName: MutableState<String?>,
chatArchiveTime: MutableState<Instant?>,
chatArchiveFile: MutableState<String?>,
saveArchiveLauncher: FileChooserLauncher
) {
): Boolean {
progressIndicator.value = true
withLongRunningApi {
try {
val (archiveFile, archiveErrors) = exportChatArchive(m, null, chatArchiveName, chatArchiveTime, chatArchiveFile)
chatArchiveFile.value = archiveFile
if (archiveErrors.isEmpty()) {
saveArchiveLauncher.launch(archiveFile.substringAfterLast(File.separator))
} else {
showArchiveExportedWithErrorsAlert(generalGetString(MR.strings.chat_database_exported_save), archiveErrors) {
withLongRunningApi {
saveArchiveLauncher.launch(archiveFile.substringAfterLast(File.separator))
}
try {
val (archiveFile, archiveErrors) = exportChatArchive(m, null, chatArchiveFile)
chatArchiveFile.value = archiveFile
if (archiveErrors.isEmpty()) {
saveArchiveLauncher.launch(archiveFile.substringAfterLast(File.separator))
} else {
showArchiveExportedWithErrorsAlert(generalGetString(MR.strings.chat_database_exported_save), archiveErrors) {
withLongRunningApi {
saveArchiveLauncher.launch(archiveFile.substringAfterLast(File.separator))
}
}
progressIndicator.value = false
} catch (e: Error) {
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.error_exporting_chat_database), e.toString())
progressIndicator.value = false
}
progressIndicator.value = false
} catch (e: Throwable) {
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.error_exporting_chat_database), e.toString())
progressIndicator.value = false
}
return false
}
suspend fun exportChatArchive(
m: ChatModel,
storagePath: File?,
chatArchiveName: MutableState<String?>,
chatArchiveTime: MutableState<Instant?>,
chatArchiveFile: MutableState<String?>
): Pair<String, List<ArchiveError>> {
val archiveTime = Clock.System.now()
val ts = SimpleDateFormat("yyyy-MM-dd'T'HHmmss", Locale.US).format(Date.from(archiveTime.toJavaInstant()))
val archiveName = "simplex-chat.$ts.zip"
val archivePath = "${(storagePath ?: filesDir).absolutePath}${File.separator}$archiveName"
val archivePath = "${(storagePath ?: databaseExportDir).absolutePath}${File.separator}$archiveName"
val config = ArchiveConfig(archivePath, parentTempDirectory = databaseExportDir.toString())
// Settings should be saved before changing a passphrase, otherwise the database needs to be migrated first
if (!m.chatDbChanged.value) {
@@ -560,42 +585,37 @@ suspend fun exportChatArchive(
wallpapersDir.mkdirs()
val archiveErrors = m.controller.apiExportArchive(config)
if (storagePath == null) {
deleteOldArchive(m)
deleteOldChatArchive()
m.controller.appPrefs.chatArchiveName.set(archiveName)
m.controller.appPrefs.chatArchiveTime.set(archiveTime)
}
chatArchiveName.value = archiveName
chatArchiveTime.value = archiveTime
chatArchiveFile.value = archivePath
return archivePath to archiveErrors
}
private fun deleteOldArchive(m: ChatModel) {
val chatArchiveName = m.controller.appPrefs.chatArchiveName.get()
// Deprecated. Remove in the end of 2025. All unused archives should be deleted for the most users til then.
/** Remove [AppPreferences.chatArchiveName] and [AppPreferences.chatArchiveTime] as well */
fun deleteOldChatArchive() {
val chatArchiveName = chatModel.controller.appPrefs.chatArchiveName.get()
if (chatArchiveName != null) {
val file = File("${filesDir.absolutePath}${File.separator}$chatArchiveName")
val fileDeleted = file.delete()
if (fileDeleted) {
m.controller.appPrefs.chatArchiveName.set(null)
m.controller.appPrefs.chatArchiveTime.set(null)
val file1 = File("${filesDir.absolutePath}${File.separator}$chatArchiveName")
val file2 = File("${databaseExportDir.absolutePath}${File.separator}$chatArchiveName")
val fileDeleted = file1.delete() || file2.delete()
if (fileDeleted || (!file1.exists() && !file2.exists())) {
chatModel.controller.appPrefs.chatArchiveName.set(null)
chatModel.controller.appPrefs.chatArchiveTime.set(null)
} else {
Log.e(TAG, "deleteOldArchive file.delete() error")
}
}
}
private fun importArchiveAlert(
m: ChatModel,
importedArchiveURI: URI,
appFilesCountAndSize: MutableState<Pair<Int, Long>>,
progressIndicator: MutableState<Boolean>,
startChat: () -> Unit,
) {
private fun importArchiveAlert(onConfirm: () -> Unit, ) {
AlertManager.shared.showAlertDialog(
title = generalGetString(MR.strings.import_database_question),
text = generalGetString(MR.strings.your_current_chat_database_will_be_deleted_and_replaced_with_the_imported_one),
confirmText = generalGetString(MR.strings.import_database_confirmation),
onConfirm = { importArchive(m, importedArchiveURI, appFilesCountAndSize, progressIndicator, startChat) },
onConfirm = onConfirm,
destructive = true,
)
}
@@ -622,52 +642,51 @@ private fun archiveErrorsText(errs: List<ArchiveError>): String = "\n" + errs.ma
}
}.joinToString(separator = "\n")
private fun importArchive(
m: ChatModel,
suspend fun importArchive(
importedArchiveURI: URI,
appFilesCountAndSize: MutableState<Pair<Int, Long>>,
progressIndicator: MutableState<Boolean>,
startChat: () -> Unit,
) {
): Boolean {
val m = chatModel
progressIndicator.value = true
val archivePath = saveArchiveFromURI(importedArchiveURI)
if (archivePath != null) {
withLongRunningApi {
try {
m.controller.apiDeleteStorage()
wallpapersDir.mkdirs()
try {
m.controller.apiDeleteStorage()
wallpapersDir.mkdirs()
try {
val config = ArchiveConfig(archivePath, parentTempDirectory = databaseExportDir.toString())
val archiveErrors = m.controller.apiImportArchive(config)
DatabaseUtils.ksDatabasePassword.remove()
appFilesCountAndSize.value = directoryFileCountAndSize(appFilesDir.absolutePath)
if (archiveErrors.isEmpty()) {
operationEnded(m, progressIndicator) {
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.chat_database_imported), text = generalGetString(MR.strings.restart_the_app_to_use_imported_chat_database))
}
if (chatModel.localUserCreated.value == false) {
chatModel.chatRunning.value = false
startChat()
}
} else {
operationEnded(m, progressIndicator) {
showArchiveImportedWithErrorsAlert(archiveErrors)
}
}
} catch (e: Error) {
val config = ArchiveConfig(archivePath, parentTempDirectory = databaseExportDir.toString())
val archiveErrors = m.controller.apiImportArchive(config)
appPrefs.shouldImportAppSettings.set(true)
DatabaseUtils.ksDatabasePassword.remove()
appFilesCountAndSize.value = directoryFileCountAndSize(appFilesDir.absolutePath)
if (archiveErrors.isEmpty()) {
operationEnded(m, progressIndicator) {
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.error_importing_database), e.toString())
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.chat_database_imported), text = generalGetString(MR.strings.restart_the_app_to_use_imported_chat_database))
}
if (chatModel.localUserCreated.value == false) {
chatModel.chatRunning.value = false
}
} else {
operationEnded(m, progressIndicator) {
showArchiveImportedWithErrorsAlert(archiveErrors)
}
}
return true
} catch (e: Error) {
operationEnded(m, progressIndicator) {
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.error_deleting_database), e.toString())
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.error_importing_database), e.toString())
}
} finally {
File(archivePath).delete()
}
} catch (e: Error) {
operationEnded(m, progressIndicator) {
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.error_deleting_database), e.toString())
}
} finally {
File(archivePath).delete()
}
}
return false
}
private fun saveArchiveFromURI(importedArchiveURI: URI): String? {
@@ -689,28 +708,26 @@ private fun saveArchiveFromURI(importedArchiveURI: URI): String? {
}
}
private fun deleteChatAlert(m: ChatModel, progressIndicator: MutableState<Boolean>) {
private fun deleteChatAlert(onConfirm: () -> Unit) {
AlertManager.shared.showAlertDialog(
title = generalGetString(MR.strings.delete_chat_profile_question),
text = generalGetString(MR.strings.delete_chat_profile_action_cannot_be_undone_warning),
confirmText = generalGetString(MR.strings.delete_verb),
onConfirm = { deleteChat(m, progressIndicator) },
onConfirm = onConfirm,
destructive = true,
)
}
private fun deleteChat(m: ChatModel, progressIndicator: MutableState<Boolean>) {
private suspend fun deleteChat(m: ChatModel, progressIndicator: MutableState<Boolean>) {
progressIndicator.value = true
withBGApi {
try {
deleteChatAsync(m)
operationEnded(m, progressIndicator) {
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.chat_database_deleted), generalGetString(MR.strings.restart_the_app_to_create_a_new_chat_profile))
}
} catch (e: Error) {
operationEnded(m, progressIndicator) {
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.error_deleting_database), e.toString())
}
try {
deleteChatAsync(m)
operationEnded(m, progressIndicator) {
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.chat_database_deleted), generalGetString(MR.strings.restart_the_app_to_create_a_new_chat_profile))
}
} catch (e: Error) {
operationEnded(m, progressIndicator) {
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.error_deleting_database), e.toString())
}
}
}
@@ -759,12 +776,12 @@ private fun afterSetCiTTL(
}
}
private fun deleteFilesAndMediaAlert(appFilesCountAndSize: MutableState<Pair<Int, Long>>) {
private fun deleteFilesAndMediaAlert(onConfirm: () -> Unit) {
AlertManager.shared.showAlertDialog(
title = generalGetString(MR.strings.delete_files_and_media_question),
text = generalGetString(MR.strings.delete_files_and_media_desc),
confirmText = generalGetString(MR.strings.delete_verb),
onConfirm = { deleteFiles(appFilesCountAndSize) },
onConfirm = onConfirm,
destructive = true
)
}
@@ -789,18 +806,13 @@ private fun operationEnded(m: ChatModel, progressIndicator: MutableState<Boolean
fun PreviewDatabaseLayout() {
SimpleXTheme {
DatabaseLayout(
currentRemoteHost = null,
progressIndicator = false,
runChat = true,
chatDbChanged = false,
stopped = false,
useKeyChain = false,
chatDbEncrypted = false,
passphraseSaved = false,
initialRandomDBPassphrase = SharedPreference({ true }, {}),
importArchiveLauncher = rememberFileChooserLauncher(true) {},
chatArchiveName = remember { mutableStateOf("dummy_archive") },
chatArchiveTime = remember { mutableStateOf(Clock.System.now()) },
chatLastStart = remember { mutableStateOf(Clock.System.now()) },
appFilesCountAndSize = remember { mutableStateOf(0 to 0L) },
chatItemTTL = remember { mutableStateOf(ChatItemTTL.None) },
currentUser = User.sampleData,
@@ -810,7 +822,6 @@ fun PreviewDatabaseLayout() {
exportArchive = {},
deleteChatAlert = {},
deleteAppFilesAndMedia = {},
showSettingsModal = { {} },
onChatItemTTLSelected = {},
disconnectAllHosts = {},
)
@@ -14,6 +14,7 @@ import chat.simplex.common.model.ChatModel
import chat.simplex.common.platform.*
import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.chatlist.StatusBarBackground
import chat.simplex.common.views.onboarding.OnboardingStage
import kotlinx.coroutines.flow.MutableStateFlow
import java.util.concurrent.atomic.AtomicBoolean
import kotlin.math.min
@@ -36,7 +37,7 @@ fun ModalView(
if (showClose && showAppBar) {
BackHandler(enabled = enableClose, onBack = close)
}
val oneHandUI = remember { appPrefs.oneHandUI.state }
val oneHandUI = remember { derivedStateOf { if (appPrefs.onboardingStage.state.value == OnboardingStage.OnboardingComplete) appPrefs.oneHandUI.state.value else false } }
Surface(Modifier.fillMaxSize(), contentColor = LocalContentColor.current) {
Box(if (background != Color.Unspecified) Modifier.background(background) else Modifier.themedBackground(bgLayerSize = LocalAppBarHandler.current?.backgroundGraphicsLayerSize, bgLayer = LocalAppBarHandler.current?.backgroundGraphicsLayer)) {
Box(modifier = modifier) {
@@ -481,7 +481,7 @@ private fun MutableState<MigrationFromState>.exportArchive() {
withLongRunningApi {
try {
getMigrationTempFilesDirectory().mkdir()
val (archivePath, archiveErrors) = exportChatArchive(chatModel, getMigrationTempFilesDirectory(), mutableStateOf(""), mutableStateOf(Instant.DISTANT_PAST), mutableStateOf(""))
val (archivePath, archiveErrors) = exportChatArchive(chatModel, getMigrationTempFilesDirectory(), mutableStateOf(""))
if (archiveErrors.isEmpty()) {
uploadArchive(archivePath)
} else {
@@ -35,6 +35,7 @@ import kotlinx.datetime.Clock
import kotlinx.datetime.toJavaInstant
import kotlinx.serialization.*
import java.io.File
import java.net.URI
import java.text.SimpleDateFormat
import java.util.*
import kotlin.math.max
@@ -180,7 +181,7 @@ private fun ModalData.SectionByState(
) {
when (val s = migrationState.value) {
null -> {}
is MigrationToState.PasteOrScanLink -> migrationState.PasteOrScanLinkView()
is MigrationToState.PasteOrScanLink -> migrationState.PasteOrScanLinkView(close)
is MigrationToState.Onion -> OnionView(s.link, s.legacySocksProxy, s.networkProxy, s.hostMode, s.requiredHostMode, migrationState)
is MigrationToState.DatabaseInit -> migrationState.DatabaseInitView(s.link, tempDatabaseFile, s.netCfg, s.networkProxy)
is MigrationToState.LinkDownloading -> migrationState.LinkDownloadingView(s.link, s.ctrl, s.user, s.archivePath, tempDatabaseFile, chatReceiver, s.netCfg, s.networkProxy)
@@ -195,18 +196,30 @@ private fun ModalData.SectionByState(
}
@Composable
private fun MutableState<MigrationToState?>.PasteOrScanLinkView() {
if (appPlatform.isAndroid) {
SectionView(stringResource(MR.strings.scan_QR_code).replace('\n', ' ').uppercase()) {
QRCodeScanner(showQRCodeScanner = remember { mutableStateOf(true) }) { text ->
withBGApi { checkUserLink(text) }
private fun MutableState<MigrationToState?>.PasteOrScanLinkView(close: () -> Unit) {
Box {
val progressIndicator = remember { mutableStateOf(false) }
Column {
if (appPlatform.isAndroid) {
SectionView(stringResource(MR.strings.scan_QR_code).replace('\n', ' ').uppercase()) {
QRCodeScanner(showQRCodeScanner = remember { mutableStateOf(true) }) { text ->
withBGApi { checkUserLink(text) }
}
}
SectionSpacer()
}
SectionView(stringResource(if (appPlatform.isAndroid) MR.strings.or_paste_archive_link else MR.strings.paste_archive_link).uppercase()) {
PasteLinkView()
}
SectionSpacer()
SectionView(stringResource(MR.strings.chat_archive).uppercase()) {
ArchiveImportView(progressIndicator, close)
}
}
SectionSpacer()
}
SectionView(stringResource(if (appPlatform.isAndroid) MR.strings.or_paste_archive_link else MR.strings.paste_archive_link).uppercase()) {
PasteLinkView()
if (progressIndicator.value)
ProgressView()
}
}
@@ -221,6 +234,31 @@ private fun MutableState<MigrationToState?>.PasteLinkView() {
}
}
@Composable
private fun ArchiveImportView(progressIndicator: MutableState<Boolean>, close: () -> Unit) {
val importArchiveLauncher = rememberFileChooserLauncher(true) { to: URI? ->
if (to != null) {
withLongRunningApi {
val success = importArchive(to, mutableStateOf(0 to 0), progressIndicator)
if (success) {
startChat(
chatModel,
mutableStateOf(Clock.System.now()),
chatModel.chatDbChanged,
progressIndicator
)
hideView(close)
}
}
}
}
SectionItemView({
withLongRunningApi { importArchiveLauncher.launch("application/zip") }
}) {
Text(stringResource(MR.strings.import_database))
}
}
@Composable
private fun ModalData.OnionView(link: String, legacyLinkSocksProxy: String?, linkNetworkProxy: NetworkProxy?, hostMode: HostMode, requiredHostMode: Boolean, state: MutableState<MigrationToState?>) {
val onionHosts = remember { stateGetOrPut("onionHosts") {
@@ -174,7 +174,7 @@ private fun ModalData.NewChatSheetLayout(
val actionButtonsOriginal = listOf(
Triple(
painterResource(MR.images.ic_add_link),
stringResource(MR.strings.add_contact_tab),
stringResource(MR.strings.create_1_time_link),
addContact,
),
Triple(
@@ -98,7 +98,7 @@ fun ModalData.NewChatView(rh: RemoteHostInfo?, selection: NewChatOption, showQRC
val tabTitles = NewChatOption.values().map {
when(it) {
NewChatOption.INVITE ->
stringResource(MR.strings.add_contact_tab)
stringResource(MR.strings.one_time_link_short)
NewChatOption.CONNECT ->
stringResource(MR.strings.connect_via_link)
}
@@ -31,13 +31,8 @@ fun ModalData.ChooseServerOperators(
LaunchedEffect(Unit) {
prepareChatBeforeFinishingOnboarding()
}
CompositionLocalProvider(LocalAppBarHandler provides rememberAppBarHandler()) {
ModalView({}, showClose = false, endButtons = {
IconButton({ modalManager.showModal { ChooseServerOperatorsInfoView() } }) {
Icon(painterResource(MR.images.ic_info), null, Modifier.size(28.dp), tint = MaterialTheme.colors.primary)
}
}) {
ModalView({}, showClose = false) {
val serverOperators = remember { derivedStateOf { chatModel.conditions.value.serverOperators } }
val selectedOperatorIds = remember { stateGetOrPut("selectedOperatorIds") { serverOperators.value.filter { it.enabled }.map { it.operatorId }.toSet() } }
val selectedOperators = remember { derivedStateOf { serverOperators.value.filter { selectedOperatorIds.value.contains(it.operatorId) } } }
@@ -48,15 +43,16 @@ fun ModalData.ChooseServerOperators(
maxIntrinsicSize = true
) {
Box(Modifier.align(Alignment.CenterHorizontally)) {
AppBarTitle(stringResource(MR.strings.onboarding_choose_server_operators))
AppBarTitle(stringResource(MR.strings.onboarding_choose_server_operators), bottomPadding = DEFAULT_PADDING)
}
Column((
if (appPlatform.isDesktop) Modifier.width(600.dp).align(Alignment.CenterHorizontally) else Modifier)
.padding(horizontal = DEFAULT_PADDING)
) {
Text(stringResource(MR.strings.onboarding_select_network_operators_to_use))
Spacer(Modifier.height(DEFAULT_PADDING))
Column(Modifier.fillMaxWidth().padding(horizontal = DEFAULT_PADDING), horizontalAlignment = Alignment.CenterHorizontally) {
OnboardingInformationButton(
stringResource(MR.strings.how_it_helps_privacy),
onClick = { modalManager.showModal { ChooseServerOperatorsInfoView() } }
)
}
Spacer(Modifier.weight(1f))
Column((
if (appPlatform.isDesktop) Modifier.width(600.dp).align(Alignment.CenterHorizontally) else Modifier)
@@ -93,7 +89,7 @@ fun ModalData.ChooseServerOperators(
currUserServers = remember { mutableStateOf(emptyList()) },
userServers = remember { mutableStateOf(emptyList()) },
close = close,
rhId = null
rhId = null,
)
}
}
@@ -249,10 +245,8 @@ private fun ReviewConditionsView(
Column(modifier = Modifier.weight(1f).padding(top = DEFAULT_PADDING_HALF)) {
ConditionsTextView(chatModel.remoteHostId())
}
Column(Modifier.padding(top = DEFAULT_PADDING).widthIn(max = if (appPlatform.isAndroid) 450.dp else 1000.dp).align(Alignment.CenterHorizontally), horizontalAlignment = Alignment.CenterHorizontally) {
Column(Modifier.padding(vertical = DEFAULT_PADDING).widthIn(max = if (appPlatform.isAndroid) 450.dp else 1000.dp).align(Alignment.CenterHorizontally), horizontalAlignment = Alignment.CenterHorizontally) {
AcceptConditionsButton(onboarding, selectedOperators, selectedOperatorIds, close)
// Reserve space
TextButtonBelowOnboardingButton("", null)
}
}
}
@@ -25,14 +25,11 @@ import dev.icerock.moko.resources.StringResource
fun HowItWorks(user: User?, onboardingStage: SharedPreference<OnboardingStage>? = null) {
ColumnWithScrollBar(Modifier.padding(DEFAULT_PADDING)) {
AppBarTitle(stringResource(MR.strings.how_simplex_works), withPadding = false)
ReadableText(MR.strings.many_people_asked_how_can_it_deliver)
ReadableText(MR.strings.to_protect_privacy_simplex_has_ids_for_queues)
ReadableText(MR.strings.you_control_servers_to_receive_your_contacts_to_send)
ReadableText(MR.strings.only_client_devices_store_contacts_groups_e2e_encrypted_messages)
ReadableText(MR.strings.all_message_and_files_e2e_encrypted)
if (onboardingStage == null) {
ReadableTextWithLink(MR.strings.read_more_in_github_with_link, "https://github.com/simplex-chat/simplex-chat#readme")
} else {
ReadableText(MR.strings.read_more_in_github)
}
Spacer(Modifier.fillMaxHeight().weight(1f))
@@ -41,7 +38,6 @@ fun HowItWorks(user: User?, onboardingStage: SharedPreference<OnboardingStage>?
Box(Modifier.fillMaxWidth().padding(bottom = DEFAULT_PADDING), contentAlignment = Alignment.Center) {
OnboardingActionButton(user, onboardingStage, onclick = { ModalManager.fullscreen.closeModal() })
}
Spacer(Modifier.fillMaxHeight().weight(1f))
}
Spacer(Modifier.height(DEFAULT_PADDING))
}
@@ -32,23 +32,28 @@ fun SetNotificationsMode(m: ChatModel) {
ModalView({}, showClose = false) {
ColumnWithScrollBar(Modifier.themedBackground(bgLayerSize = LocalAppBarHandler.current?.backgroundGraphicsLayerSize, bgLayer = LocalAppBarHandler.current?.backgroundGraphicsLayer)) {
Box(Modifier.align(Alignment.CenterHorizontally)) {
AppBarTitle(stringResource(MR.strings.onboarding_notifications_mode_title))
AppBarTitle(stringResource(MR.strings.onboarding_notifications_mode_title), bottomPadding = DEFAULT_PADDING)
}
val currentMode = rememberSaveable { mutableStateOf(NotificationsMode.default) }
Column(Modifier.padding(horizontal = DEFAULT_PADDING * 1f)) {
Text(stringResource(MR.strings.onboarding_notifications_mode_subtitle), Modifier.fillMaxWidth(), textAlign = TextAlign.Center)
Spacer(Modifier.height(DEFAULT_PADDING * 2f))
SelectableCard(currentMode, NotificationsMode.OFF, stringResource(MR.strings.onboarding_notifications_mode_off), annotatedStringResource(MR.strings.onboarding_notifications_mode_off_desc)) {
currentMode.value = NotificationsMode.OFF
}
SelectableCard(currentMode, NotificationsMode.PERIODIC, stringResource(MR.strings.onboarding_notifications_mode_periodic), annotatedStringResource(MR.strings.onboarding_notifications_mode_periodic_desc)) {
currentMode.value = NotificationsMode.PERIODIC
}
SelectableCard(currentMode, NotificationsMode.SERVICE, stringResource(MR.strings.onboarding_notifications_mode_service), annotatedStringResource(MR.strings.onboarding_notifications_mode_service_desc)) {
Column(Modifier.padding(horizontal = DEFAULT_PADDING).fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) {
OnboardingInformationButton(
stringResource(MR.strings.onboarding_notifications_mode_subtitle),
onClick = { ModalManager.fullscreen.showModalCloseable { NotificationBatteryUsageInfo() } }
)
}
Spacer(Modifier.weight(1f))
Column(Modifier.padding(horizontal = DEFAULT_PADDING)) {
SelectableCard(currentMode, NotificationsMode.SERVICE, stringResource(MR.strings.onboarding_notifications_mode_service), annotatedStringResource(MR.strings.onboarding_notifications_mode_service_desc_short)) {
currentMode.value = NotificationsMode.SERVICE
}
SelectableCard(currentMode, NotificationsMode.PERIODIC, stringResource(MR.strings.onboarding_notifications_mode_periodic), annotatedStringResource(MR.strings.onboarding_notifications_mode_periodic_desc_short)) {
currentMode.value = NotificationsMode.PERIODIC
}
SelectableCard(currentMode, NotificationsMode.OFF, stringResource(MR.strings.onboarding_notifications_mode_off), annotatedStringResource(MR.strings.onboarding_notifications_mode_off_desc_short)) {
currentMode.value = NotificationsMode.OFF
}
}
Spacer(Modifier.fillMaxHeight().weight(1f))
Spacer(Modifier.weight(1f))
Column(Modifier.widthIn(max = if (appPlatform.isAndroid) 450.dp else 1000.dp).align(Alignment.CenterHorizontally), horizontalAlignment = Alignment.CenterHorizontally) {
OnboardingActionButton(
modifier = if (appPlatform.isAndroid) Modifier.padding(horizontal = DEFAULT_PADDING * 2).fillMaxWidth() else Modifier,
@@ -99,6 +104,21 @@ fun <T> SelectableCard(currentValue: State<T>, newValue: T, title: String, descr
Spacer(Modifier.height(14.dp))
}
@Composable
private fun NotificationBatteryUsageInfo() {
ColumnWithScrollBar(Modifier.padding(DEFAULT_PADDING)) {
AppBarTitle(stringResource(MR.strings.onboarding_notifications_mode_battery), withPadding = false)
Text(stringResource(MR.strings.onboarding_notifications_mode_service), style = MaterialTheme.typography.h3, color = MaterialTheme.colors.secondary)
ReadableText(MR.strings.onboarding_notifications_mode_service_desc)
Spacer(Modifier.height(DEFAULT_PADDING_HALF))
Text(stringResource(MR.strings.onboarding_notifications_mode_periodic), style = MaterialTheme.typography.h3, color = MaterialTheme.colors.secondary)
ReadableText(MR.strings.onboarding_notifications_mode_periodic_desc)
Spacer(Modifier.height(DEFAULT_PADDING_HALF))
Text(stringResource(MR.strings.onboarding_notifications_mode_off), style = MaterialTheme.typography.h3, color = MaterialTheme.colors.secondary)
ReadableText(MR.strings.onboarding_notifications_mode_off_desc)
}
}
fun prepareChatBeforeFinishingOnboarding() {
// No visible users but may have hidden. In this case chat should be started anyway because it's stopped on this stage with hidden users
if (chatModel.users.any { u -> !u.user.hidden }) return
@@ -32,11 +32,7 @@ import dev.icerock.moko.resources.StringResource
fun SimpleXInfo(chatModel: ChatModel, onboarding: Boolean = true) {
if (onboarding) {
CompositionLocalProvider(LocalAppBarHandler provides rememberAppBarHandler()) {
ModalView({}, showClose = false, endButtons = {
IconButton({ ModalManager.fullscreen.showModal { HowItWorks(chatModel.currentUser.value, null) } }) {
Icon(painterResource(MR.images.ic_info), null, Modifier.size(28.dp), tint = MaterialTheme.colors.primary)
}
}) {
ModalView({}, showClose = false, showAppBar = false) {
SimpleXInfoLayout(
user = chatModel.currentUser.value,
onboardingStage = chatModel.controller.appPrefs.onboardingStage
@@ -56,22 +52,14 @@ fun SimpleXInfoLayout(
user: User?,
onboardingStage: SharedPreference<OnboardingStage>?
) {
ColumnWithScrollBar(
Modifier
.padding(horizontal = DEFAULT_PADDING),
horizontalAlignment = Alignment.CenterHorizontally
) {
ColumnWithScrollBar(Modifier.padding(horizontal = DEFAULT_PADDING), horizontalAlignment = Alignment.CenterHorizontally) {
Box(Modifier.widthIn(max = if (appPlatform.isAndroid) 250.dp else 500.dp).padding(top = DEFAULT_PADDING + 8.dp), contentAlignment = Alignment.Center) {
SimpleXLogo()
}
Spacer(Modifier.weight(1f))
Text(
OnboardingInformationButton(
stringResource(MR.strings.next_generation_of_private_messaging),
style = MaterialTheme.typography.h3,
color = MaterialTheme.colors.secondary,
textAlign = TextAlign.Center
onClick = { ModalManager.fullscreen.showModal { HowItWorks(user, onboardingStage) } },
)
Spacer(Modifier.weight(1f))
@@ -82,10 +70,10 @@ fun SimpleXInfoLayout(
InfoRow(painterResource(if (isInDarkTheme()) MR.images.decentralized_light else MR.images.decentralized), MR.strings.decentralized, MR.strings.opensource_protocol_and_code_anybody_can_run_servers)
}
Spacer(Modifier.fillMaxHeight().weight(1f))
Column(Modifier.fillMaxHeight().weight(1f)) { }
if (onboardingStage != null) {
Column(Modifier.padding(horizontal = DEFAULT_PADDING).widthIn(max = if (appPlatform.isAndroid) 450.dp else 1000.dp).align(Alignment.CenterHorizontally), horizontalAlignment = Alignment.CenterHorizontally) {
Column(Modifier.padding(horizontal = DEFAULT_PADDING).widthIn(max = if (appPlatform.isAndroid) 450.dp else 1000.dp).align(Alignment.CenterHorizontally), horizontalAlignment = Alignment.CenterHorizontally,) {
OnboardingActionButton(user, onboardingStage)
TextButtonBelowOnboardingButton(stringResource(MR.strings.migrate_from_another_device)) {
chatModel.migrationState.value = MigrationToState.PasteOrScanLink
@@ -165,8 +153,8 @@ fun OnboardingActionButton(
fun TextButtonBelowOnboardingButton(text: String, onClick: (() -> Unit)?) {
val state = getKeyboardState()
val enabled = onClick != null
val topPadding by animateDpAsState(if (appPlatform.isAndroid && state.value == KeyboardState.Opened) 0.dp else DEFAULT_PADDING)
val bottomPadding by animateDpAsState(if (appPlatform.isAndroid && state.value == KeyboardState.Opened) 0.dp else DEFAULT_PADDING * 2)
val topPadding by animateDpAsState(if (appPlatform.isAndroid && state.value == KeyboardState.Opened) 0.dp else DEFAULT_PADDING_HALF)
val bottomPadding by animateDpAsState(if (appPlatform.isAndroid && state.value == KeyboardState.Opened) 0.dp else DEFAULT_PADDING_HALF)
if ((appPlatform.isAndroid && state.value == KeyboardState.Closed) || topPadding > 0.dp) {
TextButton({ onClick?.invoke() }, Modifier.padding(top = topPadding, bottom = bottomPadding).clip(CircleShape), enabled = enabled) {
Text(
@@ -183,6 +171,27 @@ fun TextButtonBelowOnboardingButton(text: String, onClick: (() -> Unit)?) {
}
}
@Composable
fun OnboardingInformationButton(
text: String,
onClick: () -> Unit,
) {
Box(
modifier = Modifier
.clip(CircleShape)
.clickable { onClick() }
) {
Row(Modifier.padding(8.dp), horizontalArrangement = Arrangement.spacedBy(4.dp) ) {
Icon(
painterResource(MR.images.ic_info),
null,
tint = MaterialTheme.colors.primary
)
Text(text, style = MaterialTheme.typography.button, color = MaterialTheme.colors.primary)
}
}
}
@Preview/*(
uiMode = Configuration.UI_MODE_NIGHT_YES,
showBackground = true,
@@ -725,7 +725,7 @@ private val versionDescriptions: List<VersionDescription> = listOf(
),
VersionDescription(
version = "v6.2-beta.1",
post = "https://simplex.chat/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html",
post = "https://simplex.chat/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html",
features = listOf(
VersionFeature.FeatureView(
icon = null,
@@ -109,7 +109,7 @@ fun SettingsLayout(
SectionDividerSpaced()
SectionView(stringResource(MR.strings.settings_section_title_chat_database)) {
DatabaseItem(encrypted, passphraseSaved, showSettingsModal { DatabaseView(it, showSettingsModal) }, stopped)
DatabaseItem(encrypted, passphraseSaved, showSettingsModal { DatabaseView() }, stopped)
SettingsActionItem(painterResource(MR.images.ic_ios_share), stringResource(MR.strings.migrate_from_device_to_another_device), { withAuth(generalGetString(MR.strings.auth_open_migration_to_another_device), generalGetString(MR.strings.auth_log_in_using_credential)) { ModalManager.fullscreen.showCustomModal { close -> MigrateFromDeviceView(close) } } }, disabled = stopped)
}
@@ -3,29 +3,57 @@ package chat.simplex.common.views.usersettings
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import chat.simplex.common.platform.ColumnWithScrollBar
import chat.simplex.common.platform.chatModel
import chat.simplex.common.ui.theme.DEFAULT_PADDING
import chat.simplex.common.ui.theme.DEFAULT_PADDING_HALF
import dev.icerock.moko.resources.compose.stringResource
import chat.simplex.common.views.helpers.*
import chat.simplex.common.views.onboarding.ReadableText
import chat.simplex.common.views.onboarding.ReadableTextWithLink
import chat.simplex.common.views.newchat.*
import chat.simplex.common.views.onboarding.*
import chat.simplex.res.MR
import dev.icerock.moko.resources.compose.painterResource
@Composable
fun UserAddressLearnMore(showCreateAddressButton: Boolean = false) {
ColumnWithScrollBar(Modifier .padding(horizontal = DEFAULT_PADDING)) {
AppBarTitle(stringResource(MR.strings.simplex_address), withPadding = false)
ReadableText(MR.strings.you_can_share_your_address)
AppBarTitle(stringResource(MR.strings.address_or_1_time_link), withPadding = false)
Row {
Icon(painterResource(MR.images.ic_mail), null, tint = MaterialTheme.colors.secondary)
Spacer(Modifier.width(DEFAULT_PADDING_HALF))
ReadableText(MR.strings.share_address_publicly, style = MaterialTheme.typography.h3.copy(fontWeight = FontWeight.Bold))
}
ReadableText(MR.strings.share_simplex_address_on_social_media)
ReadableText(MR.strings.you_wont_lose_your_contacts_if_delete_address)
ReadableText(MR.strings.you_can_accept_or_reject_connection)
ReadableTextWithLink(MR.strings.read_more_in_user_guide_with_link, "https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address")
Row(Modifier.padding(top = DEFAULT_PADDING_HALF)) {
Icon(painterResource(MR.images.ic_add_link), null, tint = MaterialTheme.colors.secondary)
Spacer(Modifier.width(DEFAULT_PADDING_HALF))
ReadableText(MR.strings.share_1_time_link_with_a_friend, style = MaterialTheme.typography.h3.copy(fontWeight = FontWeight.Bold))
}
ReadableText(MR.strings.one_time_link_can_be_used_with_one_contact_only)
ReadableText(MR.strings.you_can_set_connection_name_to_remember)
if (!showCreateAddressButton) {
Row(Modifier.padding(top = DEFAULT_PADDING_HALF)) {
Icon(painterResource(MR.images.ic_shield), null, tint = MaterialTheme.colors.secondary)
Spacer(Modifier.width(DEFAULT_PADDING_HALF))
ReadableText(MR.strings.connection_security, style = MaterialTheme.typography.h3.copy(fontWeight = FontWeight.Bold))
}
ReadableText(MR.strings.simplex_address_and_1_time_links_are_safe_to_share)
ReadableText(MR.strings.to_protect_against_your_link_replaced_compare_codes)
ReadableTextWithLink(MR.strings.read_more_in_user_guide_with_link, "https://simplex.chat/docs/guide/making-connections.html#comparison-of-1-time-invitation-links-and-simplex-contact-addresses")
}
if (showCreateAddressButton) {
Spacer(Modifier.weight(1f))
@@ -33,7 +61,7 @@ fun UserAddressLearnMore(showCreateAddressButton: Boolean = false) {
Button(
onClick = {
ModalManager.start.showModalCloseable { close ->
UserAddressView(chatModel = chatModel, shareViaProfile = false, autoCreateAddress = true, close = close)
UserAddressView(chatModel = chatModel, shareViaProfile = false, autoCreateAddress = true, close = { ModalManager.start.closeModals() })
}
},
shape = CircleShape,
@@ -42,6 +70,24 @@ fun UserAddressLearnMore(showCreateAddressButton: Boolean = false) {
) {
Text(stringResource(MR.strings.create_simplex_address), style = MaterialTheme.typography.h2, color = Color.White, fontSize = 18.sp, fontWeight = FontWeight.Medium)
}
val closeAll = { ModalManager.start.closeModals() }
TextButton(
onClick = {
ModalManager.start.showModalCloseable(endButtons = { AddContactLearnMoreButton() }) { _ ->
NewChatView(chatModel.currentRemoteHost.value, NewChatOption.INVITE, close = closeAll)
}
},
Modifier.padding(top = DEFAULT_PADDING, bottom = DEFAULT_PADDING * 2).clip(CircleShape)
) {
Text(
stringResource(MR.strings.create_1_time_link),
Modifier.padding(start = DEFAULT_PADDING_HALF, end = DEFAULT_PADDING_HALF, bottom = 5.dp),
color = MaterialTheme.colors.primary,
fontWeight = FontWeight.Medium,
textAlign = TextAlign.Center
)
}
}
}
}
@@ -31,7 +31,6 @@ import chat.simplex.res.MR
@Composable
fun UserAddressView(
chatModel: ChatModel,
viaCreateLinkView: Boolean = false,
shareViaProfile: Boolean = false,
autoCreateAddress: Boolean = false,
close: () -> Unit
@@ -39,7 +38,6 @@ fun UserAddressView(
// TODO close when remote host changes
val shareViaProfile = remember { mutableStateOf(shareViaProfile) }
var progressIndicator by remember { mutableStateOf(false) }
val onCloseHandler: MutableState<(close: () -> Unit) -> Unit> = remember { mutableStateOf({ _ -> }) }
val user = remember { chatModel.currentUser }
KeyChangeEffect(user.value?.remoteHostId, user.value?.userId) {
close()
@@ -82,7 +80,7 @@ fun UserAddressView(
}
LaunchedEffect(autoCreateAddress) {
if (autoCreateAddress) {
if (chatModel.userAddress.value == null && autoCreateAddress) {
createAddress()
}
}
@@ -94,7 +92,6 @@ fun UserAddressView(
user = user.value,
userAddress = userAddress.value,
shareViaProfile,
onCloseHandler,
createAddress = { createAddress() },
learnMore = {
ModalManager.start.showModal {
@@ -105,7 +102,7 @@ fun UserAddressView(
sendEmail = { userAddress ->
uriHandler.sendEmail(
generalGetString(MR.strings.email_invite_subject),
generalGetString(MR.strings.email_invite_body).format(simplexChatLink( userAddress.connReqContact))
generalGetString(MR.strings.email_invite_body).format(simplexChatLink(userAddress.connReqContact))
)
},
setProfileAddress = ::setProfileAddress,
@@ -141,12 +138,8 @@ fun UserAddressView(
)
}
if (viaCreateLinkView) {
ModalView(close = close) {
showLayout()
} else {
ModalView(close = { onCloseHandler.value(close) }) {
showLayout()
}
}
if (progressIndicator) {
@@ -173,7 +166,6 @@ private fun UserAddressLayout(
user: User?,
userAddress: UserContactLinkRec?,
shareViaProfile: MutableState<Boolean>,
onCloseHandler: MutableState<(close: () -> Unit) -> Unit>,
createAddress: () -> Unit,
learnMore: () -> Unit,
share: (String) -> Unit,
@@ -190,45 +182,41 @@ private fun UserAddressLayout(
verticalArrangement = Arrangement.SpaceEvenly
) {
if (userAddress == null) {
SectionView {
SectionView(generalGetString(MR.strings.for_social_media).uppercase()) {
CreateAddressButton(createAddress)
SectionTextFooter(stringResource(MR.strings.create_address_and_let_people_connect))
}
SectionDividerSpaced()
SectionView(generalGetString(MR.strings.or_to_share_privately).uppercase()) {
CreateOneTimeLinkButton()
}
SectionDividerSpaced(maxTopPadding = true, maxBottomPadding = false)
SectionView {
LearnMoreButton(learnMore)
}
LaunchedEffect(Unit) {
onCloseHandler.value = { close -> close() }
}
} else {
val autoAcceptState = remember { mutableStateOf(AutoAcceptState(userAddress)) }
val autoAcceptStateSaved = remember { mutableStateOf(autoAcceptState.value) }
SectionView(stringResource(MR.strings.address_section_title).uppercase()) {
SectionView(stringResource(MR.strings.for_social_media).uppercase()) {
SimpleXLinkQRCode(userAddress.connReqContact)
ShareAddressButton { share(simplexChatLink(userAddress.connReqContact)) }
ShareViaEmailButton { sendEmail(userAddress) }
ShareWithContactsButton(shareViaProfile, setProfileAddress)
AutoAcceptToggle(autoAcceptState) { saveAas(autoAcceptState.value, autoAcceptStateSaved) }
LearnMoreButton(learnMore)
// ShareViaEmailButton { sendEmail(userAddress) }
AddressSettingsButton(user, userAddress, shareViaProfile, setProfileAddress, saveAas)
}
if (autoAcceptState.value.enable) {
SectionDividerSpaced()
AutoAcceptSection(autoAcceptState, autoAcceptStateSaved, saveAas)
SectionDividerSpaced()
SectionView(generalGetString(MR.strings.or_to_share_privately).uppercase()) {
CreateOneTimeLinkButton()
}
SectionDividerSpaced(maxBottomPadding = false)
SectionView {
LearnMoreButton(learnMore)
}
SectionDividerSpaced(maxBottomPadding = false)
SectionView {
DeleteAddressButton(deleteAddress)
SectionTextFooter(stringResource(MR.strings.your_contacts_will_remain_connected))
}
LaunchedEffect(Unit) {
onCloseHandler.value = { close ->
if (autoAcceptState.value == autoAcceptStateSaved.value) close()
else showUnsavedChangesAlert({ saveAas(autoAcceptState.value, autoAcceptStateSaved); close() }, close)
}
}
}
}
SectionBottomSpacer()
@@ -246,11 +234,27 @@ private fun CreateAddressButton(onClick: () -> Unit) {
)
}
@Composable
private fun CreateOneTimeLinkButton() {
val closeAll = { ModalManager.start.closeModals() }
SettingsActionItem(
painterResource(MR.images.ic_add_link),
stringResource(MR.strings.create_1_time_link),
click = {
ModalManager.start.showModalCloseable(endButtons = { AddContactLearnMoreButton() }) { _ ->
NewChatView(chatModel.currentRemoteHost.value, NewChatOption.INVITE, close = closeAll)
}
},
iconColor = MaterialTheme.colors.primary,
textColor = MaterialTheme.colors.primary,
)
}
@Composable
private fun LearnMoreButton(onClick: () -> Unit) {
SettingsActionItem(
painterResource(MR.images.ic_info),
stringResource(MR.strings.learn_more_about_address),
stringResource(MR.strings.simplex_address_or_1_time_link),
onClick,
)
}
@@ -266,6 +270,85 @@ fun ShareViaEmailButton(onClick: () -> Unit) {
)
}
@Composable
private fun AddressSettingsButton(
user: User?,
userAddress: UserContactLinkRec,
shareViaProfile: MutableState<Boolean>,
setProfileAddress: (Boolean) -> Unit,
saveAas: (AutoAcceptState, MutableState<AutoAcceptState>) -> Unit,
) {
SettingsActionItem(
painterResource(MR.images.ic_settings),
stringResource(MR.strings.address_settings),
click = {
ModalManager.start.showCustomModal { close ->
UserAddressSettings(user, userAddress, shareViaProfile, setProfileAddress, saveAas, close = close)
}
}
)
}
@Composable
private fun ModalData.UserAddressSettings(
user: User?,
userAddress: UserContactLinkRec,
shareViaProfile: MutableState<Boolean>,
setProfileAddress: (Boolean) -> Unit,
saveAas: (AutoAcceptState, MutableState<AutoAcceptState>) -> Unit,
close: () -> Unit
) {
val autoAcceptState = remember { stateGetOrPut("autoAcceptState") { (AutoAcceptState(userAddress)) } }
val autoAcceptStateSaved = remember { stateGetOrPut("autoAcceptStateSaved") { (autoAcceptState.value) } }
fun onClose(close: () -> Unit): Boolean = if (autoAcceptState.value == autoAcceptStateSaved.value) {
chatModel.centerPanelBackgroundClickHandler = null
close()
false
} else {
showUnsavedChangesAlert(
save = {
saveAas(autoAcceptState.value, autoAcceptStateSaved)
chatModel.centerPanelBackgroundClickHandler = null
close()
},
revert = {
chatModel.centerPanelBackgroundClickHandler = null
close()
}
)
true
}
LaunchedEffect(Unit) {
// Enables unsaved changes alert on this view.
chatModel.centerPanelBackgroundClickHandler = {
onClose(close = { ModalManager.start.closeModals() })
}
}
ModalView(close = { onClose(close) }) {
ColumnWithScrollBar {
AppBarTitle(stringResource(MR.strings.address_settings), hostDevice(user?.remoteHostId))
Column(
Modifier.fillMaxWidth().padding(bottom = DEFAULT_PADDING_HALF),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.SpaceEvenly
) {
SectionView {
ShareWithContactsButton(shareViaProfile, setProfileAddress)
AutoAcceptToggle(autoAcceptState) { saveAas(autoAcceptState.value, autoAcceptStateSaved) }
}
if (autoAcceptState.value.enable) {
SectionDividerSpaced()
AutoAcceptSection(autoAcceptState, autoAcceptStateSaved, saveAas)
}
}
}
}
}
@Composable
fun ShareWithContactsButton(shareViaProfile: MutableState<Boolean>, setProfileAddress: (Boolean) -> Unit) {
PreferenceToggleWithIcon(
@@ -441,7 +524,6 @@ fun PreviewUserAddressLayoutNoAddress() {
setProfileAddress = { _ -> },
learnMore = {},
shareViaProfile = remember { mutableStateOf(false) },
onCloseHandler = remember { mutableStateOf({}) },
sendEmail = {},
)
}
@@ -475,7 +557,6 @@ fun PreviewUserAddressLayoutAddressCreated() {
setProfileAddress = { _ -> },
learnMore = {},
shareViaProfile = remember { mutableStateOf(false) },
onCloseHandler = remember { mutableStateOf({}) },
sendEmail = {},
)
}
@@ -39,10 +39,10 @@ import chat.simplex.common.views.onboarding.OnboardingActionButton
import chat.simplex.common.views.onboarding.ReadableText
import chat.simplex.common.views.usersettings.*
import chat.simplex.res.MR
import kotlinx.coroutines.launch
import kotlinx.coroutines.*
@Composable
fun ModalData.NetworkAndServersView(close: () -> Unit) {
fun ModalData.NetworkAndServersView(closeNetworkAndServers: () -> Unit) {
val currentRemoteHost by remember { chatModel.currentRemoteHost }
// It's not a state, just a one-time value. Shouldn't be used in any state-related situations
val netCfg = remember { chatModel.controller.getNetCfg() }
@@ -50,21 +50,36 @@ fun ModalData.NetworkAndServersView(close: () -> Unit) {
val currUserServers = remember { stateGetOrPut("currUserServers") { emptyList<UserOperatorServers>() } }
val userServers = remember { stateGetOrPut("userServers") { emptyList<UserOperatorServers>() } }
val serverErrors = remember { stateGetOrPut("serverErrors") { emptyList<UserServersError>() } }
val scope = rememberCoroutineScope()
val proxyPort = remember { derivedStateOf { appPrefs.networkProxy.state.value.port } }
ModalView(
close = {
if (!serversCanBeSaved(currUserServers.value, userServers.value, serverErrors.value)) {
fun onClose(close: () -> Unit): Boolean = if (!serversCanBeSaved(currUserServers.value, userServers.value, serverErrors.value)) {
chatModel.centerPanelBackgroundClickHandler = null
close()
false
} else {
showUnsavedChangesAlert(
{
CoroutineScope(Dispatchers.Default).launch {
saveServers(currentRemoteHost?.remoteHostId, currUserServers, userServers)
chatModel.centerPanelBackgroundClickHandler = null
close()
}
},
{
chatModel.centerPanelBackgroundClickHandler = null
close()
} else {
showUnsavedChangesAlert(
{ scope.launch { saveServers(currentRemoteHost?.remoteHostId, currUserServers, userServers) }},
close
)
}
)
true
}
LaunchedEffect(Unit) {
// Enables unsaved changes alert on this view and all children views.
chatModel.centerPanelBackgroundClickHandler = {
onClose(close = { ModalManager.start.closeModals() })
}
) {
}
ModalView(close = { onClose(closeNetworkAndServers) }) {
NetworkAndServersLayout(
currentRemoteHost = currentRemoteHost,
networkUseSocksProxy = networkUseSocksProxy,
@@ -16,10 +16,11 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.*
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.platform.UriHandler
import androidx.compose.ui.text.*
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.DpOffset
import androidx.compose.ui.unit.dp
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.unit.*
import chat.simplex.common.model.*
import chat.simplex.common.model.ChatController.appPrefs
import chat.simplex.common.model.ChatController.getUsageConditions
@@ -29,14 +30,19 @@ import chat.simplex.common.views.chat.item.ItemAction
import chat.simplex.common.views.helpers.*
import chat.simplex.common.views.onboarding.*
import chat.simplex.res.MR
import com.mikepenz.markdown.compose.Markdown
import com.mikepenz.markdown.compose.components.markdownComponents
import com.mikepenz.markdown.compose.elements.MarkdownHeader
import com.mikepenz.markdown.m2.markdownColor
import com.mikepenz.markdown.m2.markdownTypography
import com.mikepenz.markdown.model.markdownPadding
import dev.icerock.moko.resources.compose.painterResource
import dev.icerock.moko.resources.compose.stringResource
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import java.net.URI
import kotlinx.coroutines.*
import org.intellij.markdown.flavours.commonmark.CommonMarkFlavourDescriptor
@Composable
fun ModalData.OperatorView(
fun OperatorView(
currUserServers: MutableState<List<UserOperatorServers>>,
userServers: MutableState<List<UserOperatorServers>>,
serverErrors: MutableState<List<UserServersError>>,
@@ -145,7 +151,14 @@ fun OperatorViewLayout(
Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically
) {
Image(painterResource(operator.largeLogo), null, Modifier.height(48.dp))
Image(
painterResource(operator.largeLogo),
operator.tradeName,
modifier = Modifier.height(48.dp),
colorFilter = if (operator.enabled) null else ColorFilter.colorMatrix(ColorMatrix().apply {
setToSaturation(0f)
})
)
Spacer(Modifier.fillMaxWidth().weight(1f))
Box(Modifier.padding(horizontal = 2.dp)) {
Icon(painterResource(MR.images.ic_info), null, Modifier.size(24.dp), tint = MaterialTheme.colors.primaryVariant)
@@ -603,13 +616,20 @@ fun ConditionsTextView(
val defaultConditionsLink = "https://github.com/simplex-chat/simplex-chat/blob/stable/PRIVACY.md"
val scope = rememberCoroutineScope()
// can show conditions when animation between modals finishes to prevent glitches
val canShowConditionsAt = remember { System.currentTimeMillis() + 300 }
LaunchedEffect(Unit) {
scope.launch {
scope.launch(Dispatchers.Default) {
try {
val conditions = getUsageConditions(rh = rhId)
if (conditions != null) {
conditionsData.value = conditions
val parentLink = "https://github.com/simplex-chat/simplex-chat/blob/${conditions.first.conditionsCommit}"
val conditionsText = conditions.second
val preparedText = if (conditionsText != null) prepareMarkdown(conditionsText.trimIndent(), parentLink) else null
val modifiedConditions = Triple(conditions.first, preparedText, conditions.third)
delay((canShowConditionsAt - System.currentTimeMillis()).coerceAtLeast(0))
conditionsData.value = modifiedConditions
} else {
failedToLoad.value = true
}
@@ -632,10 +652,10 @@ fun ConditionsTextView(
.verticalScroll(scrollState)
.padding(8.dp)
) {
Text(
text = conditionsText.trimIndent(),
modifier = Modifier.padding(8.dp)
)
val parentUriHandler = LocalUriHandler.current
CompositionLocalProvider(LocalUriHandler provides remember { internalUriHandler(parentUriHandler) }) {
ConditionsMarkdown(conditionsText)
}
}
} else {
val conditionsLink = "https://github.com/simplex-chat/simplex-chat/blob/${usageConditions.conditionsCommit}/PRIVACY.md"
@@ -648,6 +668,44 @@ fun ConditionsTextView(
}
}
@Composable
private fun ConditionsMarkdown(text: String) {
Markdown(text,
markdownColor(linkText = MaterialTheme.colors.primary),
markdownTypography(
h1 = MaterialTheme.typography.body1,
h2 = MaterialTheme.typography.h3.copy(fontSize = 22.sp, fontWeight = FontWeight.Bold),
h3 = MaterialTheme.typography.h4.copy(fontWeight = FontWeight.Bold),
h4 = MaterialTheme.typography.h5.copy(fontSize = 16.sp, fontWeight = FontWeight.Bold),
h5 = MaterialTheme.typography.h6.copy(fontWeight = FontWeight.Bold),
link = MaterialTheme.typography.body1.copy(
textDecoration = TextDecoration.Underline
)
),
Modifier.padding(8.dp),
// using CommonMarkFlavourDescriptor instead of GFMFlavourDescriptor because it shows `https://simplex.chat/` (link inside backticks) incorrectly
flavour = CommonMarkFlavourDescriptor(),
components = markdownComponents(
heading2 = {
Spacer(Modifier.height(10.dp))
MarkdownHeader(it.content, it.node, it.typography.h2)
Spacer(Modifier.height(5.dp))
},
heading3 = {
Spacer(Modifier.height(10.dp))
MarkdownHeader(it.content, it.node, it.typography.h3)
Spacer(Modifier.height(3.dp))
},
heading4 = {
Spacer(Modifier.height(10.dp))
MarkdownHeader(it.content, it.node, it.typography.h4)
Spacer(Modifier.height(4.dp))
},
),
padding = markdownPadding(block = 4.dp)
)
}
@Composable
private fun ConditionsLinkView(conditionsLink: String) {
SectionItemView {
@@ -699,6 +757,24 @@ fun ConditionsLinkButton() {
}
}
private fun internalUriHandler(parentUriHandler: UriHandler): UriHandler = object: UriHandler {
override fun openUri(uri: String) {
if (uri.startsWith("https://simplex.chat/contact#")) {
openVerifiedSimplexUri(uri)
} else {
parentUriHandler.openUriCatching(uri)
}
}
}
private fun prepareMarkdown(text: String, parentLink: String): String {
val localLinkRegex = Regex("\\[([^\\)]*)\\]\\(#.*\\)", RegexOption.MULTILINE)
return text
.replace("](/", "]($parentLink/")
.replace("](./", "]($parentLink/")
.replace(localLinkRegex) { it.groupValues.getOrNull(1) ?: it.value }
}
private fun changeOperatorEnabled(userServers: MutableState<List<UserOperatorServers>>, operatorIndex: Int, enabled: Boolean) {
userServers.value = userServers.value.toMutableList().apply {
this[operatorIndex] = this[operatorIndex].copy(
@@ -242,7 +242,6 @@
<string name="change_self_destruct_mode">تغيير وضع التدمير الذاتي</string>
<string name="change_self_destruct_passcode">تغيير رمز المرور التدمير الذاتي</string>
<string name="confirm_database_upgrades">تأكيد ترقيات قاعدة البيانات</string>
<string name="chat_archive_header">أرشيف الدردشة</string>
<string name="group_member_status_intro_invitation">الاتصال (دعوة مقدمة)</string>
<string name="clear_contacts_selection_button">مسح</string>
<string name="error_creating_link_for_group">خطأ في إنشاء رابط المجموعة</string>
@@ -252,8 +251,6 @@
<string name="group_connection_pending">جار الاتصال…</string>
<string name="connection_request_sent">أرسلت طلب الاتصال!</string>
<string name="chat_database_deleted">حُذفت قاعدة بيانات الدردشة</string>
<string name="chat_archive_section">أرشيف الدردشة</string>
<string name="archive_created_on_ts">نشأ في %1$s</string>
<string name="rcv_conn_event_switch_queue_phase_changing">جارِ تغيير العنوان…</string>
<string name="group_member_status_accepted">جار الاتصال (قُبِل)</string>
<string name="icon_descr_contact_checked">فُحصت جهة الاتصال</string>
@@ -349,7 +346,6 @@
<string name="passphrase_is_different">تختلف عبارة مرور قاعدة البيانات عن تلك المحفوظة في Keystore.</string>
<string name="database_error">خطأ في قاعدة البيانات</string>
<string name="database_upgrade">ترقية قاعدة البيانات</string>
<string name="delete_chat_archive_question">حذف أرشيف الدردشة؟</string>
<string name="num_contacts_selected">حُددت %d جهة اتصال</string>
<string name="button_delete_group">حذف المجموعة</string>
<string name="delete_group_question">حذف المجموعة؟</string>
@@ -372,7 +368,6 @@
<string name="custom_time_unit_days">أيام</string>
<string name="delete_address">حذف العنوان</string>
<string name="database_passphrase_will_be_updated">سيتم تحديث عبارة مرور تعمية قاعدة البيانات.</string>
<string name="delete_archive">حذف الأرشيف</string>
<string name="delete_link_question">حذف الرابط؟</string>
<string name="database_downgrade">الرجوع إلى إصدار سابق من قاعدة البيانات</string>
<string name="set_password_to_export_desc">قاعدة البيانات مُعمّاة باستخدام عبارة مرور عشوائية. يُرجى تغييره قبل التصدير.</string>
@@ -708,7 +703,6 @@
<string name="ensure_ICE_server_address_are_correct_format_and_unique">تأكد من أن عناوين خادم WebRTC ICE بالتنسيق الصحيح، وأن تكون مفصولة بأسطر وليست مكررة.</string>
<string name="mark_code_verified">علّم تحقق منه</string>
<string name="error_saving_user_password">خطأ في حفظ كلمة مرور المستخدم</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[سأل الكثير من الناس: <i>إذا SimpleX ليس لديه معرّفات مستخدم، كيف يمكنه توصيل الرسائل؟</i>]]></string>
<string name="error_saving_group_profile">خطأ في حفظ ملف تعريف المجموعة</string>
<string name="notification_preview_mode_message">رسالة نصية</string>
<string name="message_reactions">ردود فعل الرسائل</string>
@@ -844,7 +838,6 @@
<string name="read_more_in_user_guide_with_link"><![CDATA[اقرأ المزيد في <font color="#0088ff">دليل المستخدم</font>.]]></string>
<string name="auth_open_chat_profiles">افتح ملفات تعريف الدردشة</string>
<string name="revoke_file__confirm">اسحب الوصول</string>
<string name="save_archive">حفظ الأرشيف</string>
<string name="reveal_verb">كشف</string>
<string name="stop_rcv_file__message">سيتم إيقاف استلام الملف.</string>
<string name="reject_contact_button">رفض</string>
@@ -938,7 +931,6 @@
<string name="reset_verb">صفّر</string>
<string name="network_proxy_port">المنفذ %d</string>
<string name="smp_servers_preset_server">خادم محدد مسبقًا</string>
<string name="read_more_in_github">قراءة المزيد في مستودعنا على GitHub.</string>
<string name="relay_server_if_necessary">يتم استخدام خادم الترحيل فقط إذا لزم الأمر. يمكن لطرف آخر مراقبة عنوان IP الخاص بك.</string>
<string name="save_and_notify_contact">حفظ وإشعار جهة الاتصال</string>
<string name="settings_restart_app">إعادة التشغيل</string>
@@ -1221,7 +1213,6 @@
<string name="snd_group_event_user_left">غادرت</string>
<string name="you_must_use_the_most_recent_version_of_database">يجب عليك استخدام أحدث إصدار من قاعدة بيانات الدردشة الخاصة بك على جهاز واحد فقط، وإلا فقد تتوقف عن تلقي الرسائل من بعض جهات الاتصال.</string>
<string name="video_will_be_received_when_contact_is_online">سيتم استلام الفيديو عندما تكون جهة اتصالك متصلة بالإنترنت، يرجى الانتظار أو التحقق لاحقًا!</string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[يمكنك التحكم من خلال الخادم (الخوادم) <b>لاستلام</b> الرسائل وجهات اتصالك - الخوادم التي تستخدمها لمراسلتهم.]]></string>
<string name="you_can_share_this_address_with_your_contacts">يمكنك مشاركة هذا العنوان مع جهات اتصالك للسماح لهم بالاتصال بـ%s.</string>
<string name="snd_group_event_member_deleted">أُزيلت %1$s</string>
<string name="update_database">تحديث</string>
@@ -2047,7 +2038,7 @@
<string name="v6_0_reachable_chat_toolbar_descr">استخدم التطبيق بيد واحدة.</string>
<string name="chat_database_exported_title">صُدرت قاعدة بيانات الدردشة</string>
<string name="v6_0_connection_servers_status">التحكم في شبكتك</string>
<string name="v6_0_delete_many_messages_descr">حذف ما يصل إلى 20 رسالة في وقت واحد.</string>
<string name="v6_0_delete_many_messages_descr">حذف ما يصل إلى 20 رسالة في آن واحد.</string>
<string name="chat_database_exported_not_all_files">لم يتم تصدير بعض الملفات</string>
<string name="v6_0_private_routing_descr">يحمي عنوان IP الخاص بك واتصالاتك.</string>
<string name="network_option_tcp_connection">اتصال TCP</string>
@@ -2119,7 +2110,7 @@
<string name="v6_1_customizable_message_descr">شكل الرسالة قابل للتخصيص.</string>
<string name="v6_1_better_calls_descr">تبديل الصوت والفيديو أثناء المكالمة.</string>
<string name="v6_1_delete_many_messages_descr">حذف أو إشراف ما يصل إلى 200 رسالة.</string>
<string name="v6_1_forward_many_messages_descr">حوّل ما يصل إلى 20 رسالة آن واحد.</string>
<string name="v6_1_forward_many_messages_descr">حوّل ما يصل إلى 20 رسالة في آن واحد.</string>
<string name="v6_1_better_calls">مكالمات أفضل</string>
<string name="v6_1_message_dates_descr">تواريخ أفضل للرسائل.</string>
<string name="v6_1_better_security">أمان أفضل ✅</string>
@@ -675,10 +675,19 @@
<string name="if_you_cant_meet_in_person">If you can\'t meet in person, show QR code in a video call, or share the link.</string>
<!-- User Address Learn More - UserAddressLearnMore.kt -->
<string name="share_address_publicly">Share address publicly</string>
<string name="share_simplex_address_on_social_media">Share SimpleX address on social media.</string>
<string name="you_can_share_your_address">You can share your address as a link or QR code - anybody can connect to you.</string>
<string name="you_wont_lose_your_contacts_if_delete_address">You won\'t lose your contacts if you later delete your address.</string>
<string name="share_1_time_link_with_a_friend">Share 1-time link with a friend</string>
<string name="one_time_link_can_be_used_with_one_contact_only"><![CDATA[1-time link can be used <i>with one contact only</i> - share in person or via any messenger.]]></string>
<string name="you_can_set_connection_name_to_remember">You can set connection name, to remember who the link was shared with.</string>
<string name="connection_security">Connection security</string>
<string name="simplex_address_and_1_time_links_are_safe_to_share">SimpleX address and 1-time links are safe to share via any messenger.</string>
<string name="to_protect_against_your_link_replaced_compare_codes">To protect against your link being replaced, you can compare contact security codes.</string>
<string name="you_can_accept_or_reject_connection">When people request to connect, you can accept or reject it.</string>
<string name="read_more_in_user_guide_with_link"><![CDATA[Read more in <font color="#0088ff">User Guide</font>.]]></string>
<string name="address_or_1_time_link">Address or 1-time link?</string>
<!-- PasteToConnect.kt -->
<string name="connect_via_link">Connect via link</string>
@@ -917,6 +926,11 @@
<string name="invite_friends">Invite friends</string>
<string name="email_invite_subject">Let\'s talk in SimpleX Chat</string>
<string name="email_invite_body">Hi!\nConnect to me via SimpleX Chat: %s</string>
<string name="for_social_media">For social media</string>
<string name="or_to_share_privately">Or to share privately</string>
<string name="simplex_address_or_1_time_link">SimpleX address or 1-time link?</string>
<string name="create_1_time_link">Create 1-time link</string>
<string name="address_settings">Address settings</string>
<!-- CreateSimpleXAddress.kt -->
<string name="continue_to_next_step">Continue</string>
@@ -1012,7 +1026,7 @@
<string name="error_initializing_web_view_wrong_arch">Error initializing WebView. Make sure you have WebView installed and it\'s supported architecture is arm64.\nError: %s</string>
<!-- SimpleXInfo -->
<string name="next_generation_of_private_messaging">The next generation\nof private messaging</string>
<string name="next_generation_of_private_messaging">The future of messaging</string>
<string name="privacy_redefined">Privacy redefined</string>
<string name="first_platform_without_user_ids">No user identifiers.</string>
<string name="immune_to_spam_and_abuse">Immune to spam</string>
@@ -1026,23 +1040,25 @@
<!-- How SimpleX Works -->
<string name="how_simplex_works">How SimpleX works</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[Many people asked: <i>if SimpleX has no user identifiers, how can it deliver messages?</i>]]></string>
<string name="to_protect_privacy_simplex_has_ids_for_queues">To protect privacy, instead of user IDs used by all other platforms, SimpleX has identifiers for message queues, separate for each of your contacts.</string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[You control through which server(s) <b>to receive</b> the messages, your contacts the servers you use to message them.]]></string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages"><![CDATA[Only client devices store user profiles, contacts, groups, and messages sent with <b>2-layer end-to-end encryption</b>.]]></string>
<string name="read_more_in_github">Read more in our GitHub repository.</string>
<string name="to_protect_privacy_simplex_has_ids_for_queues">To protect your privacy, SimpleX uses separate IDs for each of your contacts.</string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages">Only client devices store user profiles, contacts, groups, and messages.</string>
<string name="all_message_and_files_e2e_encrypted"><![CDATA[All messages and files are sent <b>end-to-end encrypted</b>, with post-quantum security in direct messages.]]></string>
<string name="read_more_in_github_with_link"><![CDATA[Read more in our <font color="#0088ff">GitHub repository</font>.]]></string>
<!-- SetNotificationsMode.kt -->
<string name="use_chat">Use chat</string>
<string name="onboarding_notifications_mode_title">Private notifications</string>
<string name="onboarding_notifications_mode_subtitle">It can be changed later via settings.</string>
<string name="onboarding_notifications_mode_subtitle">How it affects battery</string>
<string name="onboarding_notifications_mode_off">When app is running</string>
<string name="onboarding_notifications_mode_periodic">Periodic</string>
<string name="onboarding_notifications_mode_service">Instant</string>
<string name="onboarding_notifications_mode_off_desc"><![CDATA[<b>Best for battery</b>. You will receive notifications only when the app is running (NO background service).]]></string>
<string name="onboarding_notifications_mode_off_desc_short">No background service</string>
<string name="onboarding_notifications_mode_periodic_desc"><![CDATA[<b>Good for battery</b>. App checks messages every 10 minutes. You may miss calls or urgent messages.]]></string>
<string name="onboarding_notifications_mode_periodic_desc_short">Check messages every 10 minutes</string>
<string name="onboarding_notifications_mode_service_desc"><![CDATA[<b>Uses more battery</b>! App always runs in background notifications are shown instantly.]]></string>
<string name="onboarding_notifications_mode_service_desc_short">App always runs in background</string>
<string name="onboarding_notifications_mode_battery">Notifications and battery</string>
<!-- SetupDatabasePassphrase.kt -->
<string name="setup_database_passphrase">Setup database passphrase</string>
@@ -1050,11 +1066,12 @@
<string name="use_random_passphrase">Use random passphrase</string>
<!-- ChooseServerOperators.kt -->
<string name="onboarding_choose_server_operators">Choose operators</string>
<string name="onboarding_choose_server_operators">Server operators</string>
<string name="onboarding_network_operators">Network operators</string>
<string name="onboarding_network_operators_app_will_use_different_operators">When more than one network operator is enabled, the app will use the servers of different operators for each conversation.</string>
<string name="onboarding_network_operators_app_will_use_for_routing">For example, if you receive messages via SimpleX Chat server, the app will use one of Flux servers for private routing.</string>
<string name="onboarding_select_network_operators_to_use">Select network operators to use.</string>
<string name="how_it_helps_privacy">How it helps privacy</string>
<string name="onboarding_network_operators_configure_via_settings">You can configure servers via settings.</string>
<string name="onboarding_network_operators_conditions_will_be_accepted">Conditions will be accepted for enabled operators after 30 days.</string>
<string name="onboarding_network_operators_conditions_you_can_configure">You can configure operators in Network &amp; servers settings.</string>
@@ -1249,6 +1266,7 @@
<!-- DatabaseView.kt -->
<string name="your_chat_database">Your chat database</string>
<string name="run_chat_section">RUN CHAT</string>
<string name="remote_hosts_section">Remote mobiles</string>
<string name="chat_is_running">Chat is running</string>
<string name="chat_is_stopped">Chat is stopped</string>
<string name="chat_database_section">CHAT DATABASE</string>
@@ -1390,14 +1408,6 @@
<string name="start_chat_question">Start chat?</string>
<string name="chat_is_stopped_you_should_transfer_database">Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat.</string>
<!-- ChatArchiveView.kt -->
<string name="chat_archive_header">Chat archive</string>
<string name="chat_archive_section">CHAT ARCHIVE</string>
<string name="save_archive">Save archive</string>
<string name="delete_archive">Delete archive</string>
<string name="archive_created_on_ts">Created on %1$s</string>
<string name="delete_chat_archive_question">Delete chat archive?</string>
<!-- Groups -->
<string name="group_invitation_item_description">invitation to group %1$s</string>
<string name="join_group_question">Join group?</string>
@@ -2278,6 +2288,7 @@
<string name="or_paste_archive_link">Or paste archive link</string>
<string name="paste_archive_link">Paste archive link</string>
<string name="invalid_file_link">Invalid link</string>
<string name="chat_archive">Or import archive file</string>
<string name="migrate_to_device_migrating">Migrating</string>
<string name="migrate_to_device_database_init">Preparing download</string>
<string name="migrate_to_device_downloading_details">Downloading link details</string>
@@ -228,7 +228,6 @@
<string name="chat_database_imported">Базата данни на чат е импортирана</string>
<string name="confirm_new_passphrase">Потвърди новата парола…</string>
<string name="confirm_database_upgrades">Потвърди актуализаациите на базата данни</string>
<string name="chat_archive_header">Архив на чата</string>
<string name="rcv_group_event_member_connected">свързан</string>
<string name="snd_conn_event_switch_queue_phase_changing">промяна на адреса…</string>
<string name="snd_conn_event_switch_queue_phase_changing_for_member">промяна на адреса за %s…</string>
@@ -317,7 +316,6 @@
<string name="change_self_destruct_mode">Промени режима на самоунищожение</string>
<string name="change_self_destruct_passcode">Промени кода за достъп за самоунищожение</string>
<string name="settings_section_title_chats">ЧАТОВЕ</string>
<string name="chat_archive_section">АРХИВ НА ЧАТА</string>
<string name="rcv_conn_event_switch_queue_phase_changing">промяна на адреса…</string>
<string name="maximum_supported_file_size">В момента максималният поддържан размер на файла е %1$s.</string>
<string name="info_row_database_id">ID в базата данни</string>
@@ -341,9 +339,6 @@
<string name="database_downgrade">Понижаване на версията на базата данни</string>
<string name="database_upgrade">Актуализация на базата данни</string>
<string name="mtr_error_no_down_migration">версията на базата данни е по-нова от приложението, но няма миграция надолу за: %s</string>
<string name="archive_created_on_ts">Създаден на %1$s</string>
<string name="delete_archive">Изтрий архив</string>
<string name="delete_chat_archive_question">Изтриване на архива на чата\?</string>
<string name="rcv_group_event_group_deleted">групата изтрита</string>
<string name="icon_descr_contact_checked">Контактът е проверен</string>
<string name="group_member_status_creator">създател</string>
@@ -987,16 +982,13 @@
<string name="opensource_protocol_and_code_anybody_can_run_servers">Протокол и код с отворен код – всеки може да оперира собствени сървъри.</string>
<string name="people_can_connect_only_via_links_you_share">Хората могат да се свържат с вас само чрез ликовете, които споделяте.</string>
<string name="privacy_redefined">Поверителността преосмислена</string>
<string name="read_more_in_github">Прочетете повече в нашето хранилище в GitHub.</string>
<string name="make_private_connection">Добави поверителна връзка</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[Много хора попитаха: <i>ако SimpleX няма потребителски идентификатори, как може да доставя съобщения\?</i>]]></string>
<string name="open_verb">Отвори</string>
<string name="relay_server_if_necessary">Реле сървър се използва само ако е необходимо. Друга страна може да наблюдава вашия IP адрес.</string>
<string name="lock_after">Заключване след</string>
<string name="lock_mode">Режим на заключване</string>
<string name="alert_text_fragment_please_report_to_developers">Моля, докладвайте го на разработчиците.</string>
<string name="protect_app_screen">Защити екрана на приложението</string>
<string name="save_archive">Запази архив</string>
<string name="member_info_section_title_member">ЧЛЕН</string>
<string name="remove_member_confirmation">Премахване</string>
<string name="network_option_ping_count">PING бройка</string>
@@ -1226,7 +1218,6 @@
<string name="network_use_onion_hosts_prefer">Когато са налични</string>
<string name="your_profile_is_stored_on_your_device">Вашият профил, контакти и доставени съобщения се съхраняват на вашето устройство.</string>
<string name="you_can_use_markdown_to_format_messages__prompt">Можете да използвате markdown за форматиране на съобщенията:</string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[Вие контролирате през кой сървър(и) <b>да получавате</b> съобщенията, вашите контакти – сървърите, които използвате, за да им изпращате съобщения.]]></string>
<string name="use_chat">Използвай чата</string>
<string name="update_database">Актуализация</string>
<string name="you_have_to_enter_passphrase_every_time">Трябва да въвеждате парола при всяко стартиране на приложението - тя не се съхранява на устройството.</string>
@@ -303,8 +303,6 @@
<string name="restore_database">Obnovte zálohu databáze</string>
<string name="restore_database_alert_desc">Po obnovení zálohy databáze zadejte předchozí frázi. Tuto akci nelze vrátit zpět.</string>
<string name="chat_is_stopped_indication">Chat je zastaven</string>
<string name="chat_archive_header">Chat se archivuje</string>
<string name="delete_chat_archive_question">Smazat archiv chatu?</string>
<string name="join_group_question">Připojit se ke skupině\?</string>
<string name="join_group_button">Připojte se na</string>
<string name="leave_group_button">Opustit</string>
@@ -352,7 +350,6 @@
<string name="chat_database_imported">Databáze chatu importována</string>
<string name="new_passphrase">Nová přístupová fráze…</string>
<string name="save_passphrase_and_open_chat">Uložte přístupovou frázi a otevřete chat</string>
<string name="chat_archive_section">ARCHIV CHATU</string>
<string name="no_contacts_selected">Nebyl vybrán žádný kontakt</string>
<string name="invite_prohibited_description">Snažíte se pozvat kontakt, se kterým jste sdíleli inkognito profil, do skupiny, ve které používáte svůj hlavní profil</string>
<string name="info_row_group">Skupina</string>
@@ -670,9 +667,6 @@
<string name="first_platform_without_user_ids">Bez uživatelských identifikátorů</string>
<string name="immune_to_spam_and_abuse">Odolná vůči spamu</string>
<string name="to_protect_privacy_simplex_has_ids_for_queues">K ochraně soukromí, místo uživatelských ID užívaných všemi ostatními platformami, SimpleX používá identifikátory pro fronty zpráv, zvlášť pro každý z vašich kontaktů.</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[Mnoho lidí se ptá: <i>když SimpleX nemá žádný identifikátor uživatelů, jak může doručovat zprávy\?</i>]]></string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[Vy určujete, přes které servery <b>přijímat</b> zprávy, vaše kontakty servery, které používáte k zasílání zpráv.]]></string>
<string name="read_more_in_github">Další informace najdete v našem repozitáři na GitHubu.</string>
<string name="read_more_in_github_with_link"><![CDATA[Další informace najdete v našem <font color="#0088ff">úložišti GitHub</font>.]]></string>
<string name="use_chat">Použijte chat</string>
<string name="onboarding_notifications_mode_subtitle">Lze změnit později v nastavení.</string>
@@ -776,10 +770,7 @@
<string name="database_restore_error">Chyba při obnovování databáze</string>
<string name="restore_passphrase_not_found_desc">Přístupová fráze nebyla v klíčence nalezena, zadejte jej prosím ručně. K této situaci mohlo dojít, pokud jste obnovili data aplikace pomocí zálohovacího nástroje. Pokud tomu tak není, obraťte se na vývojáře.</string>
<string name="you_can_start_chat_via_setting_or_by_restarting_the_app">Chat můžete spustit v Nastavení / Databáze nebo restartováním aplikace.</string>
<string name="save_archive">Uložit archiv</string>
<string name="delete_archive">Smazat archiv</string>
<string name="group_invitation_item_description">pozvánka do skupiny %1$s</string>
<string name="archive_created_on_ts">Vytvořeno dne %1$s</string>
<string name="you_are_invited_to_group_join_to_connect_with_group_members">Jste zváni do skupiny. Připojte se k členům skupiny.</string>
<string name="join_group_incognito_button">Připojit se inkognito</string>
<string name="joining_group">Připojit ke skupině</string>
@@ -475,11 +475,8 @@
<string name="how_it_works">Wie es funktioniert</string>
<!-- How SimpleX Works -->
<string name="how_simplex_works">Wie SimpleX funktioniert</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[Viele Menschen haben gefragt: <i>Wie kann SimpleX Nachrichten zustellen, wenn es keine Benutzerkennungen gibt?</i>]]></string>
<string name="to_protect_privacy_simplex_has_ids_for_queues">Zum Schutz Ihrer Privatsphäre verwendet SimpleX anstelle von Benutzerkennungen, die von allen anderen Plattformen verwendet werden, Kennungen für Nachrichtenwarteschlangen, die für jeden Ihrer Kontakte individuell sind.</string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[Sie können selbst festlegen, über welche Server Sie Ihre Nachrichten <b>empfangen</b> und an Ihre Kontakte <b>senden</b> wollen.]]></string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages"><![CDATA[Nur die Endgeräte speichern die Benutzerprofile, Kontakte, Gruppen und Nachrichten, welche über eine <b>zweischichtige Ende-zu-Ende-Verschlüsselung</b> gesendet werden.]]></string>
<string name="read_more_in_github">Erfahren Sie in unserem GitHub-Repository mehr dazu.</string>
<string name="read_more_in_github_with_link"><![CDATA[Erfahren Sie in unserem <font color="#0088ff">GitHub-Repository</font> mehr dazu.]]></string>
<!-- MakeConnection -->
<string name="paste_the_link_you_received">Fügen Sie den erhaltenen Link ein</string>
@@ -672,12 +669,6 @@
<string name="chat_is_stopped_indication">Der Chat wurde beendet</string>
<string name="you_can_start_chat_via_setting_or_by_restarting_the_app">Sie können den Chat über die App-Einstellungen/Datenbank oder durch Neustart der App starten.</string>
<!-- ChatArchiveView.kt -->
<string name="chat_archive_header">Datenbank-Archiv</string>
<string name="chat_archive_section">CHAT-ARCHIV</string>
<string name="save_archive">Archiv speichern</string>
<string name="delete_archive">Archiv löschen</string>
<string name="archive_created_on_ts">Erstellt am %1$s</string>
<string name="delete_chat_archive_question">Chat-Archiv löschen\?</string>
<!-- Groups -->
<string name="group_invitation_item_description">Einladung zur Gruppe %1$s</string>
<string name="join_group_question">Der Gruppe beitreten?</string>
@@ -100,7 +100,6 @@
<string name="database_initialization_error_title">Δεν είναι δυνατή η προετοιμασία της βάσης δεδομένων</string>
<string name="connect__a_new_random_profile_will_be_shared">Ένα νέο τυχαίο προφίλ θα μοιραστεί.</string>
<string name="alert_title_cant_invite_contacts">Δεν είναι δυνατή η πρόσκληση επαφών!</string>
<string name="chat_archive_header">Αρχείο συνομιλίας</string>
<string name="switch_receiving_address">Αλλαγή διεύθυνσης λήψης</string>
<string name="auth_unavailable">Πιστοποίηση μη διαθέσιμη</string>
<string name="change_verb">Αλλαγή</string>
@@ -112,7 +111,6 @@
<string name="alert_text_decryption_error_n_messages_failed_to_decrypt">%1$d αποτυχία κρυπτογράφησης μηνύματος</string>
<string name="snd_conn_event_switch_queue_phase_changing_for_member">αλλαγή διεύθυνσης για %s…</string>
<string name="change_member_role_question">Αλλαγή ρόλου ομάδας;</string>
<string name="chat_archive_section">ΑΡΧΕΙΟ ΣΥΝΟΜΙΛΙΑΣ</string>
<string name="invite_prohibited">Δεν είναι δυνατή η πρόσκληση επαφής!</string>
<string name="v4_2_auto_accept_contact_requests">Αυτόματη αποδοχή αιτήματος επαφής</string>
<string name="callstatus_calling">Κλήση…</string>
@@ -189,7 +187,6 @@
<string name="contact_connection_pending">συνδέεται…</string>
<string name="create_group_link">Δημιουργία σύνδεσμο ομάδας</string>
<string name="connect_to_desktop">Σύνδεση σε επιφάνεια εργασίας</string>
<string name="archive_created_on_ts">Δημιουργήθηκε στις %1$s</string>
<string name="connected_to_mobile">Συνδεδεμένο στο κινητό</string>
<string name="connect_via_link">Σύνδεση μέσω σύνδεσμο</string>
<string name="receipts_section_contacts">Επαφές</string>
@@ -243,4 +240,159 @@
<string name="add_address_to_your_profile">Προσθέστε τη διεύθυνση στο προφίλ σας, έτσι ώστε οι επαφές σας να μπορούν να τη μοιραστούν με άλλα άτομα. Το ενημέρωμένο προφίλ θα σταλεί στις επαφές σας.</string>
<string name="feature_roles_admins">διαχειριστές</string>
<string name="acknowledgement_errors">Λάθη αναγνώρισης</string>
<string name="migrate_from_device_archive_will_be_deleted"><![CDATA[<b>Προειδοποίηση</b>: το αρχείο θα διαγραφεί.]]></string>
<string name="snd_error_quota">Υπέρβαση χωρητικότητας - ο παραλήπτης δεν έλαβε μηνύματα που στάλθηκαν προηγουμένως.</string>
<string name="blocked_by_admin_item_description">αποκλεισμένος από τον διαχειριστή</string>
<string name="your_chats">Συνομιλίες</string>
<string name="feature_roles_all_members">όλα τα μέλη</string>
<string name="all_your_contacts_will_remain_connected_update_sent">Όλες οι επαφές σας θα παραμείνουν ενεργές. Το ανανεωμένο προφίλ σας θα αποσταλεί στις επαφές σας.</string>
<string name="network_smp_proxy_mode_always_description">Να χρησιμοποιείται πάντα ιδιωτική δρομολόγηση.</string>
<string name="empty_chat_profile_is_created">Ένα κενό προφίλ συνομιλίας με το παρεχόμενο όνομα δημιουργείται και η εφαρμογή ανοίγει ως συνήθως.</string>
<string name="chat_database_deleted">Η βάση δεδομένων της συνομιλίας διαγράφηκε</string>
<string name="icon_descr_audio_off">Απενεργοποίηση ήχου</string>
<string name="icon_descr_audio_on">Eνεργοποίηση ήχου</string>
<string name="alert_title_msg_bad_hash">Κακό μήνυμα hash</string>
<string name="privacy_media_blur_radius">Θάμπωση των μέσων</string>
<string name="settings_section_title_chat_database">ΒΑΣΗ ΔΕΔΟΜΕΝΩΝ ΣΥΝΟΜΙΛΙΑΣ</string>
<string name="keychain_is_storing_securely">Το Android Keystore χρησιμοποιείται για την ασφαλή αποθήκευση της φράσης πρόσβασης - επιτρέπει την υπηρεσία ειδοποιήσεων να λειτουργεί.</string>
<string name="member_info_member_blocked">αποκλεισμένος</string>
<string name="member_blocked_by_admin">Αποκλεισμένος από τον διαχειριστή</string>
<string name="cant_call_contact_alert_title">Δεν είναι δυνατή η κλήση επαφής</string>
<string name="theme_destination_app_theme">Θέμα εφαρμογής</string>
<string name="chat_theme_apply_to_mode">Εφαρμογή σε</string>
<string name="v5_3_encrypt_local_files_descr">Η εφαρμογή κρυπτογραφεί νέα τοπικά αρχεία (εκτός απο βίντεο).</string>
<string name="v5_4_better_groups">Καλύτερες ομάδες</string>
<string name="connect_plan_already_joining_the_group">Γίνεται ήδη συμμετοχή στην ομάδα!</string>
<string name="migrate_from_device_archive_and_upload">Αρχειοθέτηση και αποστολή</string>
<string name="n_other_file_errors">%1$d διαφορετικό/κα σφάλμα/τα αρχείου/ων.</string>
<string name="notifications_mode_service_desc">Η υπηρεσία παρασκηνίου λειτουργεί πάντα - οι ειδοποιήσεις θα εμφανίζονται μόλις τα μηνύματα είναι διαθέσιμα.</string>
<string name="forward_files_in_progress_desc">%1$d αρχείο/α ακόμα κατεβαίνουν.</string>
<string name="forward_files_failed_to_receive_desc">%1$d αρχείο/α απέτυχε/χαν να παραληφθεί/ουν</string>
<string name="forward_files_missing_desc">%1$d αρχείο/α διαγράφηκε/καν.</string>
<string name="forward_files_not_accepted_desc">%1$d αρχείο/α δεν κατέβηκε/καν.</string>
<string name="forward_files_messages_deleted_after_selection_title">%1$s μήνυμα/τα δεν προωθήθηκε/καν</string>
<string name="network_session_mode_user">Προφίλ συνομιλίας</string>
<string name="network_session_mode_user_description"><![CDATA[Μια ξεχωριστή σύνδεση TCP (και διαπιστευτήριο SOCKS) θα χρησιμοποιηθεί <b>για κάθε προφίλ συνομιλίας που έχετε στην εφαρμογή</b>.]]></string>
<string name="socks_proxy_setting_limitations"><![CDATA[<b>Παρακαλώ σημειώστε</b>: οι αναμεταδότες μηνυμάτων και αρχείων συνδέονται μέσω διακομιστή μεσολάβησης SOCKS. Οι κλήσεις και οι προεπισκοπήσεις συνδέσμων αποστολής χρησιμοποιούν άμεση σύνδεση.]]></string>
<string name="network_smp_proxy_mode_always">Πάντα</string>
<string name="app_check_for_updates_download_completed_title">Η ενημέρωση της εφαρμογής κατεβαίνει</string>
<string name="app_check_for_updates_notice_title">Έλεγχος για ενημερώσεις</string>
<string name="opensource_protocol_and_code_anybody_can_run_servers">Οποιοσδήποτε μπορεί να φιλοξενήσει διακομιστές.</string>
<string name="audio_call_no_encryption">κλήση ήχου (χωρίς κρυπτογράφηση e2e)</string>
<string name="call_on_lock_screen">Κλήσεις στην οθόνη κλειδώματος:</string>
<string name="call_service_notification_audio_call">Κλήση ήχου</string>
<string name="app_version_code">\'Εκδοση Εφαρμογής: %s</string>
<string name="calls_prohibited_with_this_contact">Απαγορεύονται οι κλήσεις ήχου/βίντεο.</string>
<string name="v5_4_block_group_members">Αποκλεισμός μελών ομάδας</string>
<string name="chunks_deleted">Τα chunks διαγράφηκαν</string>
<string name="v5_1_self_destruct_passcode_descr">Όλα τα δεδομένα διαγράφονται κατά την εισαγωγή.</string>
<string name="deleted_chats">Αρχειοθετημένες επαφές</string>
<string name="migrate_from_device_cancel_migration">Ακύρωση μεταφοράς</string>
<string name="settings_section_title_chat_colors">Χρώματα συνομιλίας</string>
<string name="chat_database_section">ΒΑΣΗ ΔΕΔΟΜΕΝΩΝ ΣΥΝΟΜΙΛΙΑΣ</string>
<string name="chat_is_running">Η συνομιλία εκτελείται</string>
<string name="impossible_to_recover_passphrase"><![CDATA[<b>Παρακαλώ σημειώστε</b>: ΔΕΝ θα μπορείτε να ανακτήσετε ή να αλλάξετε τη φράση πρόσβασης εάν τη χάσετε.]]></string>
<string name="block_for_all">Αποκλεισμός για όλους</string>
<string name="both_you_and_your_contact_can_add_message_reactions">Και εσείς και η επαφή σας μπορείτε να προσθέστε αντιδράσεις μηνυμάτων.</string>
<string name="both_you_and_your_contact_can_make_calls">Και εσείς και η επαφή σας μπορείτε να κάνετε κλήσεις.</string>
<string name="allow_to_send_simplex_links">Επιτρέψτε την αποστολή συνδέσμων SimpleX.</string>
<string name="v5_3_new_interface_languages_descr">Αραβικά, Βουλγαρικά, Φινλανδικά, Εβραϊκά, Ταϊλανδέζικα και Ουκρανικά - χάρη στους χρήστες και το Weblate.</string>
<string name="v5_6_app_data_migration">Μεταφορά δεδομένων εφαρμογής</string>
<string name="v6_0_privacy_blur">Θάμπωμα για καλύτερη ιδιωτικότητα.</string>
<string name="migrate_to_device_chat_migrated">Η συνομιλία έχει μεταφερθεί!</string>
<string name="migrate_from_device_archiving_database">Αρχειοθέτηση της βάσης δεδομένων</string>
<string name="migrate_from_device_all_data_will_be_uploaded">Όλες οι επαφές, συζητήσεις και αρχεία θα κρυπτογραφηθούν με ασφάλεια και θα μεταφορτωθούν σε διαμορφωμένα κομμάτια αναμετάδοσης XFTP.</string>
<string name="network_type_cellular">Κινητή τηλεφωνία</string>
<string name="create_group_button_to_create_new_group"><![CDATA[<b> Δημιουργία ομάδας </b>: για την δημιουργίας νέας ομάδας.]]></string>
<string name="migrate_from_device_check_connection_and_try_again">Ελέγξτε τη σύνδεσή σας στο διαδίκτυο και δοκιμάστε ξανά</string>
<string name="chat_with_developers">Συζήτηση με τους προγραμματιστές</string>
<string name="icon_descr_video_asked_to_receive">Ζήτησε να λάβει το βίντεο</string>
<string name="cant_send_message_to_member_alert_title">Δεν είναι δυνατή η αποστολή μηνυμάτων στο μέλος της ομάδας</string>
<string name="change_lock_mode">Αλλαγή λειτουργίας κλειδώματος</string>
<string name="rcv_group_event_member_blocked">αποκλεισμένος %s</string>
<string name="rcv_conn_event_switch_queue_phase_completed">άλλαξε η διεύθυνση για εσάς</string>
<string name="rcv_group_and_other_events">και %d άλλες εκδηλώσεις</string>
<string name="theme_black">Μαύρο</string>
<string name="color_secondary_variant">Πρόσθετο δευτερεύον</string>
<string name="both_you_and_your_contacts_can_delete">Και εσείς και η επαφή σας μπορείτε να διαγράψετε απεσταλμένα μηνύματα χωρίς ανατροπή. (24 ώρες)</string>
<string name="both_you_and_your_contact_can_send_voice">Και εσείς και η επαφή σας μπορείτε να στείλετε ηχητικά μηνύματα.</string>
<string name="chat_is_stopped_indication">Η συνομιλία σταμάτησε</string>
<string name="chat_is_stopped_you_should_transfer_database">Η συνομιλία έχει διακοπεί. Εάν χρησιμοποιήσατε ήδη αυτήν τη βάση δεδομένων σε άλλη συσκευή, θα πρέπει να τη μεταφέρετε πίσω προτού ξεκινήσετε τη συνομιλία.</string>
<string name="turning_off_service_and_periodic">Η λειτουργία βελτιστοποίησης της μπαταρίας είναι ενεργή, η υπηρεσία παρασκηνίου και τα περιοδικά αιτήματα για νέα μηνύματα θα απενεργοποιηθούν. Μπορείτε να τα ενεργοποιήσετε ξανά μέσω των ρυθμίσεων.</string>
<string name="one_time_link_short">σύνδεσμος μιας χρήσης</string>
<string name="settings_audio_video_calls">Κλήσεις ήχου &amp; βίντεο</string>
<string name="audio_video_calls">Κλήσεις ήχου/βίντεο</string>
<string name="la_app_passcode">Κωδικός εφαρμογής</string>
<string name="network_session_mode_session">Συνεδρία εφαρμογής</string>
<string name="chat_is_stopped">Η συνομιλία σταμάτησε</string>
<string name="app_check_for_updates">Έλεγχος για ενημερώσεις</string>
<string name="v4_6_chinese_spanish_interface">Κινεζική και Ισπανική διεπαφή</string>
<string name="v6_1_message_dates_descr">Καλύτερες ημερομηνίες μηνυμάτων</string>
<string name="audio_device_bluetooth">Bluetooth</string>
<string name="bold_text">έντονο</string>
<string name="chat_console">Κονσόλα συνομιλίας</string>
<string name="migrate_from_device_using_on_two_device_breaks_encryption"><![CDATA[<b>Παρακαλώ σημειώστε</b>: η χρήση της ίδιας βάσης δεδομένων σε δύο συσκευές θα διακόψει την αποκρυπτογράφηση των μηνυμάτων από τις συνδέσεις σας, ως προστασία ασφαλείας.]]></string>
<string name="onboarding_notifications_mode_service_desc"><![CDATA[<b>Χρησιμοποιεί περισσότερη μπαταρία</b>! Η εφαρμογή εκτελείται πάντα στο παρασκήνιο - οι ειδοποιήσεις εμφανίζονται αμέσως.]]></string>
<string name="chat_database_exported_title">Η βάση δεδομένων της συνομιλίας εξάχθηκε</string>
<string name="info_view_call_button">κλήση</string>
<string name="bad_desktop_address">Κακή διεύθυνση Desktop</string>
<string name="migrate_from_device_choose_migrate_from_another_device"><![CDATA[Επιλέξτε <i> Μεταφορά απο άλλη συσκευή </i> στη νέα συσκευή και σαρώστε τον κωδικό QR.]]></string>
<string name="v4_5_transport_isolation_descr">Με προφίλ συνομιλίας (προεπιλογή) ή μέσω σύνδεσης (BETA).</string>
<string name="permissions_camera_and_record_audio">Κάμερα και μικρόφωνο</string>
<string name="v5_3_new_interface_languages">6 νέες γλώσσες διεπαφής</string>
<string name="onboarding_notifications_mode_periodic_desc"><![CDATA[<b>Καλό για την μπαταρία</b>. Η εφαρμογή ελέγχει για την παραλαβή μηνυμάτων κάθε 10 λεπτά. Ενδέχεται να χάσετε κλήσεις ή επείγοντα μηνύματα.]]></string>
<string name="attach">Επισύναψη</string>
<string name="abort_switch_receiving_address_question">Διακοπή αλλαγής διεύθυνσης;</string>
<string name="choose_file_title">Επιλέξτε ένα αρχείο</string>
<string name="block_member_desc">Όλα τα νέα μηνύνματα απο %s θα αποκρυφθούν!</string>
<string name="cannot_receive_file">Δεν είναι δυνατή η λήψη του αρχείου</string>
<string name="la_authenticate">Πιστοποίηση</string>
<string name="clear_note_folder_warning">Όλα τα μηνύματα θα διαγραφούν - αυτή η ενέργεια δεν μπορεί να αντιστραφεί!</string>
<string name="notifications_mode_periodic_desc">Ελέγχει νέα μηνύματα κάθε 10 λεπτά για έως και 1 λεπτό</string>
<string name="notifications_mode_off_desc">Η εφαρμογή μπορεί να λαμβάνει ειδοποιήσεις μόνο όταν εκτελείται, καμία υπηρεσία δεν θα ξεκινήσει στο παρασκήνιο</string>
<string name="it_can_disabled_via_settings_notifications_still_shown"><![CDATA[<b>Μπορεί να απενεργοποιηθεί μέσω των ρυθμίσεων</b> – οι ειδοποιήσεις θα εξακολουθούν να εμφανίζονται ενώ η εφαρμογή εκτελείται.]]></string>
<string name="allow_your_contacts_adding_message_reactions">Επιτρέψτε τις επαφές σας να χρησιμοποιούν αντιδράσεις μηνυμάτων.</string>
<string name="both_you_and_your_contact_can_send_disappearing">Και εσείς και η επαφή σας μπορείτε να στείλετε μηνύματα που εξαφανίζονται.</string>
<string name="camera_not_available">Κάμερα μη διαθέσιμη</string>
<string name="smp_servers_check_address">Ελέγξτε την διεύθυνση του διακομιστή και δοκιμάστε ξανά.</string>
<string name="allow_message_reactions_only_if">Επιτρέψτε αντιδράσεις μηνυμάτων εφόσον οι επαφές σας το επιτρέπουν.</string>
<string name="alert_text_decryption_error_too_many_skipped">%1$d μήνυμα/τα παραλήφθηκε/καν.</string>
<string name="calls_prohibited_alert_title">Κλήσεις απογορευμένες!</string>
<string name="cannot_share_message_alert_title">Δεν είναι δυνατή η αποστολή μηνύματος</string>
<string name="call_already_ended">Η κλήση έχει ήδη τερματιστεί!</string>
<string name="app_passcode_replaced_with_self_destruct">Ο κωδικός πρόσβασης της εφαρμογής αντικαθίσταται με κωδικό πρόσβασης αυτοκαταστροφής.</string>
<string name="keychain_allows_to_receive_ntfs">Το Android Keystore θα χρησιμοποιηθεί για την ασφαλή αποθήκευση της φράσης πρόσβασης μετά την επανεκκίνηση της εφαρμογής ή την αλλαγή της φράσης πρόσβασης - θα επιτρέπει τη λήψη ειδοποιήσεων.</string>
<string name="cannot_access_keychain">Δεν είναι δυνατή η πρόσβαση στο Keystore για αποθήκευση του κωδικού πρόσβασης της βάσης δεδομένων</string>
<string name="block_member_button">Αποκλεισμός μέλους</string>
<string name="block_member_question">Αποκλεισμός μέλους;</string>
<string name="chat_preferences">Προτιμήσεις συνομιλίας</string>
<string name="v5_1_better_messages">Καλύτερα μηνύματα</string>
<string name="migrate_to_device_apply_onion">Εφαρμογή</string>
<string name="network_smp_proxy_fallback_allow_downgrade">Συνέναιση υποβάθμισης</string>
<string name="permissions_camera">Κάμερα</string>
<string name="icon_descr_audio_call">κλήση ήχου</string>
<string name="v6_0_your_contacts_descr">Αρχειοθετήστε τις επαφές για να συνομιλήσετε αργότερα.</string>
<string name="all_users">Όλα τα προφίλ</string>
<string name="integrity_msg_skipped">%1$d μηνύμα/τα παραλείφθηκε/καν</string>
<string name="integrity_msg_bad_hash">κακό μήνυμα hash</string>
<string name="integrity_msg_bad_id">κακό αναγνωριστικό μηνύματος</string>
<string name="answer_call">Απάντηση κλήσης</string>
<string name="alert_title_msg_bad_id">Κακό αναγνωριστικό μηνύματος</string>
<string name="settings_section_title_chats">ΣΥΝΟΜΙΛΙΕΣ</string>
<string name="chat_database_imported">Η βάση δεδεδομένων της συνομιλίας εισάχθηκε</string>
<string name="snd_conn_event_ratchet_sync_started">"συμφωνία κρυπτογράφησης για %s…"</string>
<string name="allow_calls_question">Να επιτραπούν οι κλήσεις;</string>
<string name="block_for_all_question">Αποκλεισμός μέλους για όλους;</string>
<string name="v4_6_audio_video_calls">Κλήσεις ήχου και βίντεο</string>
<string name="attempts_label">προσπάθειες</string>
<string name="settings_section_title_chat_theme">Θέμα συνομιλίας</string>
<string name="v6_1_better_security">Καλύτερη ασφάλεια✅</string>
<string name="v6_1_better_user_experience">Καλύτερη εμπειρία χρήστη</string>
<string name="cant_call_member_alert_title">Δεν είναι δυνατή η κλήση μέλους ομάδας</string>
<string name="icon_descr_asked_to_receive">Ζήτησε να λάβει την εικόνα</string>
<string name="network_session_mode_entity_description"><![CDATA[Μια ξεχωριστή σύνδεση TCP (και διαπιστευτήριο SOCKS) θα χρησιμοποιηθεί <b> για κάθε επαφή και μέλος ομάδας </b>.\n<b>Λάβετε υπόψη</b>: εάν έχετε πολλές συνδέσεις, η κατανάλωση της μπαταρίας και της κυκλοφορίας μπορεί να είναι σημαντικά υψηλότερη και ορισμένες συνδέσεις μπορεί να αποτύχουν.]]></string>
<string name="add_contact_button_to_create_link_or_connect_via_link"><![CDATA[<b> Προσθήκη επαφής </b>: για να δημιουργήσετε έναν νέο σύνδεσμο πρόσκλησης ή να συνδεθείτε μέσω ενός συνδέσμου που λάβατε.]]></string>
<string name="onboarding_notifications_mode_off_desc"><![CDATA[<b> Καλύτερο για τη ζωή της μπαταρίας </b>. Θα λαμβάνετε ειδοποιήσεις μόνο όταν εκτελείται η εφαρμογή (ΧΩΡΙΣ υπηρεσία παρασκηνίου).]]></string>
<string name="app_check_for_updates_beta">Beta</string>
<string name="v6_1_better_calls">Καλύτερες κλήσεις</string>
</resources>
@@ -191,7 +191,6 @@
<string name="callstate_connecting">conectando…</string>
<string name="decentralized">Descentralizada</string>
<string name="database_will_be_encrypted">La base de datos será cifrada.</string>
<string name="delete_chat_archive_question">¿Eliminar archivo del chat\?</string>
<string name="create_group_link">Crear enlace de grupo</string>
<string name="delete_link">Eliminar enlace</string>
<string name="users_delete_question">¿Eliminar perfil?</string>
@@ -215,8 +214,6 @@
<string name="ttl_d">%dd</string>
<string name="ttl_days">%d días</string>
<string name="delete_files_and_media_question">¿Eliminar archivos y multimedia\?</string>
<string name="archive_created_on_ts">Creado: %1$s</string>
<string name="delete_archive">Eliminar archivo</string>
<string name="group_member_status_connected">conectado</string>
<string name="conn_level_desc_direct">directa</string>
<string name="chat_preferences_contact_allows">El contacto permite</string>
@@ -289,8 +286,6 @@
<string name="icon_descr_call_progress">Llamada en curso</string>
<string name="change_database_passphrase_question">¿Cambiar contraseña de la base de datos\?</string>
<string name="cannot_access_keychain">No se puede acceder a Keystore para guardar la base de datos de contraseñas</string>
<string name="chat_archive_header">Archivo del chat</string>
<string name="chat_archive_section">ARCHIVOS DE CHAT</string>
<string name="cancel_verb">Cancelar</string>
<string name="icon_descr_cancel_live_message">Cancelar mensaje en directo</string>
<string name="confirm_verb">Confirmar</string>
@@ -447,7 +442,7 @@
<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 están duplicadas.</string>
<string name="icon_descr_instant_notifications">Notificación instantánea</string>
<string name="network_settings_title">Configuración avanzada</string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages"><![CDATA[Sólo los dispositivos cliente almacenan perfiles de usuario, contactos, grupos y mensajes enviados con <b>cifrado de extremo a extremo de 2 capas</b> .]]></string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages">Sólo los dispositivos cliente almacenan perfiles de usuario, contactos, grupos y mensajes.</string>
<string name="onboarding_notifications_mode_subtitle">Puedes cambiar estos ajustes más tarde en Configuración.</string>
<string name="onboarding_notifications_mode_service">Instantánea</string>
<string name="join_group_button">Unirte</string>
@@ -510,7 +505,6 @@
<string name="network_use_onion_hosts_required_desc">Se requieren hosts .onion para la conexión
\nRecuerda: no podrás conectarte a servidores que no tengan dirección .onion.</string>
<string name="immune_to_spam_and_abuse">Inmune al spam</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[Muchos se preguntarán: <i>si SimpleX no tiene identificadores de usuario, ¿cómo puede entregar los mensajes\?</i>]]></string>
<string name="incoming_video_call">Videollamada entrante</string>
<string name="snd_group_event_user_left">has salido</string>
<string name="snd_conn_event_switch_queue_phase_completed">has cambiado de servidor</string>
@@ -656,13 +650,11 @@
<string name="callstate_received_confirmation">confirmación recibida…</string>
<string name="onboarding_notifications_mode_periodic">Periódico</string>
<string name="privacy_redefined">Privacidad redefinida</string>
<string name="read_more_in_github">Conoce más en nuestro repositorio GitHub.</string>
<string name="reject">Rechazar</string>
<string name="open_verb">Abrir</string>
<string name="icon_descr_call_pending_sent">Llamada pendiente</string>
<string name="privacy_and_security">Privacidad y Seguridad</string>
<string name="store_passphrase_securely_without_recover">Guarda la contraseña de forma segura, NO podrás acceder al chat si la pierdes.</string>
<string name="save_archive">Guardar archivo</string>
<string name="restore_database_alert_desc">Introduce la contraseña anterior después de restaurar la copia de seguridad de la base de datos. Esta acción no se puede deshacer.</string>
<string name="rcv_group_event_user_deleted">te ha expulsado</string>
<string name="receiving_via">Recibiendo vía</string>
@@ -757,7 +749,7 @@
<string name="add_contact_or_create_group">Inciar chat nuevo</string>
<string name="stop_chat_to_export_import_or_delete_chat_database">Para exportar, importar o eliminar la base de datos debes parar SimpleX. Mientra tanto no podrás recibir o enviar mensajes.</string>
<string name="thank_you_for_installing_simplex">Gracias por instalar SimpleX Chat!</string>
<string name="to_protect_privacy_simplex_has_ids_for_queues">Para proteger tu privacidad, en lugar de los identificadores de usuario que usan el resto de plataformas, SimpleX dispone de identificadores para las colas de mensajes, independientes para cada uno de tus contactos.</string>
<string name="to_protect_privacy_simplex_has_ids_for_queues">Para proteger tu privacidad, SimpleX 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 el Bloqueo SimpleX.
\nSe te pedirá que completes la autenticación antes de activar esta función.</string>
<string name="updating_settings_will_reconnect_client_to_all_servers">Al actualizar la configuración el cliente se reconectará a todos los servidores.</string>
@@ -849,7 +841,6 @@
<string name="you_are_invited_to_group">Has sido invitado al grupo</string>
<string name="v4_3_voice_messages">Mensajes de voz</string>
<string name="v4_3_irreversible_message_deletion_desc">Tus contactos pueden permitir la eliminación completa de mensajes.</string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[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 no están permitidos en este grupo.</string>
<string name="v4_4_verify_connection_security">Comprobar la seguridad de la conexión</string>
@@ -733,8 +733,6 @@
<string name="decentralized">نامتمرکز</string>
<string name="create_your_profile">نمایه خود را ایجاد کنید</string>
<string name="how_simplex_works">SimpleX چگونه کار می‌کند</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[اشخاص زیادی پرسیده‌اند: <i>اگر SimpleX هیچ شناسه کاربری ندارد، چگونه می‌تواند پیام‌ها را تحویل دهد؟</i>]]></string>
<string name="read_more_in_github">مطالعه بیشتر در مخزن GitHub ما.</string>
<string name="read_more_in_github_with_link"><![CDATA[مطالعه بیشتر در <font color="#0088ff">مخزن GitHub</font> ما.]]></string>
<string name="use_chat">استفاده از گپ</string>
<string name="onboarding_notifications_mode_off_desc"><![CDATA[<b>بهترین گزینه برای باتری</b>. شما اعلان‌ها را فقط وقتی دریافت می‌کنید که برنامه در حال اجراست (بدون سرویس پس‌زمینه).]]></string>
@@ -777,7 +775,6 @@
<string name="audio_device_bluetooth">بلوتوث</string>
<string name="import_database">وارد کردن پایگاه داده</string>
<string name="people_can_connect_only_via_links_you_share">اشخاص فقط از طریق لینک‌هایی که به اشتراک می‌گذارید می‌توانند به شما متصل شوند.</string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[شما کنترل می‌کنید پیام‌ها از طریق چه سرورهایی <b>دریافت شوند</b> و از چه سرورهایی به مخاطبان خود پیام می‌فرستید.]]></string>
<string name="call_already_ended">تماس از پیش پایان یافته!</string>
<string name="integrity_msg_bad_hash">هش پیام ناصحیح</string>
<string name="auto_accept_images">پذیرفتن خودکار تصاویر</string>
@@ -956,9 +953,6 @@
<string name="enable_automatic_deletion_question">حذف خودکار پیام فعال شود؟</string>
<string name="restore_database_alert_confirm">برگرداندن</string>
<string name="upgrade_and_open_chat">ارتقا و گشودن گپ</string>
<string name="chat_archive_header">آرشیو گپ</string>
<string name="save_archive">ذخیره آرشیو</string>
<string name="delete_archive">حذف آرشیو</string>
<string name="group_invitation_item_description">دعوت به گروه %1$s</string>
<string name="join_group_question">به گروه می‌پیوندید؟</string>
<string name="leave_group_button">ترک</string>
@@ -1092,9 +1086,6 @@
<string name="mtr_error_no_down_migration">نسخه پایگاه داده از برنامه جدیدتر است، اما بدون جابه‌جایی تنزلی برای: %s</string>
<string name="mtr_error_different">جابه‌جایی متفاوت در برنامه/پایگاه داده: %s / %s</string>
<string name="database_migrations">جابه‌جایی‌ها: %s</string>
<string name="chat_archive_section">آرشیو گپ</string>
<string name="archive_created_on_ts">ایجاد شده در %1$s</string>
<string name="delete_chat_archive_question">آرشیو گپ حذف شود؟</string>
<string name="you_are_invited_to_group_join_to_connect_with_group_members">شما به گروه دعوت شده‌اید. برای متصل شدن به اعضای گروه، به گروه بپیوندید.</string>
<string name="join_group_incognito_button">پیوستن به صورت ناشناس</string>
<string name="alert_message_no_group">این گروه دیگر وجود ندارد.</string>
@@ -108,7 +108,6 @@
<string name="about_simplex">Tietoja SimpleX:stä</string>
<string name="decentralized">Hajautettu</string>
<string name="icon_descr_audio_off">Ääni pois päältä</string>
<string name="chat_archive_section">ARKISTO</string>
<string name="change_role">Vaihda rooli</string>
<string name="full_deletion">Poista kaikilta</string>
<string name="empty_chat_profile_is_created">Luodaan tyhjä chat-profiili annetulla nimellä, ja sovellus avautuu normaalisti.</string>
@@ -168,9 +167,6 @@
<string name="theme_dark">Tumma</string>
<string name="la_auth_failed">Tunnistautuminen epäonnistui</string>
<string name="smp_servers_preset_add">Lisää esiasetettuja palvelimia</string>
<string name="chat_archive_header">Arkisto</string>
<string name="delete_chat_archive_question">Poista keskusteluarkisto\?</string>
<string name="archive_created_on_ts">Luotu %1$s</string>
<string name="rcv_group_event_group_deleted">poistettu ryhmä</string>
<string name="group_member_status_connecting">yhdistää</string>
<string name="group_member_status_accepted">yhdistäminen (hyväksytty)</string>
@@ -326,7 +322,6 @@
<string name="database_downgrade">Tietokannan alentaminen</string>
<string name="database_upgrade">Tietokannan päivitys</string>
<string name="database_will_be_encrypted">Tietokanta salataan.</string>
<string name="delete_archive">Poista arkisto</string>
<string name="group_member_status_intro_invitation">yhdistäminen (esittelykutsu)</string>
<string name="info_row_deleted_at">Poistettu klo</string>
<string name="change_verb">Muuta</string>
@@ -662,7 +657,6 @@
<string name="network_option_ping_interval">PING-väli</string>
<string name="users_delete_with_connections">Profiili- ja palvelinyhteydet</string>
<string name="set_group_preferences">Aseta ryhmän asetukset</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[Monet ovat kysyneet: <i>jos SimpleX ei sisällä käyttäjätunnuksia, kuinka se voi toimittaa viestejä\?</i>]]></string>
<string name="conn_stats_section_title_servers">PALVELIMET</string>
<string name="save_and_notify_contact">Tallenna ja ilmoita kontaktille</string>
<string name="save_and_notify_contacts">Tallenna ja ilmoita kontakteille</string>
@@ -840,7 +834,6 @@
<string name="read_more_in_github_with_link"><![CDATA[Lue lisää <font color="#0088ff">GitHub-arkistostamme</font>.]]></string>
<string name="onboarding_notifications_mode_periodic">Säännölliset</string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages"><![CDATA[Vain asiakaslaitteet tallentavat käyttäjäprofiileja, yhteystietoja, ryhmiä ja viestejä, jotka on lähetetty <b>2-kerroksisella päästä päähän -salauksella</b>.]]></string>
<string name="read_more_in_github">Lue lisää GitHub-tietovarastostamme.</string>
<string name="paste_the_link_you_received">Liitä vastaanotettu linkki</string>
<string name="relay_server_protects_ip">Välityspalvelin suojaa IP-osoitteesi, mutta se voi tarkkailla puhelun kestoa.</string>
<string name="open_simplex_chat_to_accept_call">Avaa SimpleX Chat hyväksyäksesi puhelun</string>
@@ -969,7 +962,6 @@
<string name="smp_server_test_secure_queue">Turvallinen jono</string>
<string name="restore_passphrase_not_found_desc">Tunnuslausetta ei löydy Keystoresta, kirjoita se manuaalisesti. Tämä on saattanut tapahtua, jos olet palauttanut sovelluksen tiedot varmuuskopiointityökalulla. Jos näin ei ole, ota yhteyttä kehittäjiin.</string>
<string name="restore_database_alert_desc">Anna edellinen salasana tietokannan varmuuskopion palauttamisen jälkeen. Tätä toimintoa ei voi kumota.</string>
<string name="save_archive">Tallenna arkisto</string>
<string name="non_fatal_errors_occured_during_import">Tuonnin aikana tapahtui joitakin ei-vakavia virheitä saatat nähdä Chat-konsolissa lisätietoja.</string>
<string name="info_row_updated_at">Tietue päivitetty klo</string>
<string name="info_row_moderated_at">Moderoitu klo</string>
@@ -1057,7 +1049,6 @@
<string name="waiting_for_file">Odottaa tiedostoa</string>
<string name="to_start_a_new_chat_help_header">Aloita uusi keskustelu</string>
<string name="using_simplex_chat_servers">Käyttää SimpleX Chat -palvelimia.</string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[Sinä päätät, minkä palvelimien kautta viestit <b>vastaanotetaan</b>, kontaktiesi palvelimet, joita käytät viestien lähettämiseen.]]></string>
<string name="your_privacy">Yksityisyytesi</string>
<string name="snd_group_event_member_deleted">poistit %1$s</string>
<string name="chat_preferences_yes">kyllä</string>
@@ -321,7 +321,6 @@
<string name="ensure_ICE_server_address_are_correct_format_and_unique">Assurez-vous que les adresses des serveurs WebRTC ICE sont au bon format et ne sont pas dupliquées, un par ligne.</string>
<string name="network_enable_socks_info">Accéder aux serveurs via un proxy SOCKS sur le port %d \? Le proxy doit être démarré avant d\'activer cette option.</string>
<string name="network_use_onion_hosts">Utiliser les hôtes .onions</string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[Vous contrôlez par quel·s serveur·s vous pouvez <b>transmettre</b> ainsi que par quel·s serveur·s vous pouvez <b>recevoir</b> les messages de vos contacts.]]></string>
<string name="your_settings">Vos paramètres</string>
<string name="chat_lock">SimpleX Lock</string>
<string name="chat_console">Console du chat</string>
@@ -372,7 +371,6 @@
<string name="callstate_connecting">connexion…</string>
<string name="opensource_protocol_and_code_anybody_can_run_servers">N\'importe qui peut heberger un serveur.</string>
<string name="to_protect_privacy_simplex_has_ids_for_queues">Pour protéger votre vie privée, au lieu d\'IDs utilisés par toutes les autres plateformes, SimpleX possède des IDs pour les queues de messages, distinctes pour chacun de vos contacts.</string>
<string name="read_more_in_github">Plus d\'informations sur notre GitHub.</string>
<string name="paste_the_link_you_received">Collez le lien que vous avez reçu</string>
<string name="use_chat">Utiliser le chat</string>
<string name="onboarding_notifications_mode_title">Notifications privées</string>
@@ -451,7 +449,6 @@
<string name="make_private_connection">Établir une connexion privée</string>
<string name="how_it_works">Comment ça fonctionne</string>
<string name="how_simplex_works">Comment SimpleX fonctionne</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[Beaucoup se demandent : <i>si SimpleX n\'a pas d\'identifiant d\'utilisateur, comment peut-il transmettre des messages \?</i>]]></string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages"><![CDATA[Seuls les appareils clients stockent les profils des utilisateurs, les contacts, les groupes et les messages envoyés avec un <b>chiffrement de bout en bout à deux couches</b>.]]></string>
<string name="read_more_in_github_with_link"><![CDATA[Pour en savoir plus, consultez notre <font color="#0088ff">GitHub repository</font>.]]></string>
<string name="onboarding_notifications_mode_periodic_desc"><![CDATA[<b>Batterie peu utilisée</b>. L\'app vérifie les messages toutes les 10 minutes. Vous risquez de manquer des appels ou des messages urgents.]]></string>
@@ -475,7 +472,6 @@
<string name="restore_passphrase_not_found_desc">La phrase secrète n\'a pas été trouvée dans le Keystore, veuillez la saisir manuellement. Cela a pu se produire si vous avez restauré les données de l\'app à l\'aide d\'un outil de sauvegarde. Si ce n\'est pas le cas, veuillez contacter les développeurs.</string>
<string name="restore_database_alert_desc">Veuillez entrer le mot de passe précédent après avoir restauré la sauvegarde de la base de données. Cette action ne peut pas être annulée.</string>
<string name="database_restore_error">Erreur de restauration de la base de données</string>
<string name="archive_created_on_ts">Créé le %1$s</string>
<string name="encrypted_video_call">appel vidéo (chiffrement de bout en bout)</string>
<string name="audio_call_no_encryption">appel audio (sans chiffrement)</string>
<string name="encrypted_audio_call">appel audio (chiffrement de bout en bout)</string>
@@ -653,11 +649,6 @@
<string name="restore_database_alert_confirm">Restaurer</string>
<string name="chat_is_stopped_indication">Le chat est arrêté</string>
<string name="you_can_start_chat_via_setting_or_by_restarting_the_app">Vous pouvez lancer le chat via les Paramètres / la Base de données de l\'app ou en la redémarrant.</string>
<string name="chat_archive_header">Archives du chat</string>
<string name="chat_archive_section">ARCHIVE DU CHAT</string>
<string name="save_archive">Enregistrer l\'archive</string>
<string name="delete_archive">Supprimer l\'archive</string>
<string name="delete_chat_archive_question">Supprimer l\'archive du chat \?</string>
<string name="group_invitation_item_description">Invitation au groupe %1$s</string>
<string name="join_group_question">Rejoindre le groupe \?</string>
<string name="you_are_invited_to_group_join_to_connect_with_group_members">Vous êtes invité·e dans un groupe. Rejoignez le pour vous connecter avec ses membres.</string>
@@ -711,7 +702,7 @@
<string name="send_live_message">Envoyer un message dynamique</string>
<string name="send_live_message_desc">Envoyez un message dynamique - il sera mis à jour pour le⸱s destinataire⸱s au fur et à mesure que vous le tapez</string>
<string name="send_verb">Envoyer</string>
<string name="member_role_will_be_changed_with_invitation">Le rôle sera changé pour «%s». Le membre va recevoir une nouvelle invitation.</string>
<string name="member_role_will_be_changed_with_invitation">Son rôle est désormais %s. Le membre recevra une nouvelle invitation.</string>
<string name="live">LIVE</string>
<string name="button_add_members">Inviter des membres</string>
<string name="you_can_share_group_link_anybody_will_be_able_to_connect">Vous pouvez partager un lien ou un code QR - n\'importe qui pourra rejoindre le groupe. Vous ne perdrez pas les membres du groupe si vous le supprimez par la suite.</string>
@@ -722,7 +713,7 @@
<string name="only_group_owners_can_change_prefs">Seuls les propriétaires du groupe peuvent modifier les préférences du groupe.</string>
<string name="section_title_for_console">POUR TERMINAL</string>
<string name="change_member_role_question">Changer le rôle du groupe \?</string>
<string name="member_role_will_be_changed_with_notification">Le rôle sera changé pour «%s». Les membres du groupe seront notifiés.</string>
<string name="member_role_will_be_changed_with_notification">Son rôle est désormais %s. Tous les membres du groupe en seront informés.</string>
<string name="icon_descr_contact_checked">Contact vérifié⸱e</string>
<string name="clear_contacts_selection_button">Effacer</string>
<string name="num_contacts_selected">%d contact·s sélectionné·e·s</string>
@@ -1163,7 +1154,7 @@
<string name="profile_update_will_be_sent_to_contacts">La mise à jour du profil sera envoyée à vos contacts.</string>
<string name="read_more_in_user_guide_with_link"><![CDATA[Pour en savoir plus, consultez le <font color="#0088ff">Guide de l\'utilisateur</font>.]]></string>
<string name="save_auto_accept_settings">Enregistrer les paramètres de validation automatique</string>
<string name="scan_qr_to_connect_to_contact">Pour se connecter, votre contact peut scanner le code QR ou utiliser le lien dans l\'application.</string>
<string name="scan_qr_to_connect_to_contact">Pour se connecter, votre contact peut scanner un code QR ou utiliser un lien dans l\'app.</string>
<string name="app_passcode_replaced_with_self_destruct">Le code d\'accès de l\'application est remplacé par un code d\'autodestruction.</string>
<string name="enable_self_destruct">Activer l\'autodestruction</string>
<string name="empty_chat_profile_is_created">Un profil de chat vierge portant le nom fourni est créé et l\'application s\'ouvre normalement.</string>
@@ -1528,14 +1519,14 @@
<string name="enable_sending_recent_history">Envoi des 100 derniers messages aux nouveaux membres.</string>
<string name="add_contact_button_to_create_link_or_connect_via_link"><![CDATA[<b>Ajouter un contact</b>: pour créer un nouveau lien d\'invitation ou se connecter via un lien que vous avez reçu.]]></string>
<string name="disable_sending_recent_history">Ne pas envoyer d\'historique aux nouveaux membres.</string>
<string name="or_show_this_qr_code">Ou présenter ce code</string>
<string name="or_show_this_qr_code">Ou montrez ce code</string>
<string name="recent_history_is_sent_to_new_members">Les 100 derniers messages sont envoyés aux nouveaux membres.</string>
<string name="code_you_scanned_is_not_simplex_link_qr_code">Le code scanné n\'est pas un code QR de lien SimpleX.</string>
<string name="the_text_you_pasted_is_not_a_link">Le texte collé n\'est pas un lien SimpleX.</string>
<string name="enable_camera_access">Autoriser l\'accès à la caméra</string>
<string name="you_can_view_invitation_link_again">Vous pouvez à nouveau consulter le lien d\'invitation dans les détails de la connexion.</string>
<string name="keep_unused_invitation_question">Conserver l\'invitation inutilisée?</string>
<string name="share_this_1_time_link">Partager ce lien d\'invitation unique</string>
<string name="share_this_1_time_link">Partagez ce lien d\'invitation unique</string>
<string name="create_group_button_to_create_new_group"><![CDATA[<b>Créer un groupe</b>: pour créer un nouveau groupe.]]></string>
<string name="recent_history">Historique visible</string>
<string name="la_app_passcode">Code d\'accès à l\'app</string>
@@ -1544,7 +1535,7 @@
<string name="creating_link">Création d\'un lien…</string>
<string name="or_scan_qr_code">Ou scanner le code QR</string>
<string name="invalid_qr_code">Code QR invalide</string>
<string name="add_contact_tab">Ajouter le contact</string>
<string name="add_contact_tab">Ajouter un contact</string>
<string name="tap_to_scan">Appuyez pour scanner</string>
<string name="keep_invitation_link">Conserver</string>
<string name="tap_to_paste_link">Appuyez pour coller le lien</string>
@@ -1883,7 +1874,7 @@
<string name="app_check_for_updates_button_download">Téléchargement %s (%s)</string>
<string name="servers_info_reconnect_server_error">Erreur de reconnexion au serveur</string>
<string name="member_info_member_inactive">inactif</string>
<string name="scan_paste_link">Scanner / Coller le lien</string>
<string name="scan_paste_link">Scanner / Coller un lien</string>
<string name="member_inactive_desc">Le message peut être transmis plus tard si le membre devient actif.</string>
<string name="servers_info_reconnect_servers_message">Reconnecter tous les serveurs connectés pour forcer la livraison des messages. Cette méthode utilise du trafic supplémentaire.</string>
<string name="servers_info_transport_sessions_section_header">Sessions de transport</string>
@@ -2069,4 +2060,61 @@
<string name="network_option_tcp_connection">Connexion TCP</string>
<string name="chat_database_exported_not_all_files">Certains fichiers n\'ont pas été exportés</string>
<string name="chat_database_exported_migrate">Vous pouvez migrer la base de données exportée.</string>
<string name="n_file_errors">%1$d erreur(s) de fichier :\n%2$s</string>
<string name="n_other_file_errors">%1$d autre(s) erreur(s) de fichier.</string>
<string name="error_forwarding_messages">Erreur lors du transfert de messages</string>
<string name="forward_files_in_progress_desc">%1$d fichier(s) est(sont) en cours de téléchargement.</string>
<string name="forward_files_messages_deleted_after_selection_title">%1$s messages non transférés</string>
<string name="forward_files_not_accepted_receive_files">Télécharger</string>
<string name="forward_multiple">Transfert de messages…</string>
<string name="forward_files_messages_deleted_after_selection_desc">Les messages ont été supprimés après avoir été sélectionnés.</string>
<string name="switching_profile_error_title">Erreur lors du changement de profil</string>
<string name="select_chat_profile">Sélectionner un profil de discussion</string>
<string name="new_chat_share_profile">Partager le profil</string>
<string name="switching_profile_error_message">Votre connexion a été déplacée vers %s mais une erreur inattendue s\'est produite lors de la redirection vers le profil.</string>
<string name="network_proxy_auth_mode_no_auth">Ne pas utiliser d\'identifiants avec le proxy.</string>
<string name="network_proxy_incorrect_config_title">Erreur lors de l\'enregistrement du proxy</string>
<string name="network_proxy_password">Mot de passe</string>
<string name="network_proxy_auth">Authentification proxy</string>
<string name="network_proxy_auth_mode_isolate_by_auth_entity">Utilisez des identifiants de proxy différents pour chaque connexion.</string>
<string name="network_proxy_auth_mode_username_password">Vos informations d\'identification peuvent être envoyées non chiffrées.</string>
<string name="forward_files_failed_to_receive_desc">Le téléchargement de %1$d fichier(s) a échoué.</string>
<string name="forward_files_missing_desc">%1$d fichier(s) a(ont) été supprimé(s).</string>
<string name="v6_1_better_security">Sécurité accrue ✅</string>
<string name="v6_1_better_user_experience">Une meilleure expérience pour l\'utilisateur</string>
<string name="forward_files_not_accepted_desc">%1$d fichier(s) n\'a (n\'ont) pas été téléchargé(s).</string>
<string name="network_session_mode_session">Session de l\'app</string>
<string name="v6_1_message_dates_descr">Meilleures dates de messages.</string>
<string name="forward_alert_title_messages_to_forward">Transférer %1$s message(s)?</string>
<string name="compose_forward_messages_n">Transfert de %1$s messages</string>
<string name="network_proxy_incorrect_config_desc">Assurez-vous que la configuration du proxy est correcte.</string>
<string name="forward_alert_forward_messages_without_files">Transférer les messages sans les fichiers?</string>
<string name="network_session_mode_session_description">De nouveaux identifiants SOCKS seront utilisés chaque fois que vous démarrerez l\'application.</string>
<string name="forward_alert_title_nothing_to_forward">Rien à transférer!</string>
<string name="call_desktop_permission_denied_safari">Ouvrez Safari Paramètres / Sites web / Microphone, puis choisissez Autoriser pour localhost.</string>
<string name="compose_save_messages_n">Sauvegarde de %1$s messages</string>
<string name="migrate_from_device_uploaded_archive_will_be_removed">L\'archive de la base de données envoyée sera définitivement supprimée des serveurs.</string>
<string name="network_proxy_auth_mode_isolate_by_auth_user">Utilisez des identifiants de proxy différents pour chaque profil.</string>
<string name="network_proxy_random_credentials">Utiliser des identifiants aléatoires</string>
<string name="network_proxy_username">Nom d\'utilisateur</string>
<string name="delete_messages_cannot_be_undone_warning">Les messages seront supprimés - il n\'est pas possible de revenir en arrière!</string>
<string name="settings_section_title_chat_database">BASE DE DONNÉES DU CHAT</string>
<string name="system_mode_toast">Mode système</string>
<string name="network_session_mode_server">Serveur</string>
<string name="network_session_mode_server_description">De nouveaux identifiants SOCKS seront utilisées pour chaque serveur.</string>
<string name="error_initializing_web_view_wrong_arch">Erreur lors de l\'initialisation de WebView. Assurez-vous que WebView est installé et que l\'architecture supportée est arm64.\nErreur : %s</string>
<string name="icon_descr_sound_muted">Son muet</string>
<string name="settings_message_shape_corner">Coin</string>
<string name="settings_section_title_message_shape">Forme du message</string>
<string name="settings_message_shape_tail">Queue</string>
<string name="call_desktop_permission_denied_chrome">Cliquez sur le bouton info près du champ d\'adresse pour autoriser l\'utilisation du microphone.</string>
<string name="call_desktop_permission_denied_title">Pour passer des appels, autorisez l\'utilisation de votre microphone. Mettez fin à l\'appel et essayez d\'appeler à nouveau.</string>
<string name="migrate_from_device_remove_archive_question">Supprimer l\'archive?</string>
<string name="v6_1_better_calls">Appels améliorés</string>
<string name="v6_1_customizable_message_descr">Forme des messages personnalisable.</string>
<string name="v6_1_delete_many_messages_descr">Supprimer ou modérer jusqu\'à 200 messages.</string>
<string name="v6_1_forward_many_messages_descr">Transférez jusqu\'à 20 messages à la fois.</string>
<string name="v6_1_better_security_descr">Protocoles SimpleX audité par Trail of Bits.</string>
<string name="v6_1_better_calls_descr">Passer de l\'audio à la vidéo pendant l\'appel.</string>
<string name="v6_1_switch_chat_profile_descr">Changer de profil de chat pour les invitations à usage unique.</string>
</resources>
@@ -117,7 +117,6 @@
<string name="network_status">नेटवर्क की स्थिति</string>
<string name="notification_new_contact_request">नया संपर्क अनुरोध</string>
<string name="delete_files_and_media_all">सभी फाइलों को मिटा दें</string>
<string name="delete_archive">संग्रह हटा देना</string>
<string name="new_database_archive">नया डेटाबेस संग्रह</string>
<string name="new_member_role">नए सदस्य की भूमिका</string>
<string name="settings_notifications_mode_title">अधिसूचना सेवा</string>
@@ -129,7 +128,6 @@
<string name="settings_notification_preview_title">अधिसूचना पूर्वावलोकन</string>
<string name="notifications">सूचनाएं</string>
<string name="full_deletion">सभी के लिए हटाएं</string>
<string name="delete_chat_archive_question">लिखचीत संग्रह हटा दे\?</string>
<string name="delete_chat_profile_question">चैट प्रोफ़ाइल हटाएं\?</string>
<string name="users_delete_question">चैट प्रोफ़ाइल हटाएं\?</string>
<string name="users_delete_profile_for">के लिए चैट प्रोफ़ाइल हटाएं</string>
@@ -218,9 +216,7 @@
<string name="icon_descr_call_ended">कॉल समाप्त</string>
<string name="icon_descr_call_progress">कॉल चल रहा है</string>
<string name="auto_accept_images">छवियों को स्वत: स्वीकार करें</string>
<string name="chat_archive_header">चैट संग्रह</string>
<string name="chat_is_stopped_indication">चैट रोक दी गई है</string>
<string name="chat_archive_section">चैट संग्रह</string>
<string name="you_will_stop_receiving_messages_from_this_group_chat_history_will_be_preserved">आप इस समूह से संदेश प्राप्त करना बंद कर देंगे। चैट इतिहास संरक्षित किया जाएगा।</string>
<string name="rcv_group_event_changed_member_role">%s की भूमिका को %s में बदला</string>
<string name="group_member_status_complete">पूर्ण</string>
@@ -21,7 +21,7 @@
<string name="about_simplex">A SimpleXről</string>
<string name="color_primary">Kiemelés</string>
<string name="callstatus_accepted">fogadott hívás</string>
<string name="network_enable_socks_info">Hozzáférés a kiszolgálókhoz SOCKS proxy segítségével a %d porton? A proxyt el kell indítani, mielőtt engedélyezné ezt az opciót.</string>
<string name="network_enable_socks_info">Hozzáférés a kiszolgálókhoz SOCKS proxyn keresztül a(z) %d porton? A proxyt el kell indítani, mielőtt engedélyezné ezt az opciót.</string>
<string name="accept_feature">Elfogadás</string>
<string name="accept_call_on_lock_screen">Elfogadás</string>
<string name="above_then_preposition_continuation">gombra fent, majd:</string>
@@ -38,10 +38,9 @@
<string name="feature_cancelled_item">%s visszavonva</string>
<string name="smp_servers_preset_add">Előre beállított kiszolgálók hozzáadása</string>
<string name="calls_prohibited_with_this_contact">A hívások kezdeményezése le van tiltva ebben a csevegésben.</string>
<string name="network_session_mode_entity_description"><b>Minden egyes kapcsolathoz és csoporttaghoz</b> külön TCP-kapcsolat (és SOCKS-hitelesítőadat) lesz használva.
\n<b>Megjegyzés:</b> ha sok kapcsolata van, az akkumulátor-használat és az adatforgalom jelentősen megnövekedhet, és néhány kapcsolódási kísérlet sikertelen lehet.</string>
<string name="network_session_mode_entity_description"><![CDATA[<b>Az összes ismerőséhez és csoporttaghoz</b> külön TCP-kapcsolat (és SOCKS-hitelesítőadat) lesz használva.\n<b>Megjegyzés:</b> ha sok kapcsolata van, az akkumulátor-használat és az adatforgalom jelentősen megnövekedhet, és néhány kapcsolódási kísérlet sikertelen lehet.]]></string>
<string name="icon_descr_cancel_link_preview">hivatkozás előnézetének visszavonása</string>
<string name="network_session_mode_user_description"><![CDATA[<b>Minden egyes kapcsolathoz és csoporttaghoz</b> külön TCP-kapcsolat (és SOCKS-hitelesítőadat) lesz használva.]]></string>
<string name="network_session_mode_user_description"><![CDATA[<b>Az összes csevegési profiljához az alkalmazásban</b> külön TCP-kapcsolat (és SOCKS-hitelesítőadat) lesz használva.]]></string>
<string name="both_you_and_your_contact_can_send_disappearing">Mindkét fél küldhet eltűnő üzeneteket.</string>
<string name="keychain_is_storing_securely">Az Android Keystore-t a jelmondat biztonságos tárolására használják - lehetővé teszi az értesítési szolgáltatás működését.</string>
<string name="alert_title_msg_bad_hash">Hibás az üzenet hasító értéke</string>
@@ -71,7 +70,7 @@
\nElérhető a v5.1-ben"</string>
<string name="both_you_and_your_contacts_can_delete">Mindkét fél véglegesen törölheti az elküldött üzeneteket. (24 óra)</string>
<string name="v5_4_better_groups">Továbbfejlesztett csoportok</string>
<string name="clear_chat_warning">Minden üzenet törlésre kerül - ez a művelet nem vonható vissza! Az üzenetek CSAK az Ön számára törlődnek.</string>
<string name="clear_chat_warning">Az összes üzenet törlésre kerül - ez a művelet nem vonható vissza! Az üzenetek CSAK az Ön számára törlődnek.</string>
<string name="icon_descr_call_ended">Hívás befejeződött</string>
<string name="settings_section_title_calls">HÍVÁSOK</string>
<string name="rcv_group_and_other_events">és további %d esemény</string>
@@ -87,10 +86,10 @@
<string name="allow_message_reactions_only_if">Az üzenetreakciók küldése csak abban az esetben van engedélyezve, ha az ismerőse is engedélyezi.</string>
<string name="back">Vissza</string>
<string name="it_can_disabled_via_settings_notifications_still_shown"><![CDATA[<b>Kikapcsolható a beállításokban</b> az értesítések továbbra is megjelenítésre kerülnek amíg az alkalmazás fut.]]></string>
<string name="v4_2_group_links_desc">Az adminok hivatkozásokat hozhatnak létre a csoportokhoz való csatlakozáshoz.</string>
<string name="v4_2_group_links_desc">Az adminisztrátorok hivatkozásokat hozhatnak létre a csoportokhoz való csatlakozáshoz.</string>
<string name="call_on_lock_screen">Hívások a zárolási képernyőn:</string>
<string name="conn_event_ratchet_sync_started">titkosítás elfogadása…</string>
<string name="invite_prohibited">Ismerős meghívása nem lehetséges!</string>
<string name="invite_prohibited">Nem lehet meghívni az ismerőst!</string>
<string name="integrity_msg_bad_id">téves üzenet ID</string>
<string name="v4_2_auto_accept_contact_requests">Kapcsolatkérések automatikus elfogadása</string>
<string name="impossible_to_recover_passphrase"><![CDATA[<b>Megjegyzés:</b> NEM fogja tudni helyreállítani, vagy megváltoztatni a jelmondatot abban az esetben, ha elveszíti.]]></string>
@@ -99,18 +98,18 @@
<string name="smp_servers_add_to_another_device">Hozzáadás egy másik eszközhöz</string>
<string name="allow_message_reactions">Az üzenetreakciók küldése engedélyezve van.</string>
<string name="icon_descr_cancel_file_preview">Fájlelőnézet visszavonása</string>
<string name="all_group_members_will_remain_connected">Minden csoporttag kapcsolatban marad.</string>
<string name="all_group_members_will_remain_connected">Az összes csoporttag kapcsolatban marad.</string>
<string name="onboarding_notifications_mode_service_desc"><![CDATA[<b>Több akkumulátort használ</b>! Az alkalmazás mindig fut a háttérben - az értesítések azonnal megjelennek.]]></string>
<string name="block_member_confirmation">Letiltás</string>
<string name="group_member_role_admin">admin</string>
<string name="group_member_role_admin">adminisztrátor</string>
<string name="icon_descr_cancel_image_preview">Fénykép előnézet visszavonása</string>
<string name="v5_1_self_destruct_passcode_descr">A jelkód megadása után minden adat törlésre kerül.</string>
<string name="v5_1_self_destruct_passcode_descr">A jelkód megadása után az összes adat törlésre kerül.</string>
<string name="icon_descr_video_asked_to_receive">Felkérték a videó fogadására</string>
<string name="block_member_button">Letiltás</string>
<string name="v5_2_more_things">Még néhány dolog</string>
<string name="authentication_cancelled">Hitelesítés visszavonva</string>
<string name="allow_to_send_files">A fájlok- és a médiatartalmak küldése engedélyezve van.</string>
<string name="users_delete_all_chats_deleted">Minden csevegés és üzenet törlésre kerül - ez a művelet nem vonható vissza!</string>
<string name="users_delete_all_chats_deleted">Az összes csevegés és üzenet törlésre kerül - ez a művelet nem vonható vissza!</string>
<string name="icon_descr_audio_call">hanghívás</string>
<string name="bold_text">félkövér</string>
<string name="app_passcode_replaced_with_self_destruct">Az alkalmazás jelkód helyettesítésre kerül egy önmegsemmisítő jelkóddal.</string>
@@ -120,14 +119,14 @@
<string name="chat_preferences_always">mindig</string>
<string name="call_already_ended">A hívás már befejeződött!</string>
<string name="turn_off_battery_optimization_button">Engedélyezés</string>
<string name="all_your_contacts_will_remain_connected">Minden ismerősével kapcsolatban marad.</string>
<string name="all_your_contacts_will_remain_connected">Az összes ismerősével kapcsolatban marad.</string>
<string name="icon_descr_cancel_live_message">Élő csevegési üzenet visszavonása</string>
<string name="allow_irreversible_message_deletion_only_if">Az üzenetek végleges törlése csak abban az esetben van engedélyezve, ha az ismerőse is engedélyezi. (24 óra)</string>
<string name="v4_6_audio_video_calls">Hang- és videóhívások</string>
<string name="integrity_msg_bad_hash">hibás az üzenet hasító értéke</string>
<string name="notifications_mode_service">Mindig fut</string>
<string name="keychain_allows_to_receive_ntfs">Az Android Keystore biztonságosan fogja tárolni a jelmondatot az alkalmazás újraindítása, vagy a jelmondat megváltoztatás után - lehetővé teszi az értesítések fogadását.</string>
<string name="all_app_data_will_be_cleared">Minden alkalmazásadat törölve.</string>
<string name="all_app_data_will_be_cleared">Az összes alkalmazásadat törölve.</string>
<string name="onboarding_notifications_mode_off_desc"><![CDATA[<b>Legjobb akkumulátoridő</b>. Csak akkor kap értesítéseket, amikor az alkalmazás meg van nyitva. (NINCS háttérszolgáltatás.)]]></string>
<string name="appearance_settings">Megjelenés</string>
<string name="turning_off_service_and_periodic">Az akkumulátor-optimalizálás aktív, ez kikapcsolja a háttérszolgáltatást és az új üzenetek rendszeres lekérdezését. A beállításokban újraengedélyezheti.</string>
@@ -151,7 +150,7 @@
<string name="callstatus_in_progress">hívás folyamatban</string>
<string name="auto_accept_images">Képek automatikus elfogadása</string>
<string name="allow_your_contacts_to_call">A hívások kezdeményezése engedélyezve van az ismerősei számára.</string>
<string name="settings_section_title_icon">ALKALMAZÁS IKON</string>
<string name="settings_section_title_icon">ALKALMAZÁSIKON</string>
<string name="v4_3_improved_server_configuration_desc">Kiszolgáló hozzáadása QR-kód beolvasásával.</string>
<string name="allow_to_send_disappearing">Az eltűnő üzenetek küldése engedélyezve van.</string>
<string name="allow_disappearing_messages_only_if">Az eltűnő üzenetek küldése csak abban az esetben van engedélyezve, ha az ismerőse is engedélyezi.</string>
@@ -162,7 +161,7 @@
<string name="both_you_and_your_contact_can_add_message_reactions">Mindkét fél küldhet üzenetreakciókat.</string>
<string name="both_you_and_your_contact_can_make_calls">Mindkét fél tud hívásokat kezdeményezni.</string>
<string name="la_auth_failed">Sikertelen hitelesítés</string>
<string name="block_member_desc">Minden %s által írt új üzenet elrejtésre kerül!</string>
<string name="block_member_desc">Az összes %s által írt új üzenet elrejtésre kerül!</string>
<string name="app_version_name">Alkalmazás verzió: v%s</string>
<string name="allow_calls_only_if">A hívások kezdeményezése csak abban az esetben van engedélyezve, ha az ismerőse is engedélyezi.</string>
<string name="smp_servers_add">Kiszolgáló hozzáadása</string>
@@ -220,7 +219,7 @@
<string name="network_session_mode_entity">Kapcsolat</string>
<string name="correct_name_to">Név helyesbítése erre: %s?</string>
<string name="connection_timeout">Időtúllépés kapcsolódáskor</string>
<string name="connect_with_contact_name_question">Kapcsolódás %1$s által?</string>
<string name="connect_with_contact_name_question">Kapcsolódás a következővel: %1$s?</string>
<string name="create_profile_button">Létrehozás</string>
<string name="contact_preferences">Ismerős beállításai</string>
<string name="info_row_connection">Kapcsolat</string>
@@ -230,7 +229,7 @@
<string name="chat_preferences_contact_allows">Ismerős engedélyezi</string>
<string name="notification_preview_somebody">Rejtett név:</string>
<string name="connect_to_desktop">Társítás számítógéppel</string>
<string name="icon_descr_context">Környezeti ikon</string>
<string name="icon_descr_context">Szövegkörnyezeti ikon</string>
<string name="connect_via_link">Kapcsolódás egy hivatkozáson keresztül</string>
<string name="receipts_section_contacts">Ismerősök</string>
<string name="connection_error">Kapcsolódási hiba</string>
@@ -255,15 +254,14 @@
<string name="share_text_deleted_at">Törölve ekkor: %s</string>
<string name="info_row_deleted_at">Törölve ekkor:</string>
<string name="v4_6_chinese_spanish_interface">Kínai és spanyol kezelőfelület</string>
<string name="alert_title_cant_invite_contacts">Ismerősök meghívása nem lehetséges!</string>
<string name="alert_title_cant_invite_contacts">Nem lehet meghívni az ismerősöket!</string>
<string name="chat_is_stopped_indication">A csevegés leállt</string>
<string name="theme_dark">Sötét</string>
<string name="create_profile">Profil létrehozása</string>
<string name="rcv_group_event_group_deleted">törölt csoport</string>
<string name="full_deletion">Törlés mindenkinél</string>
<string name="full_deletion">Törlés az összes tagnál</string>
<string name="button_create_group_link">Hivatkozás létrehozása</string>
<string name="chat_preferences">Csevegési beállítások</string>
<string name="chat_archive_header">Csevegési archívum</string>
<string name="delete_profile">Profil törlése</string>
<string name="la_current_app_passcode">Jelenlegi jelkód</string>
<string name="group_member_status_connecting">kapcsolódás</string>
@@ -278,7 +276,6 @@
<string name="in_developing_title">Hamarosan!</string>
<string name="snd_conn_event_switch_queue_phase_changing_for_member">cím megváltoztatása nála: %s …</string>
<string name="chat_database_imported">Csevegési adatbázis importálva</string>
<string name="chat_archive_section">CSEVEGÉSI ARCHÍVUM</string>
<string name="delete_messages">Üzenetek törlése</string>
<string name="clear_chat_menu_action">Kiürítés</string>
<string name="icon_descr_close_button">Bezárás gomb</string>
@@ -327,10 +324,9 @@
<string name="group_member_status_introduced">kapcsolódás (bejelentve)</string>
<string name="create_group_link">Csoporthivatkozás létrehozása</string>
<string name="chat_console">Csevegési konzol</string>
<string name="delete_files_and_media_for_all_users">Fájlok törlése minden csevegési profilból</string>
<string name="delete_files_and_media_for_all_users">Fájlok törlése az összes csevegési profilból</string>
<string name="smp_server_test_delete_queue">Sorbaállítás törlése</string>
<string name="button_delete_contact">Ismerős törlése</string>
<string name="archive_created_on_ts">Létrehozva ekkor: %1$s</string>
<string name="rcv_conn_event_switch_queue_phase_changing">cím megváltoztatása…</string>
<string name="connected_to_mobile">Társítva a hordozható eszközhöz</string>
<string name="current_passphrase">Jelenlegi jelmondat…</string>
@@ -363,8 +359,8 @@
<string name="smp_servers_delete_server">Kiszolgáló törlése</string>
<string name="auth_device_authentication_is_disabled_turning_off">Az eszközön nincs beállítva a képernyőzár. A SimpleX-zár ki van kapcsolva.</string>
<string name="no_call_on_lock_screen">Letiltás</string>
<string name="receipts_groups_disable_for_all">Letiltás minden csoport számára</string>
<string name="receipts_groups_enable_for_all">Engedélyezés minden csoport számára</string>
<string name="receipts_groups_disable_for_all">Letiltás az összes csoport számára</string>
<string name="receipts_groups_enable_for_all">Engedélyezés az összes csoport számára</string>
<string name="feature_enabled_for_contact">engedélyezve az ismerős számára</string>
<string name="disappearing_messages_are_prohibited">Az eltűnő üzenetek küldése le van tiltva ebben a csoportban.</string>
<string name="delete_address">Cím törlése</string>
@@ -384,7 +380,7 @@
<string name="passphrase_is_different">Az adatbázis-jelmondat eltér a Keystore-ban lévőtől.</string>
<string name="direct_messages">Közvetlen üzenetek</string>
<string name="icon_descr_email">E-mail</string>
<string name="receipts_contacts_disable_for_all">Letiltás mindenki számára</string>
<string name="receipts_contacts_disable_for_all">Letiltás az összes tag számára</string>
<string name="settings_developer_tools">Fejlesztői eszközök</string>
<string name="database_passphrase">Adatbázis-jelmondat</string>
<string name="ttl_days">%d nap</string>
@@ -414,7 +410,6 @@
<string name="receipts_groups_title_disable">Kézbesítés jelentések letiltása a csoportok számára?</string>
<string name="custom_time_unit_days">nap</string>
<string name="ttl_day">%d nap</string>
<string name="delete_chat_archive_question">Csevegési archívum törlése?</string>
<string name="failed_to_create_user_duplicate_title">Duplikált megjelenített név!</string>
<string name="receipts_contacts_disable_keep_overrides">Letiltás (felülírások megtartásával)</string>
<string name="database_upgrade">Adatbázis fejlesztése</string>
@@ -427,7 +422,7 @@
<string name="delete_and_notify_contact">Törlés, és az ismerős értesítése</string>
<string name="send_receipts_disabled">letiltva</string>
<string name="la_seconds">%d másodperc</string>
<string name="delete_files_and_media_all">Minden fájl törlése</string>
<string name="delete_files_and_media_all">Az összes fájl törlése</string>
<string name="database_will_be_encrypted">Az adatbázis titkosításra kerül.</string>
<string name="database_passphrase_and_export">Adatbázis-jelmondat és -exportálás</string>
<string name="database_will_be_encrypted_and_passphrase_stored">Az adatbázis titkosításra kerül és a jelmondat a Keystore-ban lesz tárolva.</string>
@@ -452,7 +447,6 @@
<string name="devices">Eszközök</string>
<string name="multicast_discoverable_via_local_network">Látható a helyi hálózaton</string>
<string name="dont_enable_receipts">Ne engedélyezze</string>
<string name="delete_archive">Archívum törlése</string>
<string name="disappearing_prohibited_in_this_chat">Az eltűnő üzenetek küldése le van tiltva ebben a csevegésben.</string>
<string name="chat_preferences_default">alapértelmezett (%s)</string>
<string name="integrity_msg_duplicate">duplikált üzenet</string>
@@ -462,7 +456,7 @@
<string name="total_files_count_and_size">%d fájl %s összméretben</string>
<string name="database_passphrase_is_required">A csevegés megnyitásához adja meg az adatbázis jelmondatát.</string>
<string name="ttl_d">%dnap</string>
<string name="receipts_contacts_enable_for_all">Engedélyezés mindenki számára</string>
<string name="receipts_contacts_enable_for_all">Engedélyezés az összes tag számára</string>
<string name="delivery_receipts_are_disabled">A kézbesítési jelentések le vannak tiltva!</string>
<string name="expand_verb">Kibontás</string>
<string name="error_sending_message">Hiba az üzenet küldésekor</string>
@@ -528,11 +522,11 @@
<string name="receipts_contacts_title_enable">Kézbesítési jelentések engedélyezése?</string>
<string name="error_saving_group_profile">Hiba a csoportprofil mentésekor</string>
<string name="server_error">hiba</string>
<string name="revoke_file__message">A fájl törölve lesz a kiszolgálóról.</string>
<string name="revoke_file__message">A fájl törölve lesz a kiszolgálókról.</string>
<string name="v5_2_disappear_one_message_descr">Akkor is, ha le van tiltva a beszélgetésben.</string>
<string name="v5_4_better_groups_descr">Gyorsabb csatlakozás és megbízhatóbb üzenetkézbesítés.</string>
<string name="enable_lock">Zárolás engedélyezése</string>
<string name="settings_section_title_help">SEGÍTSÉG</string>
<string name="settings_section_title_help">SÚGÓ</string>
<string name="group_is_decentralized">Teljesen decentralizált - csak a tagok számára látható.</string>
<string name="file_with_path">Fájl: %s</string>
<string name="icon_descr_hang_up">Hívás befejezése</string>
@@ -587,7 +581,7 @@
<string name="error">Hiba</string>
<string name="alert_message_group_invitation_expired">A csoportmeghívó már nem érvényes, a küldője eltávolította.</string>
<string name="group_full_name_field">A csoport teljes neve:</string>
<string name="icon_descr_help">segítség</string>
<string name="icon_descr_help">súgó</string>
<string name="enabled_self_destruct_passcode">Önmegsemmisítő jelkód engedélyezése</string>
<string name="settings_section_title_experimenta">KÍSÉRLETI</string>
<string name="error_aborting_address_change">Hiba a cím megváltoztatásának megszakításakor</string>
@@ -604,7 +598,7 @@
<string name="v4_6_reduced_battery_usage">Tovább csökkentett akkumulátor-használat</string>
<string name="error_stopping_chat">Hiba a csevegés megállításakor</string>
<string name="snd_conn_event_ratchet_sync_ok">titkosítás rendben %s számára</string>
<string name="delete_group_for_all_members_cannot_undo_warning">A csoport törlésre kerül minden tag számára - ez a művelet nem vonható vissza!</string>
<string name="delete_group_for_all_members_cannot_undo_warning">A csoport törlésre kerül az összes tag számára - ez a művelet nem vonható vissza!</string>
<string name="v5_2_fix_encryption_descr">Titkosítás javítása az adatmentések helyreállítása után.</string>
<string name="error_deleting_database">Hiba a csevegési adatbázis törlésekor</string>
<string name="simplex_link_mode_full">Teljes hivatkozás</string>
@@ -697,7 +691,7 @@
<string name="icon_descr_call_missed">Nem fogadott hívás</string>
<string name="theme_light">Világos</string>
<string name="delete_message_cannot_be_undone_warning">Az üzenet törlésre kerül - ez a művelet nem vonható vissza!</string>
<string name="markdown_help">Markdown segítség</string>
<string name="markdown_help">Markdown súgó</string>
<string name="notification_preview_new_message">Rejtett üzenet</string>
<string name="old_database_archive">Régi adatbázis-archívum</string>
<string name="network_settings_title">Speciális beállítások</string>
@@ -728,9 +722,7 @@
<string name="incorrect_code">Helytelen biztonsági kód!</string>
<string name="alert_text_fragment_encryption_out_of_sync_old_database">Ez akkor fordulhat elő, ha Ön vagy az ismerőse régi adatbázis biztonsági mentést használt.</string>
<string name="v5_3_new_desktop_app">Új számítógép-alkalmazás!</string>
<string name="v4_6_group_moderation_descr">Most már az adminok is:
\n- törölhetik a tagok üzeneteit.
\n- letilthatnak tagokat (megfigyelő szerepkör)</string>
<string name="v4_6_group_moderation_descr">Most már az adminisztrátorok is:\n- törölhetik a tagok üzeneteit.\n- letilthatnak tagokat (megfigyelő szerepkör)</string>
<string name="rcv_group_event_member_added">meghívta őt: %1$s</string>
<string name="message_reactions_are_prohibited">Az üzenetreakciók küldése le van tiltva ebben a csoportban.</string>
<string name="network_use_onion_hosts_no">Nem</string>
@@ -740,7 +732,7 @@
<string name="new_member_role">Új tag szerepköre</string>
<string name="la_mode_off">Kikapcsolva</string>
<string name="invalid_contact_link">Érvénytelen hivatkozás!</string>
<string name="new_in_version">Újdonságok a %s verzióban</string>
<string name="new_in_version">Újdonságok a(z) %s verzióban</string>
<string name="smp_servers_invalid_address">Érvénytelen kiszolgálócím!</string>
<string name="thousand_abbreviation">k</string>
<string name="chat_item_ttl_none">soha</string>
@@ -809,9 +801,9 @@
<string name="only_group_owners_can_change_prefs">Csak a csoporttulajdonosok módosíthatják a csoportbeállításokat.</string>
<string name="no_history">Nincsenek előzmények</string>
<string name="invalid_QR_code">Érvénytelen QR-kód</string>
<string name="mark_read">Olvasottnak jelölés</string>
<string name="mark_read">Megjelölés olvasottként</string>
<string name="live">ÉLŐ</string>
<string name="mark_unread">Olvasatlannak jelölés</string>
<string name="mark_unread">Megjelölés olvasatlanként</string>
<string name="icon_descr_more_button">Több</string>
<string name="auth_log_in_using_credential">Bejelentkezés hitelesítőadatokkal</string>
<string name="invalid_message_format">érvénytelen üzenet formátum</string>
@@ -821,8 +813,7 @@
<string name="this_device_version"><![CDATA[<i>(ez az eszköz: v%s)</i>]]></string>
<string name="feature_offered_item">ajánlott %s</string>
<string name="button_leave_group">Csoport elhagyása</string>
<string name="unblock_member_desc">Minden %s által írt üzenet megjelenik!</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[Sokan kérdezték: <i>Ha a SimpleX Chatnek nincs felhasználó-azonosítója, hogyan lehet mégis üzeneteket küldeni?</i>]]></string>
<string name="unblock_member_desc">Az összes %s által írt üzenet megjelenik!</string>
<string name="alert_text_skipped_messages_it_can_happen_when">Ez akkor fordulhat elő, ha:\n1. Az üzenetek 2 nap után, vagy a kiszolgálón 30 nap után lejártak.\n2. Az üzenet visszafejtése sikertelen volt, mert Ön, vagy az ismerőse régebbi adatbázis biztonsági mentést használt.\n3. A kapcsolat sérült.</string>
<string name="group_member_role_observer">megfigyelő</string>
<string name="description_via_group_link_incognito">inkognitó a csoporthivatkozáson keresztül</string>
@@ -872,7 +863,7 @@
<string name="incoming_audio_call">Bejövő hanghívás</string>
<string name="keychain_error">Kulcstartóhiba</string>
<string name="join_group_question">Csatlakozik a csoporthoz?</string>
<string name="incognito_info_protects">Az inkognitómód védi személyes adatait azáltal, hogy minden ismerősz új véletlenszerű profilt használ.</string>
<string name="incognito_info_protects">Az inkognitómód védi személyes adatait azáltal, hogy az összes ismerőséhez új, véletlenszerű profilt használ.</string>
<string name="v5_2_more_things_descr">- stabilabb üzenetkézbesítés.\n- picit továbbfejlesztett csoportok.\n- és még sok más!</string>
<string name="v5_1_message_reactions">Üzenetreakciók</string>
<string name="no_connected_mobile">Nincs társított hordozható eszköz</string>
@@ -922,7 +913,7 @@
<string name="share_invitation_link">Egyszer használható hivatkozás megosztása</string>
<string name="database_restore_error">Hiba az adatbázis visszaállításakor</string>
<string name="group_members_2">%s és %s</string>
<string name="chat_preferences_you_allow">Engedélyezve</string>
<string name="chat_preferences_you_allow">Ön engedélyezi</string>
<string name="v4_5_reduced_battery_usage">Csökkentett akkumulátor-használat</string>
<string name="save_and_notify_contacts">Mentés és az ismerősök értesítése</string>
<string name="group_welcome_preview">Előnézet</string>
@@ -956,7 +947,7 @@
<string name="scan_qr_to_connect_to_contact">A kapcsolódáshoz az ismerőse beolvashatja a QR-kódot, vagy használhatja az alkalmazásban található hivatkozást.</string>
<string name="callstate_received_confirmation">visszaigazolás fogadása…</string>
<string name="scan_code_from_contacts_app">Biztonsági kód beolvasása az ismerősének alkalmazásából.</string>
<string name="observer_cant_send_message_desc">Lépjen kapcsolatba a csoport adminnal.</string>
<string name="observer_cant_send_message_desc">Lépjen kapcsolatba a csoport adminisztrátorával.</string>
<string name="icon_descr_video_on">Videó bekapcsolva</string>
<string name="display_name__field">Profilnév:</string>
<string name="paste_button">Beillesztés</string>
@@ -970,7 +961,7 @@
<string name="color_title">Cím</string>
<string name="icon_descr_send_message">Üzenet elküldése</string>
<string name="restore_database">Adatbázismentés visszaállítása</string>
<string name="revoke_file__confirm">Visszavon</string>
<string name="revoke_file__confirm">Visszavonás</string>
<string name="ask_your_contact_to_enable_voice">Kérje meg az ismerősét, hogy engedélyezze a hangüzenetek küldését.</string>
<string name="description_you_shared_one_time_link">egyszer használható hivatkozást osztott meg</string>
<string name="simplex_link_mode_browser_warning">A hivatkozás megnyitása a böngészőben gyengítheti az adatvédelmet és a biztonságot. A megbízhatatlan SimpleX-hivatkozások pirossal vannak kiemelve.</string>
@@ -1001,7 +992,6 @@
<string name="recipient_colon_delivery_status">%s: %s</string>
<string name="system_restricted_background_desc">A SimpleX nem tud a háttérben futni. Csak akkor fog értesítéseket kapni, amikor az alkalmazás meg van nyitva.</string>
<string name="images_limit_title">Túl sok kép!</string>
<string name="save_archive">Archívum mentése</string>
<string name="group_members_n">%s, %s és %d tag</string>
<string name="auth_stop_chat">Csevegési szolgáltatás megállítása</string>
<string name="simplex_link_mode">SimpleX-hivatkozások</string>
@@ -1142,7 +1132,7 @@
<string name="restore_database_alert_title">Adatbázismentés visszaállítása?</string>
<string name="simplex_service_notification_text">Üzenetek fogadása…</string>
<string name="rcv_group_event_2_members_connected">%s és %s kapcsolódott</string>
<string name="you_are_observer">megfigyelő szerep</string>
<string name="you_are_observer">Ön megfigyelő</string>
<string name="port_verb">Port</string>
<string name="set_passcode">Jelkód beállítása</string>
<string name="whats_new">Újdonságok</string>
@@ -1281,7 +1271,7 @@
<string name="v5_0_large_files_support">Videók és fájlok 1Gb méretig</string>
<string name="network_option_tcp_connection_timeout">TCP kapcsolat időtúllépése</string>
<string name="connect__your_profile_will_be_shared">A(z) %1$s nevű profiljának SimpleX-címe megosztásra fog kerülni.</string>
<string name="you_are_already_connected_to_vName_via_this_link">Ön már kapcsolódva van ehhez: %1$s.</string>
<string name="you_are_already_connected_to_vName_via_this_link">Ön már kapcsolódott a következőhöz: %1$s.</string>
<string name="your_current_chat_database_will_be_deleted_and_replaced_with_the_imported_one">Jelenlegi csevegési adatbázis TÖRLÉSRE és FELCSERÉLÉSRE kerül az importált által!
\nEz a művelet nem vonható vissza - profiljai, ismerősei, csevegési üzenetei és fájljai véglegesen törölve lesznek.</string>
<string name="chat_with_the_founder">Ötletek és javaslatok</string>
@@ -1312,14 +1302,14 @@
<string name="your_contacts_will_remain_connected">Az ismerősei továbbra is kapcsolódva maradnak.</string>
<string name="error_xftp_test_server_auth">A kiszolgálónak engedélyre van szüksége a várólisták létrehozásához, ellenőrizze jelszavát</string>
<string name="database_initialization_error_desc">Az adatbázis nem működik megfelelően. Koppintson ide a további információkért</string>
<string name="stop_snd_file__message">A fájl küldése leállt.</string>
<string name="stop_snd_file__message">A fájl küldése le fog állni.</string>
<string name="trying_to_connect_to_server_to_receive_messages">Kapcsolódási kísérlet ahhoz a kiszolgálóhoz, amely az adott ismerősétől érkező üzenetek fogadására szolgál.</string>
<string name="la_could_not_be_verified">Nem sikerült hitelesíteni; próbálja meg újra.</string>
<string name="moderate_message_will_be_marked_warning">Az üzenet minden tag számára moderáltként lesz megjelölve.</string>
<string name="moderate_message_will_be_marked_warning">Az üzenet az összes tag számára moderáltként lesz megjelölve.</string>
<string name="enter_passphrase_notification_desc">Értesítések fogadásához adja meg az adatbázis jelmondatát</string>
<string name="error_smp_test_failed_at_step">A teszt a(z) %s lépésnél sikertelen volt.</string>
<string name="auth_you_will_be_required_to_authenticate_when_you_start_or_resume">Az alkalmazás elindításához vagy 30 másodpercnyi háttérben töltött idő után, az alkalmazáshoz való visszatéréshez hitelesítésre lesz szükség.</string>
<string name="moderate_message_will_be_deleted_warning">Az üzenet minden tag számára törlésre kerül.</string>
<string name="moderate_message_will_be_deleted_warning">Az üzenet az összes tag számára törlésre kerül.</string>
<string name="video_decoding_exception_desc">A videó nem dekódolható. Próbálja ki egy másik videóval, vagy lépjen kapcsolatba a fejlesztőkkel.</string>
<string name="this_text_is_available_in_settings">Ez a szöveg a „Beállításokban” érhető el</string>
<string name="profile_will_be_sent_to_contact_sending_link">A profilja elküldésre kerül az ismerőse számára, akitől ezt a hivatkozást kapta.</string>
@@ -1332,7 +1322,7 @@
<string name="la_notice_to_protect_your_information_turn_on_simplex_lock_you_will_be_prompted_to_complete_authentication_before_this_feature_is_enabled">A biztonsága érdekében kapcsolja be a SimpleX-zár funkciót.
\nA funkció bekapcsolása előtt a rendszer felszólítja a képernyőzár beállítására az eszközén.</string>
<string name="video_will_be_received_when_contact_is_online">A videó akkor érkezik meg, amikor a küldője elérhető lesz, várjon, vagy ellenőrizze később!</string>
<string name="network_error_desc">Hálózati kapcsolat ellenőrzése a következővel: %1$s, és próbálja újra.</string>
<string name="network_error_desc">Ellenőrizze a hálózati kapcsolatát a következővel: %1$s, és próbálja újra.</string>
<string name="you_can_turn_on_lock">A SimpleX-zár az „Adatvédelem és biztonság” menüben kapcsolható be.</string>
<string name="app_was_crashed">Az alkalmazás összeomlott</string>
<string name="please_check_correct_link_and_maybe_ask_for_a_new_one">Ellenőrizze, hogy a megfelelő hivatkozást használta-e, vagy kérje meg az ismerősét, hogy küldjön egy másikat.</string>
@@ -1340,20 +1330,20 @@
<string name="non_content_uri_alert_text">Érvénytelen fájl elérési útvonalat osztott meg. Jelentse a problémát az alkalmazás fejlesztőinek.</string>
<string name="failed_to_create_user_duplicate_desc">Már van egy csevegési profil ugyanezzel a megjelenített névvel. Válasszon egy másik nevet.</string>
<string name="trying_to_connect_to_server_to_receive_messages_with_error">Kapcsolódási kísérlet ahhoz a kiszolgálóhoz, amely az adott ismerősétől érkező üzenetek fogadására szolgál (hiba: %1$s).</string>
<string name="stop_rcv_file__message">A fájl fogadása leállt.</string>
<string name="stop_rcv_file__message">A fájl fogadása le fog állni.</string>
<string name="la_please_remember_to_store_password">Ne felejtse el, vagy tárolja biztonságosan az elveszett jelszót nem lehet visszaállítani!</string>
<string name="video_will_be_received_when_contact_completes_uploading">A videó akkor érkezik meg, amikor a küldője befejezte annak feltöltését.</string>
<string name="description_you_shared_one_time_link_incognito">egyszer használható hivatkozást osztott meg inkognitóban</string>
<string name="connected_to_server_to_receive_messages_from_contact">Már kapcsolódott ahhoz a kiszolgálóhoz, amely az adott ismerősétől érkező üzenetek fogadására szolgál.</string>
<string name="connected_to_server_to_receive_messages_from_contact">Ön már kapcsolódott ahhoz a kiszolgálóhoz, amely az adott ismerősétől érkező üzenetek fogadására szolgál.</string>
<string name="you_can_enable_delivery_receipts_later">Később engedélyezheti a „Beállításokban”</string>
<string name="you_will_be_connected_when_group_host_device_is_online">Akkor lesz kapcsolódva a csoporthoz, amikor a csoport tulajdonosának eszköze online lesz, várjon, vagy ellenőrizze később!</string>
<string name="mtr_error_different">különböző átköltöztetés az alkalmazásban/adatbázisban: %s / %s</string>
<string name="connect_plan_you_are_already_connecting_to_vName"><![CDATA[A kapcsolódás már folyamatban van ehhez: <b>%1$s</b>.]]></string>
<string name="connect_plan_you_are_already_connecting_to_vName"><![CDATA[A kapcsolódás már folyamatban van a következőhöz: <b>%1$s</b>.]]></string>
<string name="unhide_profile">Profil felfedése</string>
<string name="this_link_is_not_a_valid_connection_link">Ez nem egy érvényes kapcsolattartási hivatkozás!</string>
<string name="to_verify_compare">A végpontok közötti titkosítás hitelesítéséhez hasonlítsa össze (vagy olvassa be a QR-kódot) az ismerőse eszközén lévő kóddal.</string>
<string name="you_must_use_the_most_recent_version_of_database">A csevegési adatbázis legfrissebb verzióját CSAK egy eszközön kell használnia, ellenkező esetben előfordulhat, hogy az üzeneteket nem fogja megkapni valamennyi ismerősétől.</string>
<string name="messages_section_description">Ez a beállítás a jelenlegi csevegési profilban lévő üzenetekre érvényes</string>
<string name="messages_section_description">Ez a beállítás csak a jelenlegi csevegési profilban lévő üzenetekre vonatkozik</string>
<string name="you_are_invited_to_group_join_to_connect_with_group_members">Meghívást kapott a csoportba. Csatlakozzon, hogy kapcsolatba léphessen a csoport tagjaival.</string>
<string name="alert_message_no_group">Ez a csoport már nem létezik.</string>
<string name="connect_plan_you_are_already_joining_the_group_via_this_link">A csatlakozás már folyamatban van a csoporthoz ezen a hivatkozáson keresztül.</string>
@@ -1386,7 +1376,7 @@
<string name="your_profile_is_stored_on_device_and_shared_only_with_contacts_simplex_cannot_see_it">A profilja az eszközén van tárolva és csak az ismerőseivel kerül megosztásra. A SimpleX-kiszolgálók nem láthatják a profilját.</string>
<string name="snd_group_event_changed_member_role">Ön megváltoztatta %s szerepkörét erre: %s</string>
<string name="you_rejected_group_invitation">Csoportmeghívó elutasítva</string>
<string name="to_protect_privacy_simplex_has_ids_for_queues">Az adatvédelem érdekében, a más csevegési platformokon megszokott felhasználó-azonosítók helyett, a SimpleX csak az üzenetek sorbaállításához használ azonosítókat, minden egyes ismerőshöz egy-egy különbözőt.</string>
<string name="to_protect_privacy_simplex_has_ids_for_queues">Az adatvédelem érdekében (a más csevegési platformokon megszokott felhasználó-azonosítók helyett) a SimpleX csak az üzenetek sorbaállításához használ azonosítókat, az összes ismerőséhez különbözőt.</string>
<string name="to_share_with_your_contact">(a megosztáshoz az ismerősével)</string>
<string name="you_sent_group_invitation">Csoportmeghívó elküldve</string>
<string name="update_network_session_mode_question">Átvitel-izoláció módjának frissítése?</string>
@@ -1400,8 +1390,7 @@
<string name="to_reveal_profile_enter_password">Rejtett profilja felfedéséhez írja be a teljes jelszavát a keresőmezőbe a „Csevegési profilok” menüben.</string>
<string name="upgrade_and_open_chat">Fejlesztés és a csevegés megnyitása</string>
<string name="you_need_to_allow_to_send_voice">Engedélyeznie kell a hangüzenetek küldését az ismerőse számára, hogy hangüzeneteket küldhessenek egymásnak.</string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[Beállíthatja, hogy mely kiszolgáló(ko)n keresztül <b>fogadja</b> az üzeneteket, ismerősöket a kiszolgálók, amelyeket az üzenetküldéshez használ.]]></string>
<string name="connect_plan_you_are_already_in_group_vName"><![CDATA[Már a(z) <b>%1$s</b> csoport tagja.]]></string>
<string name="connect_plan_you_are_already_in_group_vName"><![CDATA[Ön már a(z) <b>%1$s</b> nevű csoport tagja.]]></string>
<string name="snd_conn_event_switch_queue_phase_completed">cím megváltoztatva</string>
<string name="v4_3_irreversible_message_deletion_desc">Az ismerősei engedélyezhetik a teljes üzenet törlést.</string>
<string name="you_have_to_enter_passphrase_every_time">A jelmondatot minden alkalommal meg kell adnia, amikor az alkalmazás elindul - nem az eszközön kerül tárolásra.</string>
@@ -1418,18 +1407,18 @@
<string name="you_can_start_chat_via_setting_or_by_restarting_the_app">A csevegési szolgáltatás elindítható a „Beállítások / Adatbázis” menüben vagy az alkalmazás újraindításával.</string>
<string name="verify_code_on_mobile">Kód hitelesítése a hordozható eszközön</string>
<string name="youve_accepted_group_invitation_connecting_to_inviting_group_member">Csatlakozott ehhez a csoporthoz. Kapcsolódás a meghívó csoporttaghoz.</string>
<string name="you_can_connect_to_simplex_chat_founder"><![CDATA[Kapcsolatba léphet <font color="#0088ff">a SimpleX Chat fejlesztőivel, ahol bármiről kérdezhet és értesülhet az újdonságokról</font>.]]></string>
<string name="you_can_connect_to_simplex_chat_founder"><![CDATA[Kapcsolatba léphet <font color="#0088ff">a SimpleX Chat fejlesztőivel, ahol bármiről kérdezhet és értesülhet a friss hírekről</font>.]]></string>
<string name="v4_2_auto_accept_contact_requests_desc">Nem kötelező üdvözlőüzenettel.</string>
<string name="unknown_database_error_with_info">Ismeretlen adatbázishiba: %s</string>
<string name="you_can_hide_or_mute_user_profile">Elrejtheti vagy lenémíthatja a felhasználó-profiljait - koppintson (vagy számítógép-alkalmazásban kattintson) hosszan a profilra a felugró menühöz.</string>
<string name="v5_3_simpler_incognito_mode_descr">Inkognitómód használata kapcsolódáskor.</string>
<string name="you_can_share_group_link_anybody_will_be_able_to_connect">Megoszthat egy hivatkozást vagy QR-kódot - így bárki csatlakozhat a csoporthoz. Ha a csoport később törlésre kerül, akkor nem fogja elveszíteni annak tagjait.</string>
<string name="you_joined_this_group">Csatlakozott ehhez a csoporthoz</string>
<string name="connect_plan_this_is_your_link_for_group_vName"><![CDATA[Ez az Ön hivatkozása a(z) <b>%1$s</b> csoporthoz!]]></string>
<string name="connect_plan_this_is_your_link_for_group_vName"><![CDATA[Ez az Ön hivatkozása a(z) <b>%1$s</b> nevű csoporthoz!]]></string>
<string name="voice_prohibited_in_this_chat">A hangüzenetek küldése le van tiltva ebben a csevegésben.</string>
<string name="you_control_your_chat">Ön irányítja csevegését!</string>
<string name="verify_code_with_desktop">Kód hitelesítése a számítógépen</string>
<string name="v4_5_private_filenames_descr">Az időzóna védelme érdekében a kép-/hangfájlok UTC-t használnak.</string>
<string name="v4_5_private_filenames_descr">Az időzóna védelmének érdekében a kép-/hangfájlok UTC-t használnak.</string>
<string name="connect_via_member_address_alert_desc">A kapcsolatkérés elküldésre kerül ezen csoporttag számára.</string>
<string name="incognito_info_share">Inkognitó-profil megosztása esetén a rendszer azt a profilt fogja használni azokhoz a csoportokhoz, amelyekbe meghívást kapott.</string>
<string name="connect_plan_you_have_already_requested_connection_via_this_address">Már küldött egy kapcsolatkérést ezen a címen keresztül!</string>
@@ -1437,7 +1426,7 @@
<string name="you_can_accept_or_reject_connection">Amikor az emberek kapcsolatot kérnek, Ön elfogadhatja vagy elutasíthatja azokat.</string>
<string name="v4_6_group_welcome_message_descr">Megjelenítendő üzenet beállítása az új tagok számára!</string>
<string name="whats_new_thanks_to_users_contribute_weblate">Köszönet a felhasználóknak - hozzájárulás a Weblate-en!</string>
<string name="sending_delivery_receipts_will_be_enabled">A kézbesítési jelentés küldése minden ismerőse számára engedélyezésre kerül.</string>
<string name="sending_delivery_receipts_will_be_enabled">A kézbesítési jelentés küldése az összes ismerőse számára engedélyezésre kerül.</string>
<string name="network_option_protocol_timeout_per_kb">Protokoll időtúllépése KB-onként</string>
<string name="database_backup_can_be_restored">Az adatbázis-jelmondat megváltoztatására tett kísérlet nem fejeződött be.</string>
<string name="enable_automatic_deletion_message">Ez a művelet nem vonható vissza - a kiválasztottnál korábban küldött és fogadott üzenetek törlésre kerülnek. Ez több percet is igénybe vehet.</string>
@@ -1448,7 +1437,7 @@
<string name="receipts_contacts_override_enabled">A kézbesítési jelentések engedélyezve vannak %d ismerősnél</string>
<string name="sending_via">Küldés ezen keresztül:</string>
<string name="v5_0_polish_interface_descr">Köszönet a felhasználóknak - hozzájárulás a Weblate-en!</string>
<string name="sending_delivery_receipts_will_be_enabled_all_profiles">A kézbesítési jelentések küldése engedélyezésre kerül az összes látható csevegési profilban lévő minden ismerős számára.</string>
<string name="sending_delivery_receipts_will_be_enabled_all_profiles">A kézbesítési jelentések küldése engedélyezésre kerül az összes látható csevegési profilban lévő összes ismerőse számára.</string>
<string name="v4_6_audio_video_calls_descr">Bluetooth támogatás és további fejlesztések.</string>
<string name="in_developing_desc">Ez a funkció még nem támogatott. Próbálja meg a következő kiadásban.</string>
<string name="share_text_updated_at">A bejegyzés frissítve: %s</string>
@@ -1465,18 +1454,17 @@
<string name="relay_server_if_necessary">A közvetítő-kiszolgáló csak szükség esetén kerül használatra. Egy másik fél megfigyelheti az IP-címet.</string>
<string name="v5_0_app_passcode_descr">Rendszerhitelesítés helyetti beállítás.</string>
<string name="switch_receiving_address_desc">A fogadó cím egy másik kiszolgálóra változik. A címváltoztatás a feladó online állapotba kerülése után fejeződik be.</string>
<string name="stop_chat_to_export_import_or_delete_chat_database">A csevegés megállítása a csevegési adatbázis exportálásához, importálásához vagy törléséhez. A csevegés megállítása alatt nem tud üzeneteket fogadni és küldeni.</string>
<string name="stop_chat_to_export_import_or_delete_chat_database">A csevegés megállítása a csevegési adatbázis exportálásához, importálásához vagy törléséhez. A csevegés megállításakor nem tud üzeneteket fogadni és küldeni.</string>
<string name="save_passphrase_in_keychain">Jelmondat mentése a Keystore-ba</string>
<string name="v4_6_chinese_spanish_interface_descr">Köszönet a felhasználóknak - hozzájárulás a Weblate-en!</string>
<string name="save_passphrase_in_settings">Jelmondat mentése a beállításokban</string>
<string name="send_receipts_disabled_alert_msg">Ennek a csoportnak több mint %1$d tagja van, a kézbesítési jelentések nem kerülnek elküldésre.</string>
<string name="v5_2_message_delivery_receipts_descr">A második jelölés, amit kihagytunk! ✅</string>
<string name="relay_server_protects_ip">A közvetítő-kiszolgáló megvédi az IP-címet, de megfigyelheti a hívás időtartamát.</string>
<string name="read_more_in_github">További információ a GitHub tárolónkban.</string>
<string name="v4_5_message_draft_descr">Az utolsó üzenet tervezetének megőrzése a mellékletekkel együtt.</string>
<string name="saved_ICE_servers_will_be_removed">A mentett WebRTC ICE-kiszolgálók eltávolításra kerülnek.</string>
<string name="receipts_groups_override_enabled">A kézbesítési jelentések engedélyezve vannak %d csoportban</string>
<string name="member_role_will_be_changed_with_notification">A szerepkör meg fog változni erre: %s. A csoportban mindenki értesítve lesz.</string>
<string name="member_role_will_be_changed_with_notification">A szerepkör meg fog változni erre: %s. A csoportban az összes tag értesítve lesz.</string>
<string name="users_delete_with_connections">Profil és kiszolgálókapcsolatok</string>
<string name="the_messaging_and_app_platform_protecting_your_privacy_and_security">Egy üzenetküldő- és alkalmazásplatform, amely védi az adatait és biztonságát.</string>
<string name="tap_to_activate_profile">A profil aktiválásához koppintson az ikonra.</string>
@@ -1505,14 +1493,14 @@
<string name="settings_is_storing_in_clear_text">A jelmondat a beállításokban egyszerű szövegként van tárolva.</string>
<string name="terminal_always_visible">Konzol megjelenítése új ablakban</string>
<string name="alert_text_msg_bad_hash">Az előző üzenet hasító értéke különbözik.</string>
<string name="receipts_section_description">Ezek a beállítások a jelenlegi profiljára vonatkoznak</string>
<string name="receipts_section_description">Ezek a beállítások csak a jelenlegi profiljára vonatkoznak</string>
<string name="loading_remote_file_desc">Várjon, amíg a fájl betöltődik a társított hordozható eszközről</string>
<string name="read_more_in_github_with_link"><![CDATA[További információ a <font color="#0088ff">GitHub tárolónkban</font>.]]></string>
<string name="error_showing_content">hiba a tartalom megjelenítésekor</string>
<string name="error_showing_message">hiba az üzenet megjelenítésekor</string>
<string name="you_can_make_address_visible_via_settings">Láthatóvá teheti a SimpleXbeli ismerősei számára a „Beállításokban”.</string>
<string name="recent_history_is_sent_to_new_members">Legfeljebb az utolsó 100 üzenet kerül elküldésre az új tagok számára.</string>
<string name="code_you_scanned_is_not_simplex_link_qr_code">A beolvasott QR-kód nem egy SimpleX QR-kód hivatkozás.</string>
<string name="code_you_scanned_is_not_simplex_link_qr_code">A beolvasott QR-kód nem egy SimpleX-QR-kód-hivatkozás.</string>
<string name="the_text_you_pasted_is_not_a_link">A beillesztett szöveg nem egy SimpleX-hivatkozás.</string>
<string name="you_can_view_invitation_link_again">A meghívó-hivatkozását újra megtekintheti a kapcsolat részleteinél.</string>
<string name="start_chat_question">Csevegés indítása?</string>
@@ -1539,7 +1527,7 @@
<string name="or_scan_qr_code">Vagy QR-kód beolvasása</string>
<string name="invalid_qr_code">Érvénytelen QR-kód</string>
<string name="keep_invitation_link">Megtartás</string>
<string name="search_or_paste_simplex_link">Keresés, vagy SimpleX-hivatkozás beillesztése</string>
<string name="search_or_paste_simplex_link">Keresés vagy SimpleX-hivatkozás beillesztése</string>
<string name="show_internal_errors">Belső hibák megjelenítése</string>
<string name="agent_critical_error_title">Kritikus hiba</string>
<string name="agent_internal_error_title">Belső hiba</string>
@@ -1591,7 +1579,7 @@
<string name="info_row_created_at">Létrehozva ekkor:</string>
<string name="saved_message_title">Mentett üzenet</string>
<string name="share_text_created_at">Megosztva ekkor: %s</string>
<string name="clear_note_folder_warning">Minden üzenet törlésre kerül ez a művelet nem vonható vissza!</string>
<string name="clear_note_folder_warning">Az összes üzenet törlésre kerül ez a művelet nem vonható vissza!</string>
<string name="v5_5_message_delivery">Továbbfejlesztett üzenetkézbesítés</string>
<string name="v5_5_join_group_conversation">Csatlakozás csoportos beszélgetésekhez</string>
<string name="v5_5_simpler_connect_ui">Hivatkozás beillesztése a kapcsolódáshoz!</string>
@@ -1604,16 +1592,16 @@
<string name="rcv_group_event_member_unblocked">feloldotta %s letiltását</string>
<string name="snd_group_event_member_unblocked">Ön feloldotta %s letiltását</string>
<string name="member_info_member_blocked">letiltva</string>
<string name="blocked_by_admin_item_description">letiltva az admin által</string>
<string name="member_blocked_by_admin">Letiltva az admin által</string>
<string name="blocked_by_admin_item_description">letiltva az adminisztrátor által</string>
<string name="member_blocked_by_admin">Letiltva az adminisztrátor által</string>
<string name="rcv_group_event_member_blocked">letiltotta őt: %s</string>
<string name="block_for_all">Letiltás mindenki számára</string>
<string name="block_for_all_question">Mindenki számára letiltja ezt a tagot?</string>
<string name="blocked_by_admin_items_description">%d üzenetet letiltott az admin</string>
<string name="unblock_for_all">Letiltás feloldása mindenki számára</string>
<string name="unblock_for_all_question">Mindenki számára feloldja a tag letiltását?</string>
<string name="block_for_all">Letiltás az összes tag számára</string>
<string name="block_for_all_question">Az összes tag számára letiltja ezt a tagot?</string>
<string name="blocked_by_admin_items_description">%d üzenetet letiltott az adminisztrátor</string>
<string name="unblock_for_all">Letiltás feloldása az összes tag számára</string>
<string name="unblock_for_all_question">Az összes tag számára feloldja a tag letiltását?</string>
<string name="snd_group_event_member_blocked">Ön letiltotta őt: %s</string>
<string name="error_blocking_member_for_all">Hiba a tag mindenki számára való letiltásakor</string>
<string name="error_blocking_member_for_all">Hiba a tag az összes csoporttag számára való letiltásakor</string>
<string name="message_too_large">Az üzenet túl nagy</string>
<string name="welcome_message_is_too_long">Az üdvözlőüzenet túl hosszú</string>
<string name="database_migration_in_progress">Az adatbázis átköltöztetése folyamatban van.
@@ -1629,8 +1617,8 @@
<string name="migrate_from_device_archive_and_upload">Archiválás és feltöltés</string>
<string name="migrate_from_device_confirm_upload">Feltöltés megerősítése</string>
<string name="migrate_from_device_error_deleting_database">Hiba az adatbázis törlésekor</string>
<string name="v5_6_safer_groups_descr">Az adminok egy tagot mindenki számára letilthatnak.</string>
<string name="migrate_from_device_all_data_will_be_uploaded">Minden ismerőse, a beszélgetései és a fájljai biztonságosan titkosításra kerülnek, melyek részletekben feltöltődnek a beállított XFTP-közvetítő-kiszolgálóra.</string>
<string name="v5_6_safer_groups_descr">Az adminisztrátorok egy tagot a csoport összes tagja számára letilthatnak.</string>
<string name="migrate_from_device_all_data_will_be_uploaded">Az összes ismerőse, -beszélgetése és -fájlja biztonságosan titkosításra kerülnek, melyek részletekben feltöltődnek a beállított XFTP-közvetítő-kiszolgálóra.</string>
<string name="v5_6_app_data_migration">Alkalmazásadatok átköltöztetése</string>
<string name="migrate_from_device_archiving_database">Adatbázis archiválása</string>
<string name="migrate_from_device_cancel_migration">Átköltöztetés visszavonása</string>
@@ -1718,14 +1706,14 @@
<string name="simplex_links_not_allowed">A SimpleX-hivatkozások küldése le van tiltva</string>
<string name="group_members_can_send_simplex_links">A csoport tagjai küldhetnek SimpleX-hivatkozásokat.</string>
<string name="feature_roles_owners">tulajdonosok</string>
<string name="feature_roles_admins">adminok</string>
<string name="feature_roles_all_members">minden tag</string>
<string name="feature_roles_admins">adminisztrátorok</string>
<string name="feature_roles_all_members">összes tag</string>
<string name="simplex_links">SimpleX-hivatkozások</string>
<string name="voice_messages_not_allowed">A hangüzenetek küldése le van tiltva</string>
<string name="simplex_links_are_prohibited_in_group">A SimpleX-hivatkozások küldése le van tiltva ebben a csoportban.</string>
<string name="prohibit_sending_simplex_links">A SimpleX-hivatkozások küldése le van tiltva</string>
<string name="files_and_media_not_allowed">A fájlok- és médiatartalmak nincsenek engedélyezve</string>
<string name="allow_to_send_simplex_links">A SimpleX hivatkozások küldése engedélyezve van.</string>
<string name="allow_to_send_simplex_links">A SimpleX-hivatkozások küldése engedélyezve van.</string>
<string name="feature_enabled_for">Számukra engedélyezve:</string>
<string name="saved_description">mentett</string>
<string name="saved_from_description">mentve innen: %s</string>
@@ -1793,7 +1781,7 @@
<string name="file_not_approved_title">Ismeretlen kiszolgálók!</string>
<string name="file_not_approved_descr">Tor vagy VPN nélkül az IP-címe látható lesz az XFTP-közvetítő-kiszolgálók számára:
\n%1$s.</string>
<string name="chat_theme_apply_to_all_modes">Minden színmód</string>
<string name="chat_theme_apply_to_all_modes">Összes színmód</string>
<string name="theme_black">Fekete</string>
<string name="color_mode">Színmód</string>
<string name="color_mode_dark">Sötét</string>
@@ -1826,7 +1814,7 @@
<string name="v5_8_persian_ui">Perzsa kezelőfelület</string>
<string name="v5_8_private_routing_descr">Védje IP-címét az ismerősei által kiválasztott üzenet-közvetítő-kiszolgálókkal szemben.
\nEngedélyezze a „Beállítások -&gt; Hálózat és kiszolgálók” menüben.</string>
<string name="v5_8_safe_files_descr">Ismeretlen kiszolgálókról származó fájlok jóváhagyása.</string>
<string name="v5_8_safe_files_descr">Ismeretlen kiszolgálókról származó fájlok megerősítése.</string>
<string name="v5_8_message_delivery">Javított üzenetkézbesítés</string>
<string name="chat_theme_reset_to_app_theme">Alkalmazás témájának visszaállítása</string>
<string name="v5_8_chat_themes_descr">Tegye egyedivé a csevegéseit!</string>
@@ -1862,7 +1850,7 @@
<string name="member_inactive_title">Inaktív tag</string>
<string name="message_forwarded_title">Továbbított üzenet</string>
<string name="member_inactive_desc">Az üzenet később is kézbesíthető, ha a tag aktívvá válik.</string>
<string name="message_forwarded_desc">Még nincs közvetlen kapcsolat, az üzenetet az admin továbbítja.</string>
<string name="message_forwarded_desc">Még nincs közvetlen kapcsolat, az üzenetet az adminisztrátor továbbítja.</string>
<string name="scan_paste_link">Hivatkozás beolvasása / beillesztése</string>
<string name="smp_servers_configured">Konfigurált SMP-kiszolgálók</string>
<string name="smp_servers_other">Egyéb SMP-kiszolgálók</string>
@@ -1874,17 +1862,17 @@
<string name="servers_info_sessions_connecting">Kapcsolódás</string>
<string name="servers_info_sessions_errors">Hibák</string>
<string name="servers_info_subscriptions_connections_pending">Függőben</string>
<string name="servers_info_private_data_disclaimer">Statisztikagyűjtés kezdete: %s.\nMinden adat biztonságban van az eszközén.</string>
<string name="servers_info_private_data_disclaimer">Statisztikagyűjtés kezdete: %s.\nAz összes adat biztonságban van az eszközén.</string>
<string name="servers_info_messages_sent">Elküldött üzenetek</string>
<string name="servers_info_proxied_servers_section_header">Proxyzott kiszolgálók</string>
<string name="servers_info_reconnect_servers_title">Újrakapcsolódás a kiszolgálókhoz?</string>
<string name="servers_info_reconnect_server_title">Újrakapcsolódás a kiszolgálóhoz?</string>
<string name="servers_info_reconnect_server_error">Hiba a kiszolgálóhoz való újrakapcsolódáskor</string>
<string name="servers_info_reconnect_all_servers_button">Újrakapcsolódás minden kiszolgálóhoz</string>
<string name="servers_info_reconnect_all_servers_button">Újrakapcsolódás az összes kiszolgálóhoz</string>
<string name="servers_info_reset_stats_alert_error_title">Hiba a statisztikák visszaállításakor</string>
<string name="servers_info_reset_stats_alert_confirm">Visszaállítás</string>
<string name="servers_info_reset_stats">Minden statisztika visszaállítása</string>
<string name="servers_info_reset_stats_alert_title">Minden statisztika visszaállítása?</string>
<string name="servers_info_reset_stats">Az összes statisztika visszaállítása</string>
<string name="servers_info_reset_stats_alert_title">Az összes statisztika visszaállítása?</string>
<string name="servers_info_reset_stats_alert_message">A kiszolgálók statisztikái visszaállnak - ez a művelet nem vonható vissza!</string>
<string name="servers_info_detailed_statistics">Részletes statisztikák</string>
<string name="servers_info_downloaded">Letöltve</string>
@@ -1892,7 +1880,7 @@
<string name="other_label">egyéb</string>
<string name="servers_info_detailed_statistics_received_total">Összes fogadott üzenet</string>
<string name="servers_info_detailed_statistics_receive_errors">Üzenetfogadási hibák</string>
<string name="reconnect">Újrakapcsolás</string>
<string name="reconnect">Újrakapcsolódás</string>
<string name="send_errors">Üzenetküldési hibák</string>
<string name="sent_directly">Közvetlenül küldött</string>
<string name="servers_info_detailed_statistics_sent_messages_total">Összes elküldött üzenet</string>
@@ -1924,7 +1912,7 @@
<string name="completed">Elkészült</string>
<string name="servers_info_connected_servers_section_header">Kapcsolódott kiszolgálók</string>
<string name="xftp_servers_configured">Konfigurált XFTP-kiszolgálók</string>
<string name="servers_info_sessions_connected">Kapcsolódva</string>
<string name="servers_info_sessions_connected">Kapcsolódott</string>
<string name="current_user">Jelenlegi profil</string>
<string name="servers_info_details">További részletek</string>
<string name="decryption_errors">visszafejtési hibák</string>
@@ -2017,12 +2005,12 @@
<string name="you_can_still_view_conversation_with_contact">A(z) %1$s nevű ismerősével folytatott beszélgetéseit továbbra is megtekintheti a csevegések listájában.</string>
<string name="compose_message_placeholder">Üzenet…</string>
<string name="select_verb">Kiválasztás</string>
<string name="moderate_messages_will_be_marked_warning">Az üzenetek minden tag számára moderáltként lesznek megjelölve.</string>
<string name="moderate_messages_will_be_marked_warning">Az üzenetek az összes tag számára moderáltként lesznek megjelölve.</string>
<string name="selected_chat_items_nothing_selected">Nincs kiválasztva semmi</string>
<string name="delete_messages_mark_deleted_warning">Az üzenetek törlésre lesznek jelölve. A címzett(ek) képes(ek) lesz(nek) felfedni ezt az üzenetet.</string>
<string name="delete_members_messages__question">Törli a tagok %d üzenetét?</string>
<string name="selected_chat_items_selected_n">%d kiválasztva</string>
<string name="moderate_messages_will_be_deleted_warning">Az üzenetek minden tag számára törlésre kerülnek.</string>
<string name="moderate_messages_will_be_deleted_warning">Az üzenetek az összes tag számára törlésre kerülnek.</string>
<string name="chat_database_exported_title">Csevegési adatbázis exportálva</string>
<string name="v6_0_connection_servers_status_descr">Kapcsolatok- és kiszolgálók állapotának megjelenítése.</string>
<string name="v6_0_connect_faster_descr">Kapcsolódjon gyorsabban az ismerőseihez.</string>
@@ -2066,8 +2054,8 @@
<string name="system_mode_toast">Rendszerbeállítások használata</string>
<string name="select_chat_profile">Csevegési profil kiválasztása</string>
<string name="network_proxy_auth_mode_no_auth">Ne használja a hitelesítőadatokat proxyval.</string>
<string name="network_proxy_auth_mode_isolate_by_auth_user">Különböző proxy-hitelesítőadatok használata minden egyes profilhoz.</string>
<string name="network_proxy_auth_mode_isolate_by_auth_entity">Különböző proxy-hitelesítőadatok használata minden egyes kapcsolathoz.</string>
<string name="network_proxy_auth_mode_isolate_by_auth_user">Különböző proxy-hitelesítőadatok használata az összes profilhoz.</string>
<string name="network_proxy_auth_mode_isolate_by_auth_entity">Különböző proxy-hitelesítőadatok használata az összes kapcsolathoz.</string>
<string name="network_proxy_password">Jelszó</string>
<string name="network_proxy_username">Felhasználónév</string>
<string name="network_proxy_auth_mode_username_password">A hitelesítőadatai titkosítatlanul is elküldhetők.</string>
@@ -2101,7 +2089,7 @@
<string name="network_session_mode_server">Kiszolgáló</string>
<string name="network_session_mode_session_description">Minden alkalommal, amikor elindítja az alkalmazást, új SOCKS-hitelesítő-adatokat fog használni.</string>
<string name="network_session_mode_session">Alkalmazás munkamenete</string>
<string name="network_session_mode_server_description">Minden egyes kiszolgálóhoz új SOCKS-hitelesítő-adatok legyenek használva.</string>
<string name="network_session_mode_server_description">Az összes kiszolgálóhoz új, SOCKS-hitelesítő-adatok legyenek használva.</string>
<string name="call_desktop_permission_denied_chrome">Kattintson a címmező melletti info gombra a mikrofon használatának engedélyezéséhez.</string>
<string name="call_desktop_permission_denied_safari">Nyissa meg a Safari Beállítások / Weboldalak / Mikrofon menüt, majd válassza a helyi kiszolgálók engedélyezése lehetőséget.</string>
<string name="call_desktop_permission_denied_title">Hívások kezdeményezéséhez engedélyezze a mikrofon használatát. Fejezze be a hívást, és próbálja meg a hívást újra.</string>
File diff suppressed because it is too large Load Diff
@@ -277,7 +277,6 @@
<string name="cannot_access_keychain">Impossibile accedere al Keystore per salvare la password del database</string>
<string name="alert_title_cant_invite_contacts">Impossibile invitare i contatti!</string>
<string name="change_role">Cambia ruolo</string>
<string name="chat_archive_section">ARCHIVIO CHAT</string>
<string name="snd_conn_event_switch_queue_phase_changing">cambio indirizzo…</string>
<string name="chat_is_stopped">Chat fermata</string>
<string name="group_member_status_introduced">in connessione (presentato)</string>
@@ -398,13 +397,9 @@
<string name="settings_experimental_features">Funzionalità sperimentali</string>
<string name="export_database">Esporta database</string>
<string name="settings_section_title_help">AIUTO</string>
<string name="chat_archive_header">Archivio chat</string>
<string name="chat_is_stopped_indication">Chat fermata</string>
<string name="archive_created_on_ts">Creato il %1$s</string>
<string name="database_error">Errore del database</string>
<string name="passphrase_is_different">La password del database è diversa da quella salvata nel Keystore.</string>
<string name="delete_archive">Elimina archivio</string>
<string name="delete_chat_archive_question">Eliminare l\'archivio della chat\?</string>
<string name="encrypted_database">Database crittografato</string>
<string name="enter_correct_passphrase">Inserisci la password giusta.</string>
<string name="enter_passphrase">Inserisci la password…</string>
@@ -655,7 +650,6 @@
<string name="onboarding_notifications_mode_service">Istantaneo</string>
<string name="onboarding_notifications_mode_subtitle">Può essere cambiato in seguito via impostazioni.</string>
<string name="make_private_connection">Crea una connessione privata</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[Molte persone hanno chiesto: <i>se SimpleX non ha identificatori utente, come può recapitare i messaggi\?</i>]]></string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages"><![CDATA[Solo i dispositivi client memorizzano i profili utente, i contatti, i gruppi e i messaggi inviati con <b>crittografia end-to-end a 2 livelli</b>.]]></string>
<string name="opensource_protocol_and_code_anybody_can_run_servers">Chiunque può installare i server.</string>
<string name="paste_the_link_you_received">Incolla il link che hai ricevuto</string>
@@ -664,7 +658,6 @@
<string name="privacy_redefined">Privacy ridefinita</string>
<string name="onboarding_notifications_mode_title">Notifiche private</string>
<string name="read_more_in_github_with_link"><![CDATA[Maggiori informazioni nel nostro <font color="#0088ff">repository GitHub</font>.]]></string>
<string name="read_more_in_github">Maggiori informazioni nel nostro repository GitHub.</string>
<string name="reject">Rifiuta</string>
<string name="first_platform_without_user_ids">Nessun identificatore utente.</string>
<string name="next_generation_of_private_messaging">La nuova generazione
@@ -675,7 +668,6 @@
<string name="video_call_no_encryption">videochiamata (non crittografata e2e)</string>
<string name="onboarding_notifications_mode_off">Quando l\'app è in esecuzione</string>
<string name="contact_wants_to_connect_via_call">%1$s vuole connettersi con te via</string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[Tu decidi attraverso quale/i server <b>ricevere</b> i messaggi, i tuoi contatti quali server usi per inviare loro i messaggi.]]></string>
<string name="alert_text_skipped_messages_it_can_happen_when">Può accadere quando:
\n1. I messaggi sono scaduti sul client mittente dopo 2 giorni o sul server dopo 30 giorni.
\n2. La decifrazione del messaggio è fallita, perché tu o il tuo contatto avete usato un backup del database vecchio.
@@ -745,7 +737,6 @@
<string name="restore_database">Ripristina backup del database</string>
<string name="restore_database_alert_title">Ripristinare il backup del database\?</string>
<string name="database_restore_error">Errore di ripristino del database</string>
<string name="save_archive">Salva archivio</string>
<string name="save_passphrase_and_open_chat">Salva la password e apri la chat</string>
<string name="database_backup_can_be_restored">Il tentativo di cambiare la password del database non è stato completato.</string>
<string name="unknown_database_error_with_info">Errore del database sconosciuto: %s</string>
@@ -1607,7 +1598,7 @@
<string name="profile_update_event_removed_picture">immagine del profilo rimossa</string>
<string name="v5_5_private_notes_descr">Con file e multimediali criptati.</string>
<string name="v5_5_simpler_connect_ui_descr">La barra di ricerca accetta i link di invito.</string>
<string name="profile_update_event_set_new_picture">impostata nuova immagine del profilo</string>
<string name="profile_update_event_set_new_picture">ha impostato una nuova immagine del profilo</string>
<string name="profile_update_event_set_new_address">impostato nuovo indirizzo di contatto</string>
<string name="profile_update_event_updated_profile">profilo aggiornato</string>
<string name="saved_message_title">Messaggio salvato</string>
@@ -165,8 +165,6 @@
<string name="chat_database_deleted">מסד הנתונים של הצ׳אט נמחק</string>
<string name="chat_database_imported">‬מסד הנתונים של הצ׳אט יובא</string>
<string name="confirm_database_upgrades">אשר שדרוגי מסד נתונים</string>
<string name="chat_archive_header">ארכיון צ׳אט</string>
<string name="chat_archive_section">ארכיון צ׳אט</string>
<string name="chat_is_stopped_indication">צ׳אט מופסק</string>
<string name="alert_title_cant_invite_contacts">לא ניתן להזמין את אנשי הקשר!</string>
<string name="rcv_group_event_changed_your_role">שונה תפקידך ל%s</string>
@@ -222,7 +220,6 @@
<string name="create_profile_button">צור</string>
<string name="create_profile">צור פרופיל</string>
<string name="create_your_profile">יצירת הפרופיל שלך</string>
<string name="archive_created_on_ts">נוצר ב־%1$s</string>
<string name="create_group_link">צור קישור קבוצה</string>
<string name="button_create_group_link">צור קישור</string>
<string name="group_member_status_creator">יוצר הקבוצה</string>
@@ -253,7 +250,6 @@
<string name="create_address_and_let_people_connect">צרו כתובת כדי לאפשר לאנשים להתחבר אליכם.</string>
<string name="decentralized">מבוזר</string>
<string name="set_password_to_export_desc">מסד הנתונים מוצפן באמצעות סיסמה אקראית. אנא שנו אותה לפני הייצוא.</string>
<string name="delete_chat_archive_question">למחוק ארכיון צ׳אט\?</string>
<string name="delete_chat_profile">מחק פרופיל צ׳אט</string>
<string name="chat_preferences_default">ברירת מחדל (%s)</string>
<string name="ttl_day">%d יום</string>
@@ -307,7 +303,6 @@
<string name="database_passphrase_and_export">סיסמה וייצוא של מסד הנתונים</string>
<string name="delete_after">מחק אחרי</string>
<string name="delete_files_and_media_all">מחק את כל הקבצים</string>
<string name="delete_archive">מחק ארכיון</string>
<string name="for_me_only">מחק עבורי</string>
<string name="delete_link">מחק קישור</string>
<string name="users_delete_question">למחוק פרופיל צ׳אט\?</string>
@@ -592,7 +587,6 @@
<string name="learn_more">למדו עוד</string>
<string name="markdown_help">עזרה במרקדאון</string>
<string name="email_invite_subject">בואו נדבר ב־Simplex Chat</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[אנשים רבים שאלו: <i>אם ל־SimpleX אין מזהי משתמש, איך ניתן להעביר הודעות\?</i>]]></string>
<string name="keychain_error">שגיאת Keychain</string>
<string name="join_group_incognito_button">הצטרף עם זהות נסתרת</string>
<string name="leave_group_question">לעזוב קבוצה\?</string>
@@ -797,7 +791,6 @@
<string name="reject_contact_button">דחיה</string>
<string name="read_more_in_user_guide_with_link"><![CDATA[קראו עוד ב<font color="#0088ff">מדריך למשתמש</font>.]]></string>
<string name="rate_the_app">דרגו את האפליקציה</string>
<string name="read_more_in_github">קראו עוד ב־GitHub repository שלנו.</string>
<string name="read_more_in_github_with_link"><![CDATA[קראו עוד ב־<font color="#0088ff">GitHub repository</font> שלנו.]]></string>
<string name="relay_server_if_necessary">יבוצע שימוש בשרת ממסר רק במידת הצורך. גורם אחר יכול לצפות בכתובת ה־IP שלך.</string>
<string name="relay_server_protects_ip">שרת ממסר מגן על כתובת ה־IP שלך, אך הוא יכול לראות את משך השיחה.</string>
@@ -893,7 +886,6 @@
<string name="restore_database">שחזור גיבוי מסד נתונים</string>
<string name="restore_database_alert_title">לשחזר גיבוי מסד נתונים\?</string>
<string name="save_passphrase_and_open_chat">שמור סיסמה ופתח את הצ׳אט</string>
<string name="save_archive">שמור ארכיון</string>
<string name="select_contacts">בחירת אנשי קשר</string>
<string name="v5_1_self_destruct_passcode">קוד גישה להשמדה עצמית</string>
<string name="custom_time_unit_seconds">שניות</string>
@@ -1139,7 +1131,6 @@
<string name="you_need_to_allow_to_send_voice">עליכם לאפשר לאיש הקשר שלכם לשלוח הודעות קוליות כדי שתוכלו לשלוח אותן.</string>
<string name="gallery_video_button">סרטון</string>
<string name="you_can_connect_to_simplex_chat_founder"><![CDATA[באפשרותך <font color="#0088ff">להתחבר למפתחי SimpleX Chat כדי לשאול כל שאלה ולקבל עדכונים</font>.]]></string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[אתם קובעים דרך אילו שרתים <b>לקבל</b> את ההודעות, אנשי הקשר שלכם – השרתים דרכם אתם שולחים להם הודעות.]]></string>
<string name="webrtc_ice_servers">שרתי WebRTC ICE</string>
<string name="integrity_msg_skipped">%1$d הודעות שדולגו</string>
<string name="custom_time_unit_weeks">שבועות</string>
@@ -26,7 +26,7 @@
<string name="users_delete_all_chats_deleted">全チャットとメッセージが削除されます(※元に戻せません※)!</string>
<string name="allow_your_contacts_to_send_voice_messages">送信相手からの音声メッセージを許可する。</string>
<string name="both_you_and_your_contact_can_send_voice">あなたと連絡相手が音声メッセージを送信できます。</string>
<string name="onboarding_notifications_mode_periodic_desc"><![CDATA[<b>電池省エネに良い</b>:バックグラウンド機能で10分毎に新着メッセージを確認します。通話と緊急メッセージを見逃す可能性があります。]]></string>
<string name="onboarding_notifications_mode_periodic_desc"><![CDATA[<b>バッテリーに優しい</b>。アプリは10分ごとにメッセージを確認します。ただし、電話や緊急メッセージを見逃す可能性があります。]]></string>
<string name="icon_descr_audio_off">音声オフ</string>
<string name="attach">添付する</string>
<string name="app_version_code">アプリ・ビルド番号: %s</string>
@@ -77,8 +77,6 @@
<string name="onboarding_notifications_mode_off_desc"><![CDATA[<b>電池消費が最少</b>:アプリがアクティブ時のみに通知が出ます(バックグラウンドサービス無し)。]]></string>
<string name="it_can_disabled_via_settings_notifications_still_shown"><![CDATA[<b>設定メニューにてオフにできます。</b> アプリがアクティブ時に通知が出ます。]]></string>
<string name="both_you_and_your_contacts_can_delete">あなたと連絡相手が送信済みメッセージを永久削除できます。(24時間)</string>
<string name="chat_archive_section">チャットのアーカイブ</string>
<string name="delete_chat_archive_question">チャットのアーカイブを削除しますか?</string>
<string name="join_group_incognito_button">シークレットモードで参加</string>
<string name="group_member_status_intro_invitation">接続待ち (招待)</string>
<string name="group_member_status_accepted">接続待ち (承諾済み)</string>
@@ -156,10 +154,9 @@
<string name="icon_descr_instant_notifications">即時通知</string>
<string name="ensure_smp_server_address_are_correct_format_and_unique">SMPサーバのアドレスを正しく1行ずつに分けて、重複しないように、形式もご確認ください。</string>
<string name="ensure_ICE_server_address_are_correct_format_and_unique">WebRTC ICEサーバのアドレスを正しく1行ずつに分けて、重複しないように、形式もご確認ください。</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[よく聞かれるのは、 <i>if SimpleX にユーザIDがなければ、メッセージをどうやって届けるのでしょうかと。</i>]]></string>
<string name="how_simplex_works">SimpleX の仕様</string>
<string name="icon_descr_call_progress">通話中</string>
<string name="onboarding_notifications_mode_service_desc"><![CDATA[<b>電池消費がより高い</b>!非アクティブ時でもバックグラウンドのサービスが常に稼働します(着信次第に通知がすぐに出ます)。]]></string>
<string name="onboarding_notifications_mode_service_desc"><![CDATA[<b>電池消費がより高い</b>!非アクティブ時でもバックグラウンドのサービスが常に稼働します(着信してすぐに通知が出ます)。]]></string>
<string name="callstatus_calling">発信中</string>
<string name="callstatus_ended">通話終了 %1$s</string>
<string name="icon_descr_call_ended">通話が終了しました。</string>
@@ -324,13 +321,12 @@
<string name="callstate_connected">接続中</string>
<string name="callstatus_connecting">発信中…</string>
<string name="callstate_ended">終了</string>
<string name="opensource_protocol_and_code_anybody_can_run_servers">プロトコル技術とコードはオープンソースで、どなたでもご自分のサーバを運用できます。</string>
<string name="opensource_protocol_and_code_anybody_can_run_servers">誰でもサーバーをホストできます。</string>
<string name="privacy_redefined">プライバシーを再定義</string>
<string name="how_it_works">技術の説明</string>
<string name="make_private_connection">プライベートな接続をする</string>
<string name="onboarding_notifications_mode_title">プライベートな通知</string>
<string name="read_more_in_github_with_link"><![CDATA[<font color="#0088ff">GitHubリポジトリ</font>で詳細をご確認ください。]]></string>
<string name="read_more_in_github">GitHubリポジトリで詳細をご確認ください。</string>
<string name="encrypted_video_call">エンドツーエンド暗号化済みビデオ通話</string>
<string name="no_call_on_lock_screen">無効にする</string>
<string name="status_no_e2e_encryption">エンドツーエンド暗号化がありません</string>
@@ -369,8 +365,6 @@
<string name="database_passphrase_will_be_updated">データベース暗号化のパスフレーズが更新されます。</string>
<string name="database_passphrase_is_required">チャットを開くにはデータベースパスフレーズが必要です。</string>
<string name="file_with_path">ファイル: %s</string>
<string name="archive_created_on_ts">作成日時 %1$s</string>
<string name="delete_archive">アーカイブを削除</string>
<string name="join_group_button">参加</string>
<string name="join_group_question">グループに参加しますか?</string>
<string name="joining_group">グループに参加</string>
@@ -551,7 +545,6 @@
<string name="settings_section_title_device">端末</string>
<string name="no_received_app_files">送受信済みのファイルがありません</string>
<string name="delete_messages">メッセージを削除</string>
<string name="chat_archive_header">チャットのアーカイブ</string>
<string name="rcv_group_event_member_connected">接続中</string>
<string name="rcv_group_event_user_deleted">あなたを除名しました。</string>
<string name="group_link">グループのリンク</string>
@@ -748,7 +741,6 @@
<string name="strikethrough_text">取り消し線</string>
<string name="callstate_starting">接続中…</string>
<string name="next_generation_of_private_messaging">次世代のプライベートメッセンジャー</string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[あなたがメッセージの<b>受信</b>サーバを決められます。あなたの連絡先が同じく、自分に対する受信サーバを決められます。]]></string>
<string name="icon_descr_video_call">ビデオ通話</string>
<string name="onboarding_notifications_mode_off">アプリが稼働中に</string>
<string name="webrtc_ice_servers">WebRTC ICEサーバ</string>
@@ -921,7 +913,6 @@
<string name="stop_chat_to_export_import_or_delete_chat_database">データベースのエクスポート、読み込み、削除するにはチャット機能を停止する必要があります。チャット機能を停止すると送受信ができなくなります。</string>
<string name="delete_chat_profile_action_cannot_be_undone_warning">あなたのプロフィール、連絡先、メッセージ、ファイルが完全削除されます (※元に戻せません※)。</string>
<string name="update_database_passphrase">データベースパスフレーズを更新</string>
<string name="save_archive">アーカイブを保存</string>
<string name="snd_group_event_changed_role_for_yourself">あなたが自分の役割を次に変えました:%s</string>
<string name="snd_conn_event_switch_queue_phase_completed">アドレスを変えました</string>
<string name="snd_conn_event_switch_queue_phase_completed_for_member">%sのアドレスを変えました</string>
@@ -1870,7 +1861,7 @@
<string name="cant_call_contact_deleted_alert_text">連絡先が削除されました。</string>
<string name="member_info_member_disabled">無効</string>
<string name="v6_0_delete_many_messages_descr">一度に最大20件のメッセージを削除できます。</string>
<string name="servers_info_connected_servers_section_header">サーバに接続中</string>
<string name="servers_info_connected_servers_section_header">接続中のサーバ</string>
<string name="servers_info_modal_error_title">エラー</string>
<string name="servers_info_reconnect_server_error">サーバーへの再接続エラー</string>
<string name="servers_info_sessions_errors">エラー</string>
@@ -1891,4 +1882,85 @@
<string name="network_options_save_and_reconnect">保存して再接続</string>
<string name="privacy_media_blur_radius_strong">強め</string>
<string name="privacy_media_blur_radius_medium">普通</string>
<string name="subscription_percentage">パーセンテージを表示</string>
<string name="one_hand_ui_change_instruction">これは見た目の設定から変更できます。</string>
<string name="servers_info_previously_connected_servers_section_header">以前接続していたサーバ</string>
<string name="servers_info_subscriptions_connections_subscribed">アクティブな接続</string>
<string name="servers_info_statistics_section_header">統計情報</string>
<string name="deleted_chats">アーカイブされた連絡先</string>
<string name="settings_message_shape_corner">角丸</string>
<string name="servers_info_messages_sent">送信されたメッセージ数</string>
<string name="servers_info_reset_stats_alert_title">全ての統計情報をリセットしますか?</string>
<string name="servers_info_subscriptions_total">合計</string>
<string name="settings_message_shape_tail">しっぽ</string>
<string name="servers_info">サーバ情報</string>
<string name="servers_info_private_data_disclaimer">%sから計測されています。\nデバイス上の全てのデータはプライベートです。</string>
<string name="servers_info_messages_received">受信したメッセージ数</string>
<string name="servers_info_reset_stats_alert_message">サーバの統計情報をリセットしようとしています - これは元に戻せません!</string>
<string name="servers_info_reset_stats">全統計情報をリセットする</string>
<string name="reset_all_hints">ヒントをリセットする</string>
<string name="snd_error_quota">容量を超えました - 受信者は以前に送信されたメッセージを受け取っていません。</string>
<string name="attempts_label">試行</string>
<string name="acknowledged">確認</string>
<string name="acknowledgement_errors">確認エラー</string>
<string name="deleted">削除完了</string>
<string name="created">作成完了</string>
<string name="n_other_file_errors">%1$d件のその他のファイルエラー。</string>
<string name="error_forwarding_messages">メッセージの転送エラー</string>
<string name="n_file_errors">%1$d件のファイルエラー:\n%2$s</string>
<string name="forward_alert_title_messages_to_forward">%1$s件のメッセージを転送しますか?</string>
<string name="forward_files_in_progress_desc">%1$d件のファイルがまだダウンロード中です。</string>
<string name="forward_files_not_accepted_desc">%1$d件のファイルがダウンロードされませんでした。</string>
<string name="forward_files_failed_to_receive_desc">%1$d件のファイルのダウンロードに失敗しました。</string>
<string name="forward_files_missing_desc">%1$d件のファイルが削除されました。</string>
<string name="forward_files_messages_deleted_after_selection_title">%1$s件のメッセージが転送されませんでした。</string>
<string name="forward_files_not_accepted_receive_files">ダウンロード</string>
<string name="compose_forward_messages_n">%1$s件のメッセージを転送中</string>
<string name="conversation_deleted">会話が削除されました!</string>
<string name="app_check_for_updates_download_completed_title">アプリのアップデートがダウンロードされました</string>
<string name="app_check_for_updates_download_started">アプリの更新をダウンロード中です。アプリを閉じないでください</string>
<string name="app_check_for_updates_button_download">%s%s)をダウンロード</string>
<string name="cant_send_message_to_member_alert_title">グループメンバーにメッセージを送信できません。</string>
<string name="v6_0_your_contacts_descr">後でチャットするために連絡先をアーカイブします。</string>
<string name="v6_0_connection_servers_status_descr">接続とサーバーのステータス</string>
<string name="call_desktop_permission_denied_chrome">アドレスフィールドの近くにある情報ボタンをクリックして、マイクの使用を許可してください。</string>
<string name="connections">接続</string>
<string name="v6_1_customizable_message_descr">カスタマイズ可能なメッセージの形。</string>
<string name="network_smp_proxy_fallback_prohibit_description">プライベートルーティングをサポートしていなくても、メッセージを直接送信しないでください。</string>
<string name="smp_proxy_error_connecting">転送サーバー%1$sへの接続エラーです。後ほど再試行してください。</string>
<string name="error_initializing_web_view_wrong_arch">WebViewの初期化エラーです。WebViewがインストールされており、サポートされているアーキテクチャがarm64であることを確認してください。\nエラー:%s</string>
<string name="error_initializing_web_view">WebViewの初期化エラーです。システムを新しいバージョンに更新してください。開発者にお問い合わせください。\nエラー:%s</string>
<string name="proxy_destination_error_broker_host">%1$sの宛先サーバーアドレスは、転送サーバー%2$sの設定と互換性がありません。</string>
<string name="proxy_destination_error_broker_version">%1$sの宛先サーバーバージョンは、転送サーバー%2$sと互換性がありません。</string>
<string name="delete_without_notification">通知なしで削除</string>
<string name="chunks_deleted">チャンクが削除されました</string>
<string name="chat_theme_apply_to_all_modes">すべてのカラーモード</string>
<string name="cant_call_member_alert_title">グループメンバーに電話できません</string>
<string name="cant_call_contact_connecting_wait_alert_text">連絡先に接続中です。しばらくお待ちいただくか、後で確認してください!</string>
<string name="v6_0_connection_servers_status">ネットワークを管理</string>
<string name="downloaded_files">ダウンロードしたファイル</string>
<string name="delete_members_messages__question">メンバーの%d件のメッセージを削除しますか?</string>
<string name="chat_database_exported_title">チャットデータベースがエクスポートされました</string>
<string name="calls_prohibited_alert_title">通話禁止!</string>
<string name="chunks_downloaded">チャンクがダウンロードされました</string>
<string name="chunks_uploaded">チャンクがアップロードされました</string>
<string name="download_errors">ダウンロードエラー</string>
<string name="network_session_mode_session">アプリセッション</string>
<string name="info_row_debug_delivery">配信のデバッグ</string>
<string name="v6_1_better_calls">改善された通話機能</string>
<string name="v6_1_message_dates_descr">メッセージの日付</string>
<string name="v6_1_better_security">より強力なセキュリティ ✅</string>
<string name="v6_1_better_user_experience">より良いユーザー体験</string>
<string name="v6_1_delete_many_messages_descr">最大200件のメッセージを削除または管理します。</string>
<string name="v6_0_privacy_blur">プライバシー向上のためのぼかし処理。</string>
<string name="v6_0_connect_faster_descr">友達ともっと速くつながりましょう。</string>
<string name="v6_0_upgrade_app_descr">新しいバージョンをGitHubからダウンロードしてください。</string>
<string name="servers_info_downloaded">ダウンロード完了</string>
<string name="reconnect">再接続</string>
<string name="send_errors">送信エラー</string>
<string name="network_socks_proxy">SOCKSプロキシ</string>
<string name="network_proxy_password">パスワード</string>
<string name="toolbar_settings">設定</string>
<string name="servers_info_missing">情報がありません、リロードしてください</string>
<string name="smp_server">SMPサーバ</string>
</resources>
File diff suppressed because it is too large Load Diff
@@ -125,8 +125,6 @@
<string name="files_and_media_section">Failai ir medija</string>
<string name="delete_files_and_media_all">Ištrinti visus failus</string>
<string name="delete_files_and_media_question">Ištrinti failus ir mediją\?</string>
<string name="delete_archive">Ištrinti archyvą</string>
<string name="delete_chat_archive_question">Ištrinti pokalbio archyvą\?</string>
<string name="snd_group_event_group_profile_updated">grupės profilis atnaujintas</string>
<string name="info_row_group">Grupė</string>
<string name="users_delete_question">Ištrinti pokalbio profilį\?</string>
@@ -350,7 +348,6 @@
<string name="whats_new">Kas naujo</string>
<string name="save_and_notify_group_members">Įrašyti ir pranešti grupės nariams</string>
<string name="callstate_received_confirmation">gautas patvirtinimas…</string>
<string name="read_more_in_github">Išsamiau skaitykite mūsų „GitHub“ saugykloje</string>
<string name="icon_descr_call_missed">Praleistas skambutis</string>
<string name="settings_section_title_chats">POKALBIAI</string>
<string name="settings_section_title_themes">APIPAVIDALINIMAI</string>
@@ -393,7 +390,6 @@
<string name="mark_code_verified">Žymėti kaip patvirtintą</string>
<string name="chat_lock">SimpleX užraktas</string>
<string name="saved_ICE_servers_will_be_removed">Įrašyti WebRTC ICE serveriai bus pašalinti.</string>
<string name="save_archive">Įrašyti archyvą</string>
<string name="button_send_direct_message">Siųsti tiesioginę žinutę</string>
<string name="button_remove_member">Šalinti narį</string>
<string name="theme_light">Šviesus</string>
@@ -834,7 +830,6 @@
<string name="restore_database_alert_desc">Prašome įvesti praeitą slaptažodį po duomenų bazės atsarginės kopijos atstatymo. Šis veiksmas negali būti atšauktas.</string>
<string name="mtr_error_no_down_migration">duomenų bazė naujesnė nei programėlė, bet nėra perkėlimo į senesnę versiją: %s</string>
<string name="mtr_error_different">skirtinga migracija programėlėje/duomenų bazėje: %s / %s</string>
<string name="chat_archive_header">Pokalbio archyvas</string>
<string name="icon_descr_group_inactive">Grupė neaktyvi</string>
<string name="info_row_received_at">Gauta</string>
<string name="member_blocked_by_admin">Užblokuota administratoriaus</string>
@@ -903,7 +898,6 @@
<string name="you_can_change_it_later">Atsitiktinė slaptafrazė yra saugoma nustatymuose kaip paprastas tekstas.
\nJūs galite tai pakeisti vėliau.</string>
<string name="chat_is_running">Pokalbiai veikia</string>
<string name="chat_archive_section">POKALBIO ARCHYVAS</string>
<string name="chat_is_stopped_you_should_transfer_database">Pokalbiai sustabdyti. Jei jau naudojote šią duomenų bazę kitame įrenginyje, turėtumėte perkelti ją atgal prieš pradedant pokalbius.</string>
<string name="rcv_group_event_member_blocked">užblokavo %s</string>
<string name="switch_receiving_address">Keisti gavimo adresą</string>
@@ -1061,7 +1055,6 @@
<string name="chat_is_stopped_indication">Pokalbiai sustabdyti</string>
<string name="group_member_status_accepted">jungiamasi (priimtas)</string>
<string name="icon_descr_contact_checked">Kontaktas patikrintas</string>
<string name="archive_created_on_ts">Sukurta %1$s</string>
<string name="passphrase_is_different">Duomenų bazės slaptafrazė yra kitokia nei išsaugota raktų saugykloje.</string>
<string name="database_will_be_encrypted_and_passphrase_stored_in_settings">Duomenų bazė bus užšifruota ir slaptafrazė bus saugoma nustatymuose.</string>
<string name="alert_message_group_invitation_expired">Grupės pakvietimas nebegalioja, siuntėjas jį pašalino.</string>
@@ -1537,7 +1530,6 @@
<string name="migrate_from_device_verify_database_passphrase">Patvirtinti duomenų bazės slaptafrazę</string>
<string name="migrate_from_device_verify_passphrase">Patvirtinti slaptafrazę</string>
<string name="mute_chat">Nutildyti</string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[Jūs kontroliuojate per kurį serverį (-us) <b>gauti</b> žinutes, jūsų kontaktai - serverius kuriuos naudojate siųsti jiems žinutes.]]></string>
<string name="relay_server_protects_ip">Tarpinis serveris apsaugo jūsų IP adresą, bet jis gali stebėti skambučio trukmę.</string>
<string name="status_no_e2e_encryption">nėra visapusio šifravimo</string>
<string name="new_database_archive">Naujas duomenų bazės archyvas</string>
@@ -1606,7 +1598,6 @@
<string name="snd_conn_event_switch_queue_phase_completed_for_member">pakeitėte adresą %s</string>
<string name="icon_descr_expand_role">Išplėsti rolių pasirinkimą</string>
<string name="connect_plan_you_are_already_joining_the_group_vName"><![CDATA[Jau jungiatės prie grupės <b>%1$s</b>.]]></string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[Daug žmonių klausė: <i>jei SimpleX neturi naudotojų identifikatorių, kaip jis gali pristatyti žinutes?</i>]]></string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages"><![CDATA[Tik klientų įrenginiai saugo naudotojų profilius, kontaktus, grupes ir išsiųstas žinutes su <b>dviejų sluoksnių visapusiu šifravimu</b>.]]></string>
<string name="to_protect_privacy_simplex_has_ids_for_queues">Kad apsaugoti privatumą, vietoj naudotojų ID naudojamų visose kitose platformose, SimpleX turi identifikatorius žinučių eilėms, skirtingus kiekvienam jūsų kontaktui.</string>
<string name="privacy_message_draft">Žinutės juodraštis</string>
@@ -1780,4 +1771,8 @@
<string name="network_smp_proxy_fallback_allow">Taip</string>
<string name="copy_error">Kopijavimo klaida</string>
<string name="chat_theme_apply_to_mode">Pritaikyti prie</string>
<string name="n_file_errors">%1$d failo klaida (-os):\n%2$s.</string>
<string name="forward_files_in_progress_desc">%1$d failas (-ai, -ų) vis dar atsisiunčiamas (-i, -a).</string>
<string name="forward_files_failed_to_receive_desc">Nepavyko atsisiųsti %1$d failo (-ų).</string>
<string name="selected_chat_items_selected_n">%d pasirinkta</string>
</resources>
@@ -24,7 +24,6 @@
<string name="chat_is_running">Chat is actief</string>
<string name="clear_chat_menu_action">Wissen</string>
<string name="chat_database_section">CHAT DATABASE</string>
<string name="chat_archive_section">CHAT ARCHIEF</string>
<string name="chat_console">Chat console</string>
<string name="chat_database_imported">Chat database geïmporteerd</string>
<string name="chat_database_deleted">Chat database verwijderd</string>
@@ -117,7 +116,6 @@
<string name="chat_is_stopped">Chat is gestopt</string>
<string name="notifications_mode_periodic_desc">Controleert nieuwe berichten elke 10 minuten gedurende maximaal 1 minuut</string>
<string name="rcv_group_event_changed_your_role">je rol gewijzigd in %s</string>
<string name="chat_archive_header">Gesprek archief</string>
<string name="change_database_passphrase_question">Wachtwoord database wijzigen\?</string>
<string name="chat_is_stopped_indication">Chat is gestopt</string>
<string name="chat_preferences">Chat voorkeuren</string>
@@ -215,7 +213,6 @@
<string name="current_passphrase">Huidige wachtwoord…</string>
<string name="database_encrypted">Database versleuteld!</string>
<string name="rcv_group_event_member_connected">is toegetreden</string>
<string name="archive_created_on_ts">Gemaakt op %1$s</string>
<string name="group_member_status_complete">compleet</string>
<string name="clear_contacts_selection_button">Wissen</string>
<string name="group_member_status_connected">verbonden</string>
@@ -230,8 +227,6 @@
<string name="contacts_can_mark_messages_for_deletion">Contact personen kunnen berichten markeren voor verwijdering; u kunt ze wel bekijken.</string>
<string name="theme_dark">Donker</string>
<string name="chat_preferences_default">standaard (%s)</string>
<string name="delete_chat_archive_question">Chat archief verwijderen\?</string>
<string name="delete_archive">Archief verwijderen</string>
<string name="delete_contact_question">Verwijder contact\?</string>
<string name="delete_chat_profile_question">Chatprofiel verwijderen?</string>
<string name="full_deletion">Verwijderen voor iedereen</string>
@@ -431,7 +426,6 @@
<string name="how_it_works">Hoe het werkt</string>
<string name="callstatus_missed">gemiste oproep</string>
<string name="how_simplex_works">Hoe SimpleX werkt</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[Veel mensen vroegen: <i>als SimpleX geen gebruikers-ID\'s heeft, hoe kan het dan berichten bezorgen\?</i>]]></string>
<string name="incoming_audio_call">Inkomende audio oproep</string>
<string name="incoming_video_call">Inkomend video gesprek</string>
<string name="ignore">Negeren</string>
@@ -617,11 +611,9 @@
<string name="you_control_your_chat">Jij beheert je gesprek!</string>
<string name="your_profile_is_stored_on_your_device">Uw profiel, contacten en afgeleverde berichten worden op uw apparaat opgeslagen.</string>
<string name="callstate_starting">beginnen…</string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[U bepaalt via welke server(s) je de berichten <b>ontvangt</b>, uw contacten de servers die u gebruikt om ze berichten te sturen.]]></string>
<string name="icon_descr_video_on">Video aan</string>
<string name="delete_chat_profile_action_cannot_be_undone_warning">Deze actie kan niet ongedaan worden gemaakt. Uw profiel, contacten, berichten en bestanden gaan onomkeerbaar verloren.</string>
<string name="messages_section_description">Deze instelling is van toepassing op berichten in uw huidige chatprofiel</string>
<string name="save_archive">Bewaar archief</string>
<string name="rcv_group_event_updated_group_profile">bijgewerkt groep profiel</string>
<string name="group_member_status_removed">verwijderd</string>
<string name="group_main_profile_sent">Uw chatprofiel wordt verzonden naar de groepsleden</string>
@@ -937,7 +929,6 @@
<string name="description_you_shared_one_time_link_incognito">je hebt een eenmalige link incognito gedeeld</string>
<string name="chat_help_tap_button">Tik op de knop</string>
<string name="read_more_in_github_with_link"><![CDATA[Lees meer in onze <font color="#0088ff">GitHub repository</font>.]]></string>
<string name="read_more_in_github">Lees meer in onze GitHub repository.</string>
<string name="integrity_msg_skipped">%1$d bericht(en) overgeslagen</string>
<string name="moderated_description">gemodereerd</string>
<string name="moderated_item_description">gemodereerd door %s</string>
@@ -432,15 +432,12 @@
<string name="onboarding_notifications_mode_service">Natychmiastowy</string>
<string name="onboarding_notifications_mode_subtitle">Można to później zmienić w ustawieniach.</string>
<string name="make_private_connection">Nawiąż prywatne połączenie</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[Wiele osób pytało: <i>jeśli SimpleX nie ma identyfikatora użytkownika, jak może dostarczać wiadomości\?</i>]]></string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages"><![CDATA[Tylko urządzenia klienckie przechowują profile użytkowników, kontakty, grupy i wiadomości wysyłane za pomocą <b>dwuwarstwowego szyfrowania end-to-end</b>.]]></string>
<string name="onboarding_notifications_mode_periodic">Okresowo</string>
<string name="onboarding_notifications_mode_title">Prywatne powiadomienia</string>
<string name="read_more_in_github_with_link"><![CDATA[Przeczytaj więcej na naszym <font color="#0088ff">repozytorium GitHub</font>.]]></string>
<string name="read_more_in_github">Przeczytaj więcej na naszym repozytorium GitHub.</string>
<string name="use_chat">Użyj czatu</string>
<string name="onboarding_notifications_mode_off">Gdy aplikacja jest uruchomiona</string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[Kontrolujesz przez który serwer(y) <b>odbierać</b> wiadomości, Twoje kontakty - serwery, których używasz do wysyłania im wiadomości.]]></string>
<string name="onboarding_notifications_mode_service_desc"><![CDATA[<b>Zużywa więcej baterii</b>! Aplikacja zawsze działa w tle - powiadomienia są wyświetlane natychmiastowo.]]></string>
<string name="incoming_audio_call">Przychodzące połączenie audio</string>
<string name="incoming_video_call">Przychodzące połączenie wideo</string>
@@ -601,14 +598,11 @@
<string name="wrong_passphrase">Nieprawidłowe hasło bazy danych</string>
<string name="wrong_passphrase_title">Nieprawidłowe hasło!</string>
<string name="you_have_to_enter_passphrase_every_time">Musisz wprowadzić hasło przy każdym uruchomieniu aplikacji - nie jest one przechowywane na urządzeniu.</string>
<string name="chat_archive_header">Archiwum czatu</string>
<string name="chat_archive_section">ARCHIWUM CZATU</string>
<string name="chat_is_stopped_indication">Czat jest zatrzymany</string>
<string name="confirm_database_upgrades">Potwierdź aktualizacje bazy danych</string>
<string name="database_downgrade">Obniż wersję bazy danych</string>
<string name="database_upgrade">Aktualizacja bazy danych</string>
<string name="mtr_error_no_down_migration">wersja bazy danych jest nowsza od aplikacji, ale nie ma migracji w dół dla: %s</string>
<string name="delete_archive">Usuń archiwum</string>
<string name="mtr_error_different">różne migracje w aplikacji/bazy danych: %s / %s</string>
<string name="downgrade_and_open_chat">Obniż wersję i otwórz czat</string>
<string name="icon_descr_group_inactive">Grupa nieaktywna</string>
@@ -630,7 +624,6 @@
<string name="restore_database">Przywróć kopię zapasową bazy danych</string>
<string name="restore_database_alert_title">Przywrócić kopię zapasową bazy danych\?</string>
<string name="database_restore_error">Błąd przywracania bazy danych</string>
<string name="save_archive">Zapisz archiwum</string>
<string name="database_backup_can_be_restored">Próba zmiany hasła bazy danych nie została zakończona.</string>
<string name="alert_message_no_group">Ta grupa już nie istnieje.</string>
<string name="upgrade_and_open_chat">Zaktualizuj i otwórz czat</string>
@@ -925,13 +918,11 @@
<string name="delete_contact_all_messages_deleted_cannot_undo_warning">Kontakt i wszystkie wiadomości zostaną usunięte - nie można tego cofnąć!</string>
<string name="connection_error_auth">Błąd połączenia (UWIERZYTELNIANIE)</string>
<string name="connect_via_link_or_qr">Połącz się przez link / kod QR</string>
<string name="archive_created_on_ts">Utworzony na %1$s</string>
<string name="create_group">Utwórz tajną grupę</string>
<string name="create_secret_group_title">Utwórz tajną grupę</string>
<string name="set_password_to_export_desc">Baza danych jest zaszyfrowana przy użyciu losowego hasła. Proszę zmienić je przed eksportem.</string>
<string name="ttl_days">%d dni</string>
<string name="delete_group_menu_action">Usuń</string>
<string name="delete_chat_archive_question">Usunąć archiwum czatu\?</string>
<string name="delete_messages_after">Usuń wiadomości po</string>
<string name="disappearing_messages_are_prohibited">Znikające wiadomości są zabronione w tej grupie.</string>
<string name="error_deleting_contact_request">Błąd usuwania prośby o kontakt</string>
@@ -57,7 +57,6 @@
<string name="keychain_is_storing_securely">Android Keystore é usada para armazenar a senha com segurança - permite que o serviço de notificação funcione.</string>
<string name="keychain_allows_to_receive_ntfs">A Android Keystore será usada para armazenar a senha com segurança depois que você reiniciar o aplicativo ou alterar a senha - isso permitirá o recebimento de notificações.</string>
<string name="cannot_access_keychain">Não é possível acessar a Keystore para salvar a senha do banco de dados</string>
<string name="chat_archive_section">ARQUIVO DE BATE-PAPO</string>
<string name="chat_is_stopped_indication">O bate-papo está parado</string>
<string name="clear_contacts_selection_button">Limpar</string>
<string name="chat_preferences">Preferências de bate-papo</string>
@@ -81,7 +80,6 @@
<string name="chat_is_running">O bate-papo está em execução</string>
<string name="chat_is_stopped">O bate-papo está parado</string>
<string name="change_database_passphrase_question">Alterar senha do banco de dados\?</string>
<string name="chat_archive_header">Arquivo de chat</string>
<string name="rcv_conn_event_switch_queue_phase_completed">endereço alterado para você</string>
<string name="both_you_and_your_contact_can_send_disappearing">Você e seu contato podem enviar mensagens temporárias.</string>
<string name="full_backup">Backup de dados do aplicativo</string>
@@ -180,8 +178,6 @@
<string name="confirm_new_passphrase">Confirmar nova senha…</string>
<string name="current_passphrase">Senha atual…</string>
<string name="database_passphrase_is_required">Senha do banco de dados é necessária para abrir o chat.</string>
<string name="delete_archive">Excluir arquivo</string>
<string name="delete_chat_archive_question">Excluir arquivo de chat\?</string>
<string name="rcv_group_event_changed_member_role">cargo alterado de %s para %s</string>
<string name="rcv_group_event_member_connected">conectado</string>
<string name="delete_link">Excluir link</string>
@@ -218,7 +214,6 @@
<string name="connection_error_auth">Erro de conexão (AUTH)</string>
<string name="display_name_connection_established">conexão estabelecida</string>
<string name="connection_local_display_name">conexão %1$d</string>
<string name="archive_created_on_ts">Criado em %1$s</string>
<string name="maximum_supported_file_size">Atualmente, o tamanho máximo de arquivo suportado é %1$s.</string>
<string name="delete_verb">Excluir</string>
<string name="database_encryption_will_be_updated">Ssnha de criptografia do banco de dados será atualizada e armazenada na Keystore.</string>
@@ -474,7 +469,6 @@
<string name="app_version_code">Compilação do aplicativo: %s</string>
<string name="save_and_notify_contact">Salvar e notificar contato</string>
<string name="callstate_received_answer">resposta recebida…</string>
<string name="read_more_in_github">Leia mais no nosso repositório do GitHub.</string>
<string name="paste_the_link_you_received">Cole o link que você recebeu</string>
<string name="onboarding_notifications_mode_off">Quando o aplicativo está em execução</string>
<string name="onboarding_notifications_mode_periodic">Periódico</string>
@@ -592,7 +586,6 @@
<string name="markdown_in_messages">Markdown em mensagens</string>
<string name="smp_servers">Servidores SMP</string>
<string name="smp_servers_preset_address">Endereço do servidor pré-definido</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[Muitos perguntaram:<i> se SimpleX não tem identificadores de usuários, como ele pode mandar mensagens\?</i>]]></string>
<string name="reject">Rejeitar</string>
<string name="integrity_msg_skipped">%1$d mensagem(s) ignorada(s)</string>
<string name="protect_app_screen">Proteger a tela do aplicativo</string>
@@ -685,7 +678,6 @@
<string name="delete_chat_profile_action_cannot_be_undone_warning">Esta ação não pode ser desfeita - seu perfil, contatos, mensagens e arquivos serão irreversivelmente perdidos.</string>
<string name="remove_passphrase">Remover</string>
<string name="wrong_passphrase">Senha do banco de dados incorreta</string>
<string name="save_archive">Salvar arquivo</string>
<string name="restore_passphrase_not_found_desc">Senha não encontrada na Keystore, por favor digite-a manualmente. Isso pode ter ocorrido se você recuperou os dados do app usando uma ferramenta de backup. Se esse não é o caso, por favor, contate os desenvolvedores.</string>
<string name="youve_accepted_group_invitation_connecting_to_inviting_group_member">Você se juntou a este grupo. Conectando-se a um membro convidado do grupo.</string>
<string name="leave_group_question">Sair do grupo\?</string>
@@ -895,7 +887,7 @@
<string name="you_are_observer">você é um observador</string>
<string name="voice_message_with_duration">Mensagem de voz (%1$s)</string>
<string name="share_link">Compartilhar link</string>
<string name="to_protect_privacy_simplex_has_ids_for_queues">Para proteger a privacidade, em vez dos IDs de usuário usados por todas as outras plataformas, SimpleX tem identificadores para filas de mensagens, separados para cada um de seus contatos.</string>
<string name="to_protect_privacy_simplex_has_ids_for_queues">Para proteger a privacidade, SimpleX usa identificadores separados para cada um de seus contatos.</string>
<string name="icon_descr_video_call">chamada de vídeo</string>
<string name="show_call_on_lock_screen">Mostrar</string>
<string name="webrtc_ice_servers">Servidores ICE WebRTC</string>
@@ -1016,11 +1008,10 @@
<string name="settings_section_title_support">APOIE SIMPLEX CHAT</string>
<string name="enable_automatic_deletion_message">Esta ação não pode ser desfeita - as mensagens enviadas e recebidas antes do selecionado serão excluídas. Pode levar vários minutos.</string>
<string name="confirm_database_upgrades">Confirme as atualizações do banco de dados</string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages"><![CDATA[Somente o cliente dos dispositivos armazenam perfis de usuários, contatos, grupos e mensagens enviadas com <b>criptografia de ponta a ponta em duas camadas</b>.]]></string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages">Somente o cliente dos dispositivos armazenam perfis de usuários, contatos, grupos e mensagens.</string>
<string name="thank_you_for_installing_simplex">Obrigado por instalar o SimpleX Chat!</string>
<string name="the_messaging_and_app_platform_protecting_your_privacy_and_security">A plataforma de mensagens que protege sua privacidade e segurança.</string>
<string name="invite_prohibited_description">Você está tentando convidar um contato com quem compartilhou um perfil anônimo para o grupo no qual está usando seu perfil principal</string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[Você controla por meio de qual(is) servidor(es) <b>receber</b> as mensagens, seus contatos controlam os servidores que você usa para enviar mensagens.]]></string>
<string name="smp_server_test_secure_queue">Fila segura</string>
<string name="icon_descr_profile_image_placeholder">imagem de perfil temporária</string>
<string name="error_loading_smp_servers">Erro ao carregar servidores SMP</string>
@@ -2104,4 +2095,5 @@
<string name="network_proxy_incorrect_config_title">Erro ao salvar proxy</string>
<string name="network_proxy_password">Senha</string>
<string name="network_proxy_username">Nome de usuário</string>
<string name="network_session_mode_session">Sessão do aplicativo</string>
</resources>
@@ -33,7 +33,6 @@
<string name="settings_section_title_icon">ÍCONE DA APLICAÇÃO</string>
<string name="chat_item_ttl_month">1 mês</string>
<string name="messages_section_title">Mensagens</string>
<string name="chat_archive_section">ARQUIVO DE CONVERSA</string>
<string name="button_add_welcome_message">Adicionar mensagem de boas-vindas</string>
<string name="users_add">Adicional perfil</string>
<string name="users_delete_data_only">Apenas dados de perfil local</string>
@@ -135,11 +134,8 @@
<string name="delete_after">Eliminar após</string>
<string name="delete_verb">Eliminar</string>
<string name="delete_contact_menu_action">Eliminar</string>
<string name="chat_archive_header">Arquivo de conversa</string>
<string name="delete_group_menu_action">Eliminar</string>
<string name="delete_files_and_media_all">Eliminar todos os ficheiros</string>
<string name="delete_archive">Eliminar arquivo</string>
<string name="delete_chat_archive_question">Eliminar arquivo de conversa\?</string>
<string name="delete_database">Eliminar base de dados</string>
<string name="chat_database_section">BASE DE DADOS DE CONVERSA</string>
<string name="chat_database_deleted">Base de dados de conversa eliminada</string>
@@ -355,7 +351,6 @@
<string name="contribute">Contribuir</string>
<string name="copy_verb">Copiar</string>
<string name="core_version">Versão principal: v%s</string>
<string name="archive_created_on_ts">Criado a %1$s</string>
<string name="create_group_link">Criar ligação de grupo</string>
<string name="v4_2_group_links">Ligações de grupo</string>
<string name="callstatus_connecting">conectando chamada…</string>
@@ -383,7 +378,6 @@
<string name="save_and_update_group_profile">Salvar e atualizar o perfil do grupo</string>
<string name="network_options_save">Salvar</string>
<string name="save_passphrase_and_open_chat">Salvar senha e abrir conversa</string>
<string name="save_archive">Salvar arquivo</string>
<string name="join_group_incognito_button">Junte-se em modo anónimo</string>
<string name="delete_link">Apagar ligação</string>
<string name="address_section_title">Endereço</string>
@@ -641,7 +635,7 @@
<string name="to_verify_compare">Para verificar a encriptação de ponta a ponta com o seu contato, compare (ou leia) o código nos seus dispositivos.</string>
<string name="scan_code_from_contacts_app">Ler o código de segurança a partir da aplicação do seu contacto.</string>
<string name="smp_servers_scan_qr">Ler o código QR do servidor</string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages"><![CDATA[Apenas dispositivos cliente armazenam perfis de utilizador, contatos, grupos e mensagens enviadas com <b>encriptação de ponta a ponta de 2 camadas</b>.]]></string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages">Apenas dispositivos pessoais armazenam perfis de utilizador, contatos, grupos e mensagens.</string>
<string name="status_contact_has_e2e_encryption">o contacto tem encriptação ponta a ponta</string>
<string name="status_no_e2e_encryption">sem encriptação ponta a ponta</string>
<string name="group_member_status_creator">criador</string>
@@ -229,7 +229,6 @@
<string name="smp_save_servers_question">Salvezi servere?</string>
<string name="icon_descr_call_rejected">Apel respins</string>
<string name="saved_message_title">Mesaj salvat</string>
<string name="save_archive">Salvează arhiva</string>
<string name="restart_the_app_to_create_a_new_chat_profile">Repornește aplicația pentru a crea un nou profil</string>
<string name="save_passphrase_in_keychain">Salvează fraza de acces în Keystore</string>
<string name="save_group_profile">Salvează profilul grupului</string>
@@ -441,7 +440,6 @@
<string name="your_chat_database">Baza ta de date a conversațiilor</string>
<string name="database_is_not_encrypted">Baza ta de date a conversațiilor nu este criptată - setează frază de acces pentru a o proteja.</string>
<string name="database_encryption_will_be_updated_in_settings">Fraza de acces de criptare a bazei de date va fi actualizată și stocată în setări.</string>
<string name="archive_created_on_ts">Creat pe %1$s</string>
<string name="snd_group_event_changed_member_role">ai schimbat rolul %s la %s</string>
<string name="alert_title_cant_invite_contacts">Nu se pot invita contactele!</string>
<string name="you_joined_this_group">Te-ai alăturat grupului</string>
@@ -595,7 +593,6 @@
<string name="chat_console">Consolă conversație</string>
<string name="confirm_password">Confirmați parola</string>
<string name="colored_text">colorat</string>
<string name="chat_archive_header">Arhivă conversație</string>
<string name="migrate_from_device_all_data_will_be_uploaded">Toate contactele, conversațiile și fișierele dumneavoastră vor fi encriptate într-un mod sigur și încărcate pe bucăți pe releurile XFTP configurate.</string>
<string name="icon_descr_video_asked_to_receive">Rugat să primească videoclipul</string>
<string name="smp_server_test_compare_file">Comparați fișierul</string>
@@ -616,7 +613,6 @@
<string name="migrate_from_device_using_on_two_device_breaks_encryption"><![CDATA[<b>Vă rugăm să rețineți</b>: folosind aceeași bază de date pe două dispozitive, va intrerupe decripția mesajelor de la conexiunile dumneavoastră, ca protecție de securitate.]]></string>
<string name="migrate_from_device_confirm_upload">Confirmați încărcarea</string>
<string name="migrate_from_device_confirm_you_remember_passphrase">Confirmați că țineți minte parola de la baza de date pentru a o migra.</string>
<string name="chat_archive_section">ARHIVĂ CONVERSAȚIE</string>
<string name="info_row_connection">Conexiune</string>
<string name="delete_chat_profile_question">Ștergi profilul de conversație?</string>
<string name="for_me_only">Șterge pentru mine</string>
@@ -626,7 +622,6 @@
<string name="info_row_deleted_at">Șters la</string>
<string name="desktop_app_version_is_incompatible">Versiunea aplicației desktop %s nu este compatibilă cu această aplicație.</string>
<string name="delete_member_message__question">Ștergi mesajul membrului?</string>
<string name="delete_archive">Șterge arhiva</string>
<string name="button_delete_group">Șterge grup</string>
<string name="delete_and_notify_contact">Șterge și notifică contactele</string>
<string name="decentralized">Decentralizat</string>
@@ -652,7 +647,6 @@
<string name="delete_contact_menu_action">Șterge</string>
<string name="delete_group_menu_action">Șterge</string>
<string name="delete_files_and_media_question">Ștergi fișiere și media?</string>
<string name="delete_chat_archive_question">Ștergi arhiva conversației?</string>
<string name="ttl_days">%d zile</string>
<string name="ttl_day">%d zi</string>
<string name="delete_address">Șterge adresa</string>
@@ -475,11 +475,8 @@
<string name="how_it_works">Как это работает</string>
<!-- How SimpleX Works -->
<string name="how_simplex_works">Как SimpleX работает</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[Много пользователей спросили: <i>как SimpleX доставляет сообщения без идентификаторов пользователей?</i>]]></string>
<string name="to_protect_privacy_simplex_has_ids_for_queues">Чтобы защитить Вашу конфиденциальность, вместо ID пользователей, которые есть в других платформах, SimpleX использует ID для очередей сообщений, разные для каждого контакта.</string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[Вы определяете через какие серверы Вы <b>получаете сообщения</b>, Ваши контакты - серверы, которые Вы используете для отправки.]]></string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages"><![CDATA[Только пользовательские устройства хранят контакты, группы и сообщения, которые отправляются <b>с двухуровневым end-to-end шифрованием</b>.]]></string>
<string name="read_more_in_github">Узнайте больше из нашего GitHub репозитория.</string>
<string name="read_more_in_github_with_link"><![CDATA[Узнайте больше из нашего <font color="#0088ff">GitHub репозитория</font>.]]></string>
<!-- SetNotificationsMode.kt -->
<string name="use_chat">Использовать чат</string>
@@ -676,12 +673,6 @@
<string name="chat_is_stopped_indication">Чат остановлен</string>
<string name="you_can_start_chat_via_setting_or_by_restarting_the_app">Вы можете запустить чат через Настройки приложения или перезапустив приложение.</string>
<!-- ChatArchiveView.kt -->
<string name="chat_archive_header">Архив чата</string>
<string name="chat_archive_section">АРХИВ ЧАТА</string>
<string name="save_archive">Сохранить архив</string>
<string name="delete_archive">Удалить архив</string>
<string name="archive_created_on_ts">Дата создания %1$s</string>
<string name="delete_chat_archive_question">Удалить архив чата?</string>
<!-- Groups -->
<string name="group_invitation_item_description">приглашение в группу %1$s</string>
<string name="join_group_question">Вступить в группу?</string>
@@ -160,7 +160,6 @@
<string name="connection_timeout">หมดเวลาการเชื่อมต่อ</string>
<string name="connect_via_group_link">เชื่อมต่อผ่านลิงค์กลุ่ม\?</string>
<string name="delete_contact_all_messages_deleted_cannot_undo_warning">ผู้ติดต่อและข้อความทั้งหมดจะถูกลบ - ไม่สามารถยกเลิกได้!</string>
<string name="archive_created_on_ts">สร้างเมื่อ %1$s</string>
<string name="maximum_supported_file_size">ขนาดไฟล์สูงสุดที่รองรับในปัจจุบันคือ %1$s</string>
<string name="v5_1_custom_themes">ธีมที่กำหนดเอง</string>
<string name="developer_options">ID ฐานข้อมูลและตัวเลือกการแยกการส่งผ่าน</string>
@@ -239,8 +238,6 @@
<string name="database_error">ความผิดพลาดในฐานข้อมูล</string>
<string name="confirm_database_upgrades">ยืนยันการอัพเกรดฐานข้อมูล</string>
<string name="database_downgrade">ดาวน์เกรดฐานข้อมูล</string>
<string name="chat_archive_header">ที่เก็บแชทถาวร</string>
<string name="chat_archive_section">ที่เก็บแชทถาวร</string>
<string name="chat_is_stopped_indication">การแชทหยุดทํางานแล้ว</string>
<string name="rcv_group_event_member_connected">เชื่อมต่อสำเร็จ</string>
<string name="rcv_conn_event_switch_queue_phase_changing">กำลังเปลี่ยนที่อยู่…</string>
@@ -432,8 +429,6 @@
<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="delete_archive">ลบที่เก็บถาวร</string>
<string name="delete_chat_archive_question">ลบที่เก็บแชทถาวร\?</string>
<string name="icon_descr_group_inactive">กลุ่มที่ไม่ได้ใช้งาน</string>
<string name="alert_title_no_group">ไม่พบกลุ่ม!</string>
<string name="group_invitation_expired">คำเชิญเข้าร่วมกลุ่มหมดอายุแล้ว</string>
@@ -751,7 +746,6 @@
<string name="message_delivery_error_desc">เป็นไปได้มากว่าผู้ติดต่อนี้ได้ลบการเชื่อมต่อกับคุณ</string>
<string name="message_delivery_error_title">ข้อผิดพลาดในการส่งข้อความ</string>
<string name="ensure_smp_server_address_are_correct_format_and_unique">ตรวจสอบให้แน่ใจว่าที่อยู่เซิร์ฟเวอร์ SMP อยู่ในรูปแบบที่ถูกต้อง แยกบรรทัดและไม่ซ้ำกัน</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[หลายคนถามว่า: <i>ถ้า SimpleX ไม่มีตัวระบุผู้ใช้ จะส่งข้อความได้อย่างไร\?</i>]]></string>
<string name="network_use_onion_hosts_prefer_desc">โฮสต์หัวหอมจะถูกใช้เมื่อมี</string>
<string name="only_your_contact_can_send_voice">ผู้ติดต่อของคุณเท่านั้นที่สามารถส่งข้อความเสียงได้</string>
<string name="simplex_link_mode_browser_warning">การเปิดลิงก์ในเบราว์เซอร์อาจลดความเป็นส่วนตัวและความปลอดภัยของการเชื่อมต่อ ลิงก์ SimpleX ที่ไม่น่าเชื่อถือจะเป็นสีแดง</string>
@@ -773,7 +767,6 @@
<string name="callstate_received_confirmation">ได้รับการยืนยัน…</string>
<string name="privacy_redefined">นิยามความเป็นส่วนตัวใหม่</string>
<string name="read_more_in_github_with_link"><![CDATA[อ่านเพิ่มเติมใน <font color="#0088ff"> GitHub repository </font> ของเรา]]></string>
<string name="read_more_in_github">อ่านเพิ่มเติมใน GitHub repository ของเรา</string>
<string name="onboarding_notifications_mode_title">การแจ้งเตือนส่วนตัว</string>
<string name="alert_text_fragment_please_report_to_developers">โปรดรายงานไปยังผู้พัฒนาแอป</string>
<string name="privacy_and_security">ความเป็นส่วนตัวและความปลอดภัย</string>
@@ -837,7 +830,6 @@
<string name="restore_database_alert_confirm">คืนค่า</string>
<string name="restore_database_alert_title">คืนค่าฐานข้อมูลสำรองไหม\?</string>
<string name="database_restore_error">กู้คืนข้อผิดพลาดของฐานข้อมูล</string>
<string name="save_archive">บันทึกไฟล์เก็บถาวร</string>
<string name="rcv_group_event_member_deleted">ลบแล้ว %1$s</string>
<string name="rcv_group_event_user_deleted">ลบคุณออกแล้ว</string>
<string name="group_member_status_removed">ถูกลบแล้ว</string>
@@ -1155,7 +1147,6 @@
<string name="your_profile_is_stored_on_your_device">โปรไฟล์ รายชื่อผู้ติดต่อ และข้อความที่ส่งของคุณจะถูกจัดเก็บไว้ในอุปกรณ์ของคุณ</string>
<string name="you_can_use_markdown_to_format_messages__prompt">คุณสามารถใช้มาร์กดาวน์เพื่อจัดรูปแบบข้อความ:</string>
<string name="callstate_waiting_for_answer">รอคำตอบ…</string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[คุณควบคุมผ่านเซิร์ฟเวอร์ที่จะ<b>รับ</b>ข้อความและผู้ติดต่อของคุณ – เซิร์ฟเวอร์ที่คุณใช้เพื่อส่งข้อความถึงพวกเขา]]></string>
<string name="use_chat">ใช้แชท</string>
<string name="icon_descr_video_call">การสนทนาทางวิดีโอ</string>
<string name="your_calls">การโทรของคุณ</string>
@@ -106,7 +106,6 @@
<string name="restore_database_alert_title">Veri tabanı yedeğini geri yükle\?</string>
<string name="database_restore_error">Veri tabanını geri yüklerken hata</string>
<string name="database_downgrade">Veritabanı sürüm düşürme</string>
<string name="save_archive">Arşivi kaydet</string>
<string name="current_version_timestamp">%s (mevcut)</string>
<string name="save_and_update_group_profile">Kaydet ve grup profilini güncelle</string>
<string name="save_welcome_message_question">Karşılama mesajı kaydedilsin mi?</string>
@@ -429,9 +428,6 @@
<string name="set_password_to_export_desc">Veri tabanı, rastgele bir parola ile şifrelendi. Dışa aktarmadan önce lütfen değiştir.</string>
<string name="delete_files_and_media_question">Dosyaları ve medyayı sil\?</string>
<string name="database_will_be_encrypted">Veri tabanı şifrelenecektir.</string>
<string name="archive_created_on_ts">%1$s tarihinde oluşturuldu</string>
<string name="delete_archive">Belgeliği sil</string>
<string name="delete_chat_archive_question">Konuşma belgeliğini sil\?</string>
<string name="rcv_group_event_changed_member_role">%s üyesinin yetkisi %s olarak değiştirildi</string>
<string name="rcv_group_event_group_deleted">silinmiş grup</string>
<string name="snd_group_event_changed_role_for_yourself">kendi yetkini, %s olarak değiştirdin</string>
@@ -740,8 +736,6 @@
<string name="status_contact_has_no_e2e_encryption">kişi uçtan uca şifrelemeye sahip değildir</string>
<string name="chat_is_stopped">Sohbet durduruldu</string>
<string name="impossible_to_recover_passphrase"><![CDATA[<b>Aklınızda bulunsun</b>: kaybederseniz, parolayı kurtaramaz veya değiştiremezsiniz.]]></string>
<string name="chat_archive_header">Sohbet arşivi</string>
<string name="chat_archive_section">SOHBET ARŞİVİ</string>
<string name="group_invitation_item_description">%1$s grubuna davet</string>
<string name="join_group_question">Gruba katıl\?</string>
<string name="rcv_group_event_member_added">%1$s davet edildi</string>
@@ -857,7 +851,6 @@
<string name="your_ICE_servers">ICE sunucularınız</string>
<string name="how_to">Nasıl</string>
<string name="your_current_profile">Mevcut profiliniz</string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[Mesajların hangi sunucu(lar)dan <b>alınacağını</b> siz kontrol edersiniz, kişileriniz - onlara mesaj göndermek için kullandığınız sunucular.]]></string>
<string name="video_call_no_encryption">video arama (uçtan uca şifreli değil)</string>
<string name="your_ice_servers">ICE sunucularınız</string>
<string name="icon_descr_video_off">Video kapalı</string>
@@ -991,7 +984,6 @@
<string name="to_start_a_new_chat_help_header">Yeni bir sohbet başlatmak için</string>
<string name="people_can_connect_only_via_links_you_share">Kimin bağlanabileceğine siz karar verirsiniz.</string>
<string name="privacy_redefined">Gizlilik yeniden tanımlanıyor</string>
<string name="read_more_in_github">GitHub repomuzda daha fazlasını okuyun.</string>
<string name="onboarding_notifications_mode_periodic">Periyodik</string>
<string name="onboarding_notifications_mode_title">Gizli bildirimler</string>
<string name="paste_the_link_you_received">Aldığın bağlantıyı yapıştır</string>
@@ -1468,7 +1460,6 @@
<string name="alert_text_msg_bad_id">Bir sonraki mesajın kimliği yanlış (bir öncekinden az veya aynı).
\nBazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir.</string>
<string name="notification_preview_somebody">Kişi gizlendi:</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[Bir sürü kişi sordu: <i> eğer SimpleXin hiç kullanıcı tanımlayıcısı yok, nasıl mesajları gönderiyor? </i>]]></string>
<string name="alert_text_skipped_messages_it_can_happen_when">Şu durumlarda gerçekleşebilir:
\n1. Mesajların süresi, gönderen istemcide 2 gün sonra veya sunucuda 30 gün sonra sona erdi.
\n2. Siz veya kişiniz eski veritabanı yedeğini kullandığınız için mesajın şifresini çözme işlemi başarısız oldu.
@@ -294,8 +294,6 @@
<string name="encrypt_database_question">Зашифрувати базу даних\?</string>
<string name="wrong_passphrase_title">Неправильна ключова фраза!</string>
<string name="enter_correct_passphrase">Введіть правильну ключову фразу.</string>
<string name="chat_archive_header">Архів чату</string>
<string name="chat_archive_section">АРХІВ ЧАТУ</string>
<string name="rcv_group_event_member_connected">підключив(лась)</string>
<string name="rcv_group_event_changed_your_role">змінив(ла) вашу роль на %s</string>
<string name="snd_group_event_changed_role_for_yourself">ви змінили свою роль на %s</string>
@@ -375,7 +373,6 @@
<string name="call_on_lock_screen">Виклики на екрані блокування:</string>
<string name="call_connection_peer_to_peer">від абонента до абонента</string>
<string name="icon_descr_hang_up">Завершити дзвінок</string>
<string name="archive_created_on_ts">Створено %1$s</string>
<string name="icon_descr_expand_role">Розгорнути вибір ролі</string>
<string name="chat_preferences_yes">так</string>
<string name="contact_preferences">Налаштування контакту</string>
@@ -413,7 +410,6 @@
<string name="privacy_redefined">Приватність перевизначена</string>
<string name="people_can_connect_only_via_links_you_share">Ви вирішуєте, хто може під\'єднатися.</string>
<string name="how_simplex_works">Як працює SimpleX</string>
<string name="read_more_in_github">Докладніше читайте в нашому репозиторії на GitHub.</string>
<string name="encrypted_audio_call">зашифрований e2e аудіовиклик</string>
<string name="open_simplex_chat_to_accept_call">Відкрийте SimpleX Chat для прийняття виклику</string>
<string name="status_e2e_encrypted">e2e зашифровано</string>
@@ -528,7 +524,6 @@
<string name="icon_descr_video_on">Відео увімкнено</string>
<string name="alert_text_fragment_encryption_out_of_sync_old_database">Це може трапитися, якщо ви або ваше з\'єднання використовували застарілу резервну копію бази даних.</string>
<string name="restore_database">Відновити резервну копію бази даних</string>
<string name="save_archive">Зберегти архів</string>
<string name="group_invitation_item_description">запрошення до групи %1$s</string>
<string name="you_are_invited_to_group_join_to_connect_with_group_members">Вас запрошено в групу. Приєднуйтесь, щоб спілкуватися з учасниками групи.</string>
<string name="message_reactions">Реакції на повідомлення</string>
@@ -655,8 +650,6 @@
<string name="you_can_use_markdown_to_format_messages__prompt">Ви можете використовувати markdown для форматування повідомлень:</string>
<string name="create_your_profile">Створіть свій профіль</string>
<string name="make_private_connection">Створіть приватне підключення</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[Багато людей питають: <i>як в SimpleX можливо доставляти повідомлення, якщо він не має ідентифікаторів користувачів?</i>]]></string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[Ви контролюєте, через які сервери <b>отримувати</b> повідомлення, ваші контакти – сервери, які ви використовуєте для надсилання повідомлень їм.]]></string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages"><![CDATA[Тільки пристрої клієнта зберігають профілі користувачів, контакти, групи та повідомлення, відправлені за допомогою <b>шифрування на двох рівнях</b>.]]></string>
<string name="onboarding_notifications_mode_title">Приватні сповіщення</string>
<string name="onboarding_notifications_mode_service_desc"><![CDATA[<b>Споживає більше акумулятора</b>! Додаток завжди працює у фоновому режимі – сповіщення відображаються миттєво.]]></string>
@@ -1070,8 +1063,6 @@
<string name="database_passphrase_is_required">Для відкриття чату потрібна ключова фраза бази даних.</string>
<string name="join_group_question">Приєднатися до групи\?</string>
<string name="database_upgrade">Оновлення бази даних</string>
<string name="delete_archive">Видалити архів</string>
<string name="delete_chat_archive_question">Видалити архів чату\?</string>
<string name="leave_group_question">Вийти з групи?</string>
<string name="alert_title_no_group">Групу не знайдено!</string>
<string name="alert_message_no_group">Ця група більше не існує.</string>
@@ -2115,4 +2106,14 @@
<string name="call_desktop_permission_denied_chrome">Натисніть кнопку інформації поруч із полем адреси, щоб дозволити використання мікрофона.</string>
<string name="call_desktop_permission_denied_safari">Відкрийте Налаштування Safari / Сайти / Мікрофон, а потім виберіть \"Дозволити для localhost\".</string>
<string name="call_desktop_permission_denied_title">Щоб здійснювати дзвінки, дозволіть використовувати ваш мікрофон. Завершіть дзвінок і спробуйте зателефонувати знову.</string>
<string name="v6_1_better_calls">Кращі дзвінки</string>
<string name="v6_1_better_security">Краща безпека ✅</string>
<string name="v6_1_customizable_message_descr">Налаштовувана форма повідомлень.</string>
<string name="v6_1_better_security_descr">Протоколи SimpleX перевірені компанією Trail of Bits.</string>
<string name="v6_1_better_calls_descr">Переключити аудіо та відео під час дзвінка.</string>
<string name="v6_1_message_dates_descr">Кращі дати повідомлень.</string>
<string name="v6_1_better_user_experience">Кращий користувацький досвід</string>
<string name="v6_1_delete_many_messages_descr">Видалити або модерувати до 200 повідомлень.</string>
<string name="v6_1_forward_many_messages_descr">Переслати до 20 повідомлень одночасно.</string>
<string name="v6_1_switch_chat_profile_descr">Переключити профіль чату для одноразових запрошень.</string>
</resources>
@@ -226,8 +226,6 @@
<string name="change_role">Thay đổi quyền hạn</string>
<string name="snd_conn_event_switch_queue_phase_changing">đang thay đổi địa chỉ…</string>
<string name="rcv_conn_event_switch_queue_phase_changing">đang thay đổi địa chỉ…</string>
<string name="chat_archive_section">KHO LƯU TRỮ SIMPLEX CHAT</string>
<string name="chat_archive_header">Kho lưu trữ SimpleX Chat</string>
<string name="chat_console">Bảng điều khiển trò chuyện</string>
<string name="chat_is_running">Ứng dụng SimpleX Chat đang hoạt động</string>
<string name="chat_database_deleted">Cơ sở dữ liệu SimpleX Chat đã bị xóa</string>
@@ -361,7 +359,6 @@
<string name="button_create_group_link">Tạo liên kết</string>
<string name="info_row_created_at">Được tạo ra tại</string>
<string name="create_address">Tạo địa chỉ</string>
<string name="archive_created_on_ts">Được tạo ra vào %1$s</string>
<string name="share_text_created_at">Được tạo ra tại: %s</string>
<string name="create_chat_profile">Tạo hồ sơ trò chuyện</string>
<string name="create_group_button">Tạo nhóm</string>
@@ -437,9 +434,7 @@
<string name="delete_database">Xóa cơ sở dữ liệu</string>
<string name="delete_files_and_media_all">Xóa tất cả các tệp</string>
<string name="delete_files_and_media_question">Xóa tệp và đa phương tiện?</string>
<string name="delete_archive">Xóa kho lữu trữ</string>
<string name="chat_preferences_default">mặc định (%s)</string>
<string name="delete_chat_archive_question">Xóa kho lữu trữ SimpleX Chat?</string>
<string name="rcv_group_event_group_deleted">đã xóa nhóm</string>
<string name="smp_server_test_delete_file">Xóa tệp</string>
<string name="delete_contact_question">Xóa liên hệ?</string>
@@ -904,4 +899,456 @@
<string name="v6_1_forward_many_messages_descr">Chuyển tiếp tối đa 20 tin nhắn cùng một lúc.</string>
<string name="how_to_use_your_servers">Cách sử dụng máy chủ của bạn</string>
<string name="v5_5_new_interface_languages">Giao diện Hungary và Thổ Nhĩ Kỳ</string>
<string name="immune_to_spam_and_abuse">Miễn nhiễm với tin nhắn rác</string>
<string name="import_database_question">Nhập cơ sở dữ liệu trò chuyện?</string>
<string name="if_you_enter_self_destruct_code">Nếu bạn nhập mã tự hủy của mình khi mở ứng dụng:</string>
<string name="enter_one_ICE_server_per_line">Máy chủ ICE (một dòng mỗi máy)</string>
<string name="if_you_enter_passcode_data_removed">Nếu bạn nhập mã truy cập này khi mở ứng dụng, tất cả dữ liệu ứng dụng sẽ bị xóa vĩnh viễn!</string>
<string name="image_will_be_received_when_contact_is_online">Hình ảnh sẽ được nhận khi liên hệ của bạn trực tuyến, xin vui lòng chờ hoặc kiểm tra lại sau!</string>
<string name="la_immediately">Ngay lập tức</string>
<string name="image_will_be_received_when_contact_completes_uploading">Hình ảnh sẽ được nhận khi liên hệ của bạn hoàn thành việc tải lên.</string>
<string name="gallery_image_button">Hình ảnh</string>
<string name="if_you_cant_meet_in_person">Nếu bạn không thể gặp mặt trực tiếp, cho liên hệ của bạn xem mã QR trong một cuộc gọi video, hoặc chia sẻ liên kết.</string>
<string name="icon_descr_image_snd_complete">Hình ảnh đã được gửi</string>
<string name="image_descr">Hình ảnh</string>
<string name="image_saved">Hình ảnh đã được lưu vào Thư viện</string>
<string name="if_you_received_simplex_invitation_link_you_can_open_in_browser">Nếu bạn nhận được liên kết mời SimpleX Chat, bạn có thể mở nó trong trình duyệt của mình:</string>
<string name="if_you_cannot_meet_in_person_scan_QR_in_video_call_or_ask_for_invitation_link"><![CDATA[Nếu bạn không thể gặp mặt trực tiếp, bạn có thể <b>quét mã QR trong cuộc gọi video</b>, hoặc liên hệ của bạn có thể chia sẻ một liên kết mời.]]></string>
<string name="network_disable_socks_info">Nếu bạn xác nhận, các máy chủ truyền tin nhắn sẽ có thể biết địa chỉ IP, và nhà cung cấp của bạn - máy chủ nào mà bạn đang kết nối.</string>
<string name="if_you_choose_to_reject_the_sender_will_not_be_notified">Nếu bạn chọn từ chối người gửi sẽ KHÔNG được thông báo.</string>
<string name="if_you_cannot_meet_in_person_show_QR_in_video_call_or_via_another_channel"><![CDATA[Nếu bạn không thể gặp mặt trực tiếp, <b>cho liên hệ của bạn xem mã QR trong cuộc gọi video</b>, hoặc chia sẻ liên kết.]]></string>
<string name="import_database_confirmation">Nhập</string>
<string name="ignore">Bỏ qua</string>
<string name="member_info_member_inactive">không hoạt động</string>
<string name="migrate_to_device_import_failed">Nhập dữ liệu không thành công</string>
<string name="v5_5_message_delivery">Đã cải thiện việc chuyển gửi tin nhắn</string>
<string name="import_theme_error">Lỗi nhập chủ đề</string>
<string name="settings_section_title_incognito">Chế độ ẩn danh</string>
<string name="incognito">Ẩn danh</string>
<string name="migrate_to_device_importing_archive">Đang nhập dữ liệu từ kho lưu trữ</string>
<string name="import_theme">Nhập chủ đề</string>
<string name="v4_3_improved_server_configuration">Đã cải thiện cấu hình máy chủ</string>
<string name="v5_4_incognito_groups">Nhóm ẩn danh</string>
<string name="incognito_info_protects">Chế độ ẩn danh bảo vệ sự riêng tư của bạn bằng cách sử dụng một hồ sơ ngẫu nhiên mới với mỗi liên hệ.</string>
<string name="v5_8_message_delivery">Đã cải thiện việc chuyển gửi tin nhắn</string>
<string name="import_database">Nhập cơ sở dữ liệu</string>
<string name="v5_7_call_sounds">Âm thanh trong cuộc gọi</string>
<string name="v4_3_improved_privacy_and_security">Nâng cao bảo mật và sự riêng tư</string>
<string name="description_via_one_time_link_incognito">ẩn danh qua liên kết dùng một lần</string>
<string name="info_menu">Thông tin</string>
<string name="conn_level_desc_indirect">gián tiếp (%1$s)</string>
<string name="migrate_from_device_chat_should_be_stopped">Để tiếp tục, hãy ngắt kết nối tới các máy chủ dùng để truyền dẫn tin nhắn.</string>
<string name="install_simplex_chat_for_terminal">Cài đặt SimpleX Chat cho cửa sổ câu lệnh</string>
<string name="description_via_contact_address_link_incognito">ẩn danh qua liên kết địa chỉ liên lạc</string>
<string name="incoming_audio_call">Cuộc gọi thoại đến</string>
<string name="initial_member_role">Quyền hạn ban đầu</string>
<string name="description_via_group_link_incognito">ẩn danh qua liên kết nhóm</string>
<string name="incorrect_code">Mã bảo mật không đúng!</string>
<string name="in_reply_to">Trả lời đến</string>
<string name="incompatible_database_version">Phiên bản cơ sở dữ liệu không tương thích</string>
<string name="onboarding_notifications_mode_service">Ngay lập tức</string>
<string name="incorrect_passcode">Mã truy cập không đúng</string>
<string name="v6_0_increase_font_size">Tăng cỡ chữ.</string>
<string name="new_desktop"><![CDATA[<i>(mới)</i>]]></string>
<string name="app_check_for_updates_installed_successfully_title">Đã cài đặt thành công</string>
<string name="app_check_for_updates_button_install">Cài đặt cập nhật</string>
<string name="incoming_video_call">Cuộc gọi video đến</string>
<string name="desktop_incompatible_version">Phiên bản không tương thích</string>
<string name="theme_colors_section_title">MÀU SẮC GIAO DIỆN</string>
<string name="group_member_status_invited">đã được mời</string>
<string name="error_parsing_uri_title">Liên kết không hợp lệ</string>
<string name="invalid_chat">tác vụ trò chuyện không hợp lệ</string>
<string name="invalid_data">dữ liệu không hợp lệ</string>
<string name="invalid_message_format">định dạng tin nhắn không hợp lệ</string>
<string name="action_button_add_members">Mời</string>
<string name="alert_title_group_invitation_expired">Lời mời đã hết hạn!</string>
<string name="invalid_contact_link">Liên kết không hợp lệ!</string>
<string name="invalid_file_link">Liên kết không hợp lệ</string>
<string name="failed_to_create_user_invalid_title">Tên hiển thị không hợp lệ!</string>
<string name="invalid_connection_link">Liên kết kết nối không hợp lệ</string>
<string name="service_notifications">Thông báo tức thời!</string>
<string name="invalid_QR_code">Mã QR không hợp lệ</string>
<string name="icon_descr_instant_notifications">Thông báo tức thời</string>
<string name="service_notifications_disabled">Thông báo tức thời đã bị tắt!</string>
<string name="non_content_uri_alert_title">Đường dẫn tệp không hợp lệ</string>
<string name="agent_internal_error_title">Lỗi nội bộ</string>
<string name="invalid_qr_code">Mã QR không hợp lệ</string>
<string name="smp_servers_invalid_address">Địa chỉ máy chủ không hợp lệ!</string>
<string name="invalid_migration_confirmation">Xác nhận di dời không hợp lệ</string>
<string name="invalid_name">Tên không hợp lệ!</string>
<string name="invite_friends_short">Mời</string>
<string name="group_invitation_item_description">lời mời tham gia nhóm %1$s</string>
<string name="icon_descr_add_members">Mời thành viên</string>
<string name="info_row_local_name">Tên cục bộ</string>
<string name="message_delivery_warning_title">Cảnh báo chuyển gửi tin nhắn</string>
<string name="ensure_smp_server_address_are_correct_format_and_unique">Đảm bảo địa chỉ máy chủ SMP ở đúng định dạng, dòng được phân tách và không bị trùng lặp.</string>
<string name="ensure_xftp_server_address_are_correct_format_and_unique">Đảm bảo địa chỉ máy chủ XFTP ở đúng định dạng, dòng được phân tách và không bị trùng lặp.</string>
<string name="link_a_mobile">Liên kết với điện thoại</string>
<string name="member_inactive_title">Thành viên không hoạt động</string>
<string name="message_forwarded_title">Tin nhắn đã được chuyển tiếp</string>
<string name="member_inactive_desc">Tin nhắn có thể được gửi sau nếu thành viên hoạt động</string>
<string name="network_proxy_incorrect_config_desc">Đảm bảo cấu hình proxy là chính xác.</string>
<string name="joining_group">Đang tham gia nhóm</string>
<string name="theme_light">Sáng</string>
<string name="color_mode_light">Sáng</string>
<string name="linked_mobiles">Các thiết bị di động đã được liên kết</string>
<string name="connect_plan_join_your_group">Tham gia nhóm của bạn?</string>
<string name="v5_1_japanese_portuguese_interface">UI Nhật Bản và Bồ Đào Nha</string>
<string name="marked_deleted_description">được đánh dấu là đã xóa</string>
<string name="live">TRỰC TIẾP</string>
<string name="join_group_button">Tham gia</string>
<string name="join_group_incognito_button">Tham gia ẩn danh</string>
<string name="privacy_message_draft">Bản nháp tin nhắn</string>
<string name="leave_group_question">Rời nhóm?</string>
<string name="button_add_members">Mời thành viên</string>
<string name="invite_to_group_button">Mời vào nhóm</string>
<string name="button_leave_group">Rời nhóm</string>
<string name="member_info_section_title_member">THÀNH VIÊN</string>
<string name="message_queue_info">Thông tin hàng đợi tin nhắn</string>
<string name="users_delete_data_only">Chỉ dữ liệu hồ sơ cục bộ</string>
<string name="v5_2_fix_encryption">Giữ lại các kết nối của bạn</string>
<string name="v5_2_disappear_one_message">Làm cho một tin nhắn biến mất</string>
<string name="live_message">Tin nhắn động!</string>
<string name="keep_unused_invitation_question">Giữ lại lời mời chưa sử dụng?</string>
<string name="update_network_smp_proxy_fallback_question">Dự phòng định tuyến tin nhắn</string>
<string name="invite_friends">Mời bạn bè</string>
<string name="mark_code_verified">Đánh dấu đã xác thực</string>
<string name="alert_text_skipped_messages_it_can_happen_when">Điều này có thể xảy ra khi:\n1. Tin nhắn hết hạn sau 2 ngày trên máy gửi hoặc sau 30 ngày trên máy chủ.\n2. Quá trình giải mã tin nhắn thất bại do bạn hoặc liên hệ của bạn sử dụng bản sao lưu cơ sở dữ liệu cũ.\n3. Kết nối bị xâm phạm.</string>
<string name="join_group_question">Tham gia nhóm?</string>
<string name="v5_4_link_mobile_desktop">Liên kết ứng dụng trên điện thoại và máy tính! 🔗</string>
<string name="profile_update_event_member_name_changed">thành viên %1$s đã đổi thành %2$s</string>
<string name="make_private_connection">Tạo kết nối riêng tư</string>
<string name="make_profile_private">Tạo hồ sơ riêng tư!</string>
<string name="ensure_ICE_server_address_are_correct_format_and_unique">Đảm bảo địa chỉ máy chủ WebRTC ICE ở đúng định dạng, dòng được phân tách và không bị trùng lặp.</string>
<string name="alert_text_fragment_encryption_out_of_sync_old_database">Nó có thể xảy ra khi bạn hoặc liên hệ của bạn sử dụng bản sao lưu cơ sở dữ liệu cũ.</string>
<string name="lock_mode">Chế độ khóa</string>
<string name="v4_5_italian_interface">Giao diện tiếng Ý</string>
<string name="this_device_version"><![CDATA[<i>thiết bị này v%s)</i>]]></string>
<string name="message_reactions_are_prohibited">Biểu đạt cảm xúc tin nhắn bị cấm trong nhóm này.</string>
<string name="display_name_invited_to_connect">đã được mời để kết nối</string>
<string name="learn_more">Tìm hiểu thêm</string>
<string name="keep_invitation_link">Giữ</string>
<string name="leave_group_button">Rời</string>
<string name="auth_log_in_using_credential">Đăng nhập bằng thông tin xác thực của bạn</string>
<string name="message_delivery_error_title">Lỗi chuyển gửi tin nhắn</string>
<string name="group_preview_join_as">tham gia với tư cách %s</string>
<string name="markdown_help">Trợ giúp markdown</string>
<string name="markdown_in_messages">Sử dụng markdown trong tin nhắn</string>
<string name="connect_via_group_link">Tham gia nhóm?</string>
<string name="thousand_abbreviation">k</string>
<string name="loading_remote_file_title">Đang tải tệp</string>
<string name="linked_desktops">Các máy tính đã được liên kết</string>
<string name="loading_chats">Đang tải các cuộc trò chuyện…</string>
<string name="info_view_message_button">tin nhắn</string>
<string name="mark_unread">Đánh dấu chưa đọc</string>
<string name="v4_3_voice_messages_desc">Tối đa 40 giây, được nhận ngay lập tức.</string>
<string name="v5_2_message_delivery_receipts">Chỉ báo đã nhận tin nhắn!</string>
<string name="large_file">Tệp lớn!</string>
<string name="mark_read">Đánh dấu đã đọc</string>
<string name="privacy_media_blur_radius_medium">Trung bình</string>
<string name="v4_4_live_messages">Tin nhắn động</string>
<string name="keep_conversation">Giữ lại cuộc trò chuyện</string>
<string name="image_descr_link_preview">Hình ảnh xem trước của liên kết</string>
<string name="member_will_be_removed_from_group_cannot_be_undone">Thành viên sẽ bị xóa khỏi nhóm - việc này không thể được hoàn tác!</string>
<string name="chat_theme_apply_to_light_mode">Chế độ sáng</string>
<string name="v5_7_new_interface_languages">UI tiếng Litva</string>
<string name="settings_section_title_messages">TIN NHẮN VÀ TỆP</string>
<string name="message_deletion_prohibited_in_chat">Việc xóa tin nhắn mà không thể phục hồi bị cấm trong nhóm này.</string>
<string name="v5_5_join_group_conversation">Tham gia vào các cuộc trò chuyện nhóm</string>
<string name="update_network_smp_proxy_mode_question">Chế độ định tuyến tin nhắn</string>
<string name="email_invite_subject">Hãy trò chuyện trên SimpleX Chat</string>
<string name="italic_text">in nghiêng</string>
<string name="onboarding_notifications_mode_subtitle">Nó có thể được thay đổi sau trong phần cài đặt.</string>
<string name="message_deletion_prohibited">Việc xóa tin nhắn mà không thể phục hồi bị cấm trong cuộc trò chuyện này.</string>
<string name="message_reactions_prohibited_in_this_chat">Biểu đạt cảm xúc tin nhắn bị cấm trong cuộc trò chuyện này.</string>
<string name="v4_5_message_draft">Bản nháp tin nhắn</string>
<string name="v6_0_private_routing_descr">Nó bảo vệ địa chỉ IP và các kết nối của bạn.</string>
<string name="lock_after">Khóa sau</string>
<string name="messages_section_title">Tin nhắn</string>
<string name="keychain_error">Lỗi keychain</string>
<string name="rcv_group_event_member_left">đã rời</string>
<string name="rcv_group_event_invited_via_your_group_link">đã được mời thông qua liên kết nhóm của bạn</string>
<string name="group_member_role_member">thành viên</string>
<string name="group_member_status_left">đã rời</string>
<string name="incognito_info_allows">Nó cho phép việc có các kết nối ẩn danh mà không có bất kỳ dữ liệu chung nào giữa chúng trong một hồ sơ trò chuyện</string>
<string name="import_theme_error_desc">Đảm bảo tệp có cú pháp YAML chính xác. Xuất chủ đề để có một ví dụ về cấu trúc tệp chủ đề.</string>
<string name="color_surface">Menu và cảnh báo</string>
<string name="message_reactions">Cảm xúc tin nhắn</string>
<string name="v5_1_message_reactions">Cảm xúc tin nhắn</string>
<string name="v5_8_chat_themes_descr">Làm cho các cuộc trò chuyện của bạn trở nên khác biệt!</string>
<string name="servers_info_subscriptions_section_header">Tiếp nhận tin nhắn</string>
<string name="linked_desktop_options">Cài đặt máy tính đã được liên kết</string>
<string name="rcv_group_event_member_added">đã được mời %1$s</string>
<string name="v4_3_irreversible_message_deletion">Xóa tin nhắn mà không thể phục hồi</string>
<string name="compose_message_placeholder">Tin nhắn</string>
<string name="message_servers">Máy chủ tin nhắn</string>
<string name="media_and_file_servers">Máy chủ tệp và phương tiện</string>
<string name="notification_preview_mode_message">Nội dung tin nhắn</string>
<string name="forward_files_messages_deleted_after_selection_desc">Tin nhắn đã bị xóa sau khi bạn chọn chúng.</string>
<string name="unblock_member_desc">Tin nhắn từ %s sẽ được hiển thị!</string>
<string name="info_row_message_status">Trạng thái tin nhắn</string>
<string name="servers_info_messages_received">Tin nhắn đã được nhận</string>
<string name="servers_info_messages_sent">Tin nhắn đã được gửi</string>
<string name="share_text_message_status">Trạng thái tin nhắn: %s</string>
<string name="message_too_large">Tin nhắn quá lớn</string>
<string name="e2ee_info_no_pq"><![CDATA[Tin nhắn, tệp, và cuộc gọi được bảo vệ bởi <b>mã hóa đầu cuối</b>với bí mật chuyển tiếp hoàn hảo, sự cự tuyệt và khôi phục xâm nhập.]]></string>
<string name="delete_message_cannot_be_undone_warning">Tin nhắn sẽ bị xóa - việc này không thể được hoàn tác!</string>
<string name="migrate_from_another_device">Di chuyển từ một thiết bị khác</string>
<string name="delete_messages_cannot_be_undone_warning">Tin nhắn sẽ bị xóa - việc này không thể được hoàn tác!</string>
<string name="delete_message_mark_deleted_warning">Tin nhắn sẽ được đánh dấu để xóa. Người nhận sẽ có thể xem lại những tin nhắn này.</string>
<string name="e2ee_info_pq"><![CDATA[Tin nhắn, tệp và cuộc gọi được bảo vệ bởi <b> mã hóa đầu cuối kháng lượng tử</b> với bí mật chuyển tiếp hoàn hảo, sự cự tuyệt và khôi phục xâm nhập.]]></string>
<string name="permissions_record_audio">Mic</string>
<string name="settings_section_title_message_shape">Hình dạng tin nhắn</string>
<string name="v5_7_forward_descr">Nguồn tin nhắn vẫn còn riêng tư.</string>
<string name="migrate_from_device_title">Di chuyển thiết bị</string>
<string name="delete_messages_mark_deleted_warning">Tin nhắn sẽ được đánh dấu để xóa. Người nhận sẽ có thể xem lại những tin nhắn này.</string>
<string name="migrate_to_device_title">Di chuyển tới đây</string>
<string name="custom_time_unit_months">tháng</string>
<string name="v4_5_multiple_chat_profiles">Nhiều hồ sơ trò chuyện</string>
<string name="new_mobile_device">Thiết bị di động mới</string>
<string name="network_smp_proxy_mode_never">Không bao giờ</string>
<string name="v6_0_new_chat_experience">Trải nghiệm trò chuyện mới 🎉</string>
<string name="v5_3_new_desktop_app">Ứng dụng máy tính mới!</string>
<string name="network_and_servers">Mạng &amp; máy chủ</string>
<string name="callstatus_missed">cuộc gọi nhỡ</string>
<string name="new_passcode">Mã truy cập mới</string>
<string name="self_destruct_new_display_name">Tên hiển thị mới:</string>
<string name="settings_section_title_network_connection">Kết nối mạng</string>
<string name="network_status">Trạng thái mạng</string>
<string name="v5_8_chat_themes">Chủ đề trò chuyện mới</string>
<string name="moderated_item_description">đã được kiểm duyệt bởi %s</string>
<string name="moderated_description">đã được kiểm duyệt</string>
<string name="info_row_moderated_at">Đã được kiểm duyệt vào</string>
<string name="share_text_moderated_at">Đã được kiểm duyệt vào: %s</string>
<string name="remote_host_was_disconnected_toast"><![CDATA[Thiết bị di động <b>%s</b> đã bị ngắt kết nối]]></string>
<string name="mobile_tap_open_in_mobile_app_then_tap_connect_in_app"><![CDATA[📱 di động: nhấn <b>Mở trong ứng dụng di động</b>, sau đó nhấn <b>Kết nối</b> trong ứng dung.]]></string>
<string name="new_message">Tin nhắn mới</string>
<string name="muted_when_inactive">Đã tắt thông báo khi không hoạt động!</string>
<string name="new_in_version">Mới trong %s</string>
<string name="v5_2_more_things_descr">- chuyển gửi tin nhắn ổn định hơn.\n- các nhóm đã được cải thiện hơn một chút.\n- và hơn thế nữa!</string>
<string name="v5_7_network_descr">Kết nối mạng ổn định hơn.</string>
<string name="v5_7_network">Quản lý mạng</string>
<string name="remote_host_error_missing"><![CDATA[Thiết bị di dộng <b>%s</b> bị thiếu]]></string>
<string name="remote_host_error_busy"><![CDATA[Thiết bị di động <b>%s</b> đang bận]]></string>
<string name="migrate_from_device_to_another_device">Di chuyển sang một thiết bị khác</string>
<string name="migrate_to_device_migrating">Đang di chuyển</string>
<string name="icon_descr_more_button">Hơn nữa</string>
<string name="notification_preview_new_message">tin nhắn mới</string>
<string name="message_delivery_error_desc">Khả năng cao liên hệ này đã xóa kết nối với bạn.</string>
<string name="snd_error_expired">Sự cố mạng - tin nhắn đã hết hạn sau nhiều lần cố gắng gửi đi.</string>
<string name="database_migrations">Di chuyển: %s</string>
<string name="user_mute">Tắt thông báo</string>
<string name="notification_new_contact_request">Yêu cầu liên lạc mới</string>
<string name="moderate_verb">Kiểm duyệt</string>
<string name="chat_item_ttl_none">không bao giờ</string>
<string name="mute_chat">Tắt thông báo</string>
<string name="new_chat">Cuộc trò chuyện mới</string>
<string name="custom_time_unit_minutes">phút</string>
<string name="new_database_archive">Kho lưu trữ cơ sở dữ liệu mới</string>
<string name="new_member_role">Quyền hạn thành viên mới</string>
<string name="v4_6_reduced_battery_usage_descr">Nhiều cải tiến hơn nữa sắp ra mắt!</string>
<string name="remote_host_error_bad_version"><![CDATA[Thiết bị di động <b>%s</b> có một phiên bản không được hỗ trợ. Xin vui lòng đảm bảo rằng bạn dùng cùng một phiên bản trên cả hai thiết bị.]]></string>
<string name="v6_0_new_media_options">Các tùy chọn phương tiện mới</string>
<string name="icon_descr_call_missed">Cuộc gọi nhỡ</string>
<string name="v4_5_reduced_battery_usage_descr">Nhiều cải tiến hơn nữa sắp ra mắt!</string>
<string name="v5_6_app_data_migration_descr">Di chuyển sang một thiết bị khác qua mã QR.</string>
<string name="migrate_from_device_migration_complete">Quá trình di chuyển hoàn tất</string>
<string name="remote_host_error_inactive"><![CDATA[Thiết bị di động <b>%s</b> đang không hoạt động]]></string>
<string name="remote_host_error_disconnected"><![CDATA[Thiết bị di động <b>%s</b> đã bị ngắt kết nối]]></string>
<string name="no_info_on_delivery">Không có thông tin chuyển gửi</string>
<string name="message_forwarded_desc">Chưa có kết nối trực tiếp, tin nhắn được chuyển tiếp bởi quản trị viên.</string>
<string name="no_contacts_to_add">Không có liên hệ để thêm</string>
<string name="no_connected_mobile">Không có thiết bị di động nào được kết nối</string>
<string name="chat_preferences_no">không</string>
<string name="no_details">không có thông tin</string>
<string name="new_passphrase">Mật khẩu mới…</string>
<string name="network_session_mode_session_description">Thông tin xác thực SOCKS mới sẽ được sử dụng mỗi khi bạn khởi động ứng dụng.</string>
<string name="network_smp_proxy_fallback_prohibit">Không</string>
<string name="no_contacts_selected">Không có liên hệ nào được chọn</string>
<string name="system_restricted_background_in_call_title">Không có cuộc gọi nền</string>
<string name="la_no_app_password">Không có mã truy cập ứng dụng</string>
<string name="no_filtered_chats">Không có cuộc trò chuyện nào được lọc</string>
<string name="no_history">Không có lịch sử</string>
<string name="no_filtered_contacts">Không có liên hệ nào được lọc</string>
<string name="message_queue_info_none">không</string>
<string name="network_use_onion_hosts_no">Không</string>
<string name="network_session_mode_server_description">Thông tin xác thực SOCKS mới sẽ được sử dụng cho mỗi máy chủ.</string>
<string name="status_no_e2e_encryption">không có mã hóa đầu cuối</string>
<string name="servers_info_missing">Không có thông tin, hãy thử tải lại</string>
<string name="chat_preferences_on">bật</string>
<string name="forward_alert_title_nothing_to_forward">Không có gì để chuyển tiếp!</string>
<string name="shutdown_alert_desc">Thông báo sẽ dừng hoạt động cho đến khi bạn khởi động lại ứng dụng</string>
<string name="first_platform_without_user_ids">Không có thông tin định danh người dùng.</string>
<string name="item_info_no_text">không có nội dung</string>
<string name="feature_off">tắt</string>
<string name="chat_preferences_off">tắt</string>`
<string name="only_you_can_make_calls">Chỉ bạn mới có thể thực hiện cuộc gọi.</string>
<string name="only_your_contact_can_add_message_reactions">Chỉ liên hệ của bạn mới có thể thả cảm xúc tin nhắn.</string>
<string name="videos_limit_desc">Chỉ có thể gửi 10 video cùng một lúc</string>
<string name="add_contact">Liên kết lời mời dùng một lần</string>
<string name="only_stored_on_members_devices">(chỉ được lưu trữ bởi thành viên nhóm)</string>
<string name="settings_notification_preview_title">Xem trước thông báo</string>
<string name="settings_notifications_mode_title">Dịch vụ thông báo</string>
<string name="privacy_media_blur_radius_off">Tắt</string>
<string name="no_received_app_files">Không có tệp nào được gửi hay được nhận</string>
<string name="group_member_role_observer">quan sát viên</string>
<string name="network_type_no_network_connection">Không có kết nối mạng</string>
<string name="only_owners_can_enable_files_and_media">Chỉ chủ nhóm mới có thể bật tính năng cho phép gửi tệp và phương tiện.</string>
<string name="images_limit_desc">Chỉ có thể gửi 10 hình ảnh cùng một lúc</string>
<string name="only_one_device_can_work_at_the_same_time">Chỉ một thiết bị mới có thể hoạt động cùng một lúc</string>
<string name="not_compatible">Không tương thích!</string>
<string name="notifications">Thông báo</string>
<string name="ok">OK</string>
<string name="only_delete_conversation">Chỉ xóa cuộc trò chuyện</string>
<string name="only_you_can_send_voice">Chỉ bạn mới có thể gửi tin nhắn thoại.</string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages"><![CDATA[Chỉ thiết bị cuối mới lưu trữ hồ sơ người dùng, liên hệ, nhóm, và các tin nhắn được gửi với <b>bảo mật đầu cuối 2 lớp</b>.]]></string>
<string name="only_group_owners_can_enable_voice">Chỉ chủ nhóm mới có thể bật tính năng tin nhắn thoại.</string>
<string name="only_you_can_send_disappearing">Chỉ bạn mới có thể gửi tin nhắn tự xóa.</string>
<string name="one_time_link">Liên kết lời mời dùng một lần</string>
<string name="only_you_can_add_message_reactions">Chỉ có bạn mới có thể thả cảm xúc tin nhắn.</string>
<string name="notifications_will_be_hidden">Thông báo sẽ chỉ được gửi cho đến khi ứng dụng dừng!</string>
<string name="only_you_can_delete_messages">Chỉ bạn mới có thể xóa tin nhắn mà không thể phục hồi (liên hệ của bạn có thể đánh dấu chúng để xóa). (24 giờ)</string>
<string name="old_database_archive">Bản lưu trữ cơ sở dữ liệu cũ</string>
<string name="feature_offered_item">được đề nghị %s</string>
<string name="feature_offered_item_with_param">được đề nghị %s: %2s</string>
<string name="la_mode_off">Tắt</string>
<string name="only_group_owners_can_change_prefs">Chỉ chủ nhóm mới có thể điều chỉnh các tùy chọn nhóm.</string>
<string name="v4_6_group_moderation_descr">Giờ thì quản trị viên có thể:\n- xóa tin nhắn của thành viên\n- vô hiệu hóa thành viên (quyền hạn quan sát viên)</string>
<string name="no_selected_chat">Không có cuộc trò chuyện nào được chọn</string>
<string name="selected_chat_items_nothing_selected">Không có gì được chọn</string>
<string name="open_verb">Mở</string>
<string name="auth_open_chat_console">Mở bảng điều khiển trò chuyện</string>
<string name="auth_open_chat_profiles">Mở hồ sơ trò chuyện</string>
<string name="network_use_onion_hosts_required_desc">Dịch vụ onion sẽ được yêu cầu để kết nối.\nXin lưu ý: bạn sẽ không thể kết nối tới các máy chủ mà không có địa chỉ .onion.</string>
<string name="rcv_group_event_open_chat">Mở</string>
<string name="open_database_folder">Mở thư mục cơ sở dữ liệu</string>
<string name="only_your_contact_can_send_disappearing">Chỉ liên hệ của bạn mới có thể gửi tin nhắn tự xóa.</string>
<string name="network_type_other">Khác</string>
<string name="or_scan_qr_code">Hoặc quét mã QR</string>
<string name="network_use_onion_hosts_prefer_desc">Dịch vụ onion sẽ được sử dụng khi có sẵn.</string>
<string name="only_your_contact_can_send_voice">Chỉ liên hệ của bạn mới có thể gửi tin nhắn thoại.</string>
<string name="group_member_role_owner">chủ sở hữu</string>
<string name="open_server_settings_button">Mở cài đặt máy chủ</string>
<string name="simplex_link_mode_browser_warning">Mở liên kết trong trình duyệt có thể làm giảm sự riêng tư và bảo mật của kết nối. Liên kết SimpleX không đáng tin cậy sẽ được đánh dấu màu đỏ.</string>
<string name="only_your_contact_can_delete">Chỉ liên hệ của bạn mới có thể xóa tin nhắn mà không thể phục hồi (bạn có thể đánh dấu chúng để xóa). (24 giờ)</string>
<string name="turn_off_system_restriction_button">Mở cài đặt ứng dụng</string>
<string name="la_lock_mode_passcode">Mục mã truy cập</string>
<string name="auth_open_migration_to_another_device">Mở màn hình di chuyển</string>
<string name="network_use_onion_hosts_no_desc">Dịch vụ onion sẽ không được sử dụng.</string>
<string name="opening_database">Đang mở cơ sở dữ liệu…</string>
<string name="or_show_this_qr_code">Hoặc hiển thị mã này</string>
<string name="only_your_contact_can_make_calls">Chỉ liên hệ của bạn mới có thể thực hiện cuộc gọi.</string>
<string name="info_view_open_button">mở</string>
<string name="v5_4_more_things_descr">- tùy chọn thông báo khi xóa liên hệ.\n- tên hồ sơ với dấu cách.\n- và hơn thế nữa!</string>
<string name="permissions_open_settings">Mở cài đặt</string>
<string name="migrate_from_device_or_share_this_file_link">Hoặc chia sẻ đường dẫn tệp này một cách an toàn.</string>
<string name="open_simplex_chat_to_accept_call">Mở SimpleX Chat để chấp nhận cuộc gọi</string>
<string name="call_desktop_permission_denied_safari">Mở Cài đặt Safari / Trang Web / Mic, rồi chọn Cho phép với localhost.</string>
<string name="la_mode_passcode">Mã truy cập</string>
<string name="open_chat">Mở cuộc hội thoại</string>
<string name="app_check_for_updates_button_open">Mở vị trí tệp</string>
<string name="open_on_mobile_and_scan_qr_code"><![CDATA[Mở <i>Sử dụng từ máy tính</i> trong ứng dụng di động và quét mã QR.]]></string>
<string name="or_paste_archive_link">Hoặc dán đường dẫn lưu trữ</string>
<string name="feature_roles_owners">các chủ sở hữu</string>
<string name="open_port_in_firewall_title">Mở cổng trong tường lửa</string>
<string name="passcode_changed">Mã truy cập đã được đổi!</string>
<string name="connect_plan_open_group">Mở nhóm</string>
<string name="other_label">khác</string>
<string name="other_errors">các lỗi khác</string>
<string name="smp_servers_other">Các máy chủ SMP khác</string>
<string name="xftp_servers_other">Các máy chủ XFTP khác</string>
<string name="paste_the_link_you_received_to_connect_with_your_contact">Dán đường dẫn mà bạn nhận được để kết nối với liên hệ hệ của bạn…</string>
<string name="paste_link">Dán đường dẫn</string>
<string name="network_proxy_password">Mật khẩu</string>
<string name="onboarding_notifications_mode_periodic">Định kỳ</string>
<string name="servers_info_subscriptions_connections_pending">Đang chờ xử lý</string>
<string name="icon_descr_server_status_pending">Đang chờ xử lý</string>
<string name="restore_passphrase_not_found_desc">Không tìm thấy mật khẩu trong Keystore, vui lòng nhập thủ công. Điều này có thể xảy ra nếu bạn khôi phục dữ liệu ứng dụng bằng một công cụ sao lưu. Nếu không phải như vậy, xin vui lòng liên hệ với nhà phát triển.</string>
<string name="past_member_vName">Thành viên cũ %1$s</string>
<string name="v5_5_simpler_connect_ui">Dán đường dẫn để kết nối!</string>
<string name="periodic_notifications">Thông báo định kỳ</string>
<string name="paste_the_link_you_received">Dán đường dẫn mà bạn nhận được</string>
<string name="paste_button">Dán</string>
<string name="call_connection_peer_to_peer">ngang hàng</string>
<string name="enter_passphrase_notification_title">Cần có mật khẩu</string>
<string name="paste_desktop_address">Dán địa chỉ máy tính</string>
<string name="paste_archive_link">Dán đường dẫn sao lưu</string>
<string name="password_to_show">Mật khẩu để hiển thị</string>
<string name="icon_descr_call_pending_sent">Cuộc gọi chờ</string>
<string name="passcode_not_changed">Mã truy cập không đổi!</string>
<string name="passcode_set">Mã truy cập đã được đặt!</string>
<string name="network_option_ping_count">bộ đếm PING</string>
<string name="v5_8_persian_ui">UI tiếng Ba Tư</string>
<string name="migrate_to_device_confirm_network_settings_footer">Xin vui lòng xác nhận rằng cài đặt mạng cho thiết bị này là chính xác.</string>
<string name="error_parsing_uri_desc">Xin vui lòng kiểm tra rằng đường dẫn SimpleX là chính xác.</string>
<string name="calls_prohibited_ask_to_enable_calls_alert_text">Xin vui lòng yêu cầu liên hệ của bạn mở tính năng thực hiện cuộc gọi.</string>
<string name="network_error_desc">Xin vui lòng kiểm tra kết nối mạng của bạn với %1$s và thử lại.</string>
<string name="enter_correct_current_passphrase">Xin vui lòng nhập đúng mật khẩu hiện tại.</string>
<string name="v6_0_chat_list_media">Mở từ danh sách cuộc trò chuyện.</string>
<string name="v5_6_picture_in_picture_calls">Cuộc gọi hình trong hình</string>
<string name="agent_internal_error_desc">Xin vui lòng báo cáo với các nhà phát triển:\n%s</string>
<string name="periodic_notifications_disabled">Thông báo định kỳ đã bị tắt!</string>
<string name="remote_ctrl_connection_stopped_desc">Xin vui lòng kiểm tra rằng thiết bị di động và máy tính kết nối tới cùng một mạng cục bộ, và tường lửa của máy tính cho phép kết nối.\nHãy chia sẻ bất kỳ vấn đề nào khác với nhà phát triển.</string>
<string name="please_check_correct_link_and_maybe_ask_for_a_new_one">Xin vui lòng kiểm tra rằng bạn đã dùng đúng đường dẫn hoặc yêu cầu liên hệ của bạn gửi cho bạn một đường dẫn khác.</string>
<string name="la_please_remember_to_store_password">Xin vui lòng ghi nhớ hoặc lưu trữ nó một cách an toàn - không có cách nào để khôi phục một mật khẩu đã bị mất!</string>
<string name="toast_permission_denied">Quyền truy cập bị tự chối!</string>
<string name="ask_your_contact_to_enable_voice">Xin vui lòng yêu cầu liên hệ của bạn mở tính năng gửi tin nhắn thoại.</string>
<string name="network_option_ping_interval">khoảng PING</string>
<string name="restore_database_alert_desc">Xin vui lòng nhập mật khẩu trước đó sau khi khôi phục bản sao lưu cơ sở dữ liệu. Việc này không thể được hoàn tác.</string>
<string name="observer_cant_send_message_desc">Xin vui lòng liên lạc với quản trị viên nhóm.</string>
<string name="alert_text_fragment_please_report_to_developers">Xin vui lòng báo cáo với các nhà phát triển.</string>
<string name="agent_critical_error_desc">Xin vui lòng báo cáo tới các nhà phát triển:\n%s\n\nGợi ý rằng bạn nên khởi động lại ứng dụng.</string>
<string name="error_smp_test_certificate">Có lẽ vân tay chứng chỉ trong địa chỉ máy chủ là không chính xác</string>
<string name="migrate_from_device_database_init">Đang chuẩn bị tải lên</string>
<string name="port_verb">Cổng</string>
<string name="network_proxy_port">cổng %d</string>
<string name="store_passphrase_securely_without_recover">Xin vui lòng lưu trữ mật khẩu một cách an toàn, bạn sẽ KHÔNG thể trò chuyện nếu bạn làm mất nó.</string>
<string name="loading_remote_file_desc">Xin vui lòng chờ trong khi tệp đang được tải từ thiết bị được liên kết</string>
<string name="smp_servers_preset_address">Địa chỉ máy chủ cài sẵn</string>
<string name="v4_5_message_draft_descr">Lưu lại bản nháp tin nhắn cuối cùng, với các tệp đính kèm.</string>
<string name="migrate_to_device_database_init">Đang chuẩn bị tải xuống</string>
<string name="contact_developers">Xin vui lòng cập nhật ứng dụng và liên lạc với các nhà phát triển.</string>
<string name="smp_servers_preset_server">Máy chủ cài sẵn</string>
<string name="please_try_later">Xin vui lòng thử lại sau.</string>
<string name="group_welcome_preview">Xem trước</string>
<string name="store_passphrase_securely">Xin vui lòng lưu trữ mật khẩu một cách an toàn, bạn sẽ KHÔNG thể thay đổi nếu bạn làm mất nó.</string>
<string name="v5_0_polish_interface">Giao diện tiếng Ba Lan</string>
<string name="app_check_for_updates_installed_successfully_desc">Xin vui lòng khởi động lại ứng dụng.</string>
<string name="servers_info_previously_connected_servers_section_header">Các máy chủ đã kết nối trước đó</string>
<string name="privacy_redefined">Định hình lại sự riêng tư</string>
<string name="privacy_and_security">Quyền riêng tư &amp; bảo mật</string>
<string name="profile_update_will_be_sent_to_contacts">Bản cập nhật hồ sơ sẽ được gửi đến các liên hệ của bạn.</string>
<string name="prohibit_message_reactions">Cấm thả cảm xúc tin nhắn.</string>
<string name="prohibit_calls">Cấm các cuộc gọi thoại/video.</string>
<string name="onboarding_notifications_mode_title">Thông báo riêng tư</string>
<string name="settings_section_title_profile_images">Các ảnh đại diện</string>
<string name="profile_password">Mật khẩu hồ sơ</string>
<string name="note_folder_local_display_name">Ghi chú riêng tư</string>
<string name="prohibit_message_deletion">Cấm xóa tin nhắn mà không thể phục hồi.</string>
<string name="settings_section_title_private_message_routing">ĐỊNH TUYẾN TIN NHẮN RIÊNG TƯ</string>
<string name="display_name__field">Tên hồ sơ:</string>
<string name="image_descr_profile_image">ảnh đại diện</string>
<string name="users_delete_with_connections">Hồ sơ và các kết nối máy chủ</string>
<string name="icon_descr_profile_image_placeholder">chỗ để ảnh đại diện</string>
<string name="v4_5_private_filenames">Tên tệp riêng tư</string>
<string name="v5_8_private_routing">Định tuyến tin nhắn riêng tư 🚀</string>
<string name="private_routing_error">Lỗi định tuyến riêng tư</string>
<string name="v5_5_private_notes">Ghi chú riêng tư</string>
<string name="network_smp_proxy_mode_private_routing">Định tuyến riêng tư</string>
<string name="settings_section_title_user_theme">Chủ đề hồ sơ</string>
<string name="prohibit_message_reactions_group">Cấm thả cảm xúc tin nhắn.</string>
<string name="network_option_protocol_timeout_per_kb">Thời gian chờ giao thức trên mỗi KB</string>
<string name="v4_6_hidden_chat_profiles_descr">Bảo vệ các hồ sơ trò chuyện của bạn bằng mật khẩu!</string>
<string name="v5_8_private_routing_descr">Bảo vệ địa chỉ IP của bạn khỏi các máy chủ tiếp tin được chọn bởi liên hệ của bạn.\nBật trong cài đặt *Mạng &amp; các máy chủ*</string>
<string name="protect_ip_address">Bảo vệ địa chỉ IP</string>
<string name="prohibit_direct_messages">Cấm gửi tin nhắn trực tiếp tới các thành viên.</string>
<string name="prohibit_sending_voice_messages">Cấm gửi tin nhắn thoại.</string>
<string name="network_option_protocol_timeout">Thời gian chờ giao thức</string>
<string name="prohibit_sending_disappearing">Cấm gửi tin nhắn tự xóa.</string>
<string name="protect_app_screen">Bảo vệ màn hình ứng dụng</string>
<string name="prohibit_sending_files">Cấm gửi tệp và phương tiện truyền thông.</string>
<string name="prohibit_sending_voice">Cấm gửi tin nhắn thoại.</string>
<string name="prohibit_sending_disappearing_messages">Cấm gửi tin nhắn tự xóa.</string>
<string name="prohibit_sending_simplex_links">Cấm gửi đường dẫn SimpleX</string>
<string name="proxied">Được proxy</string>
</resources>
@@ -47,7 +47,6 @@
<string name="delete_group_menu_action">删除</string>
<string name="delete_address__question">删除地址?</string>
<string name="delete_after">在此后删除</string>
<string name="delete_archive">删除档案</string>
<string name="deleted_description">已删除</string>
<string name="delete_files_and_media_question">删除文件和媒体文件?</string>
<string name="full_deletion">为所有人删除</string>
@@ -81,7 +80,6 @@
<string name="allow_direct_messages">允许向成员发送私信。</string>
<string name="allow_to_send_disappearing">允许发送限时消息。</string>
<string name="delete_address">删除地址</string>
<string name="delete_chat_archive_question">删除聊天档案?</string>
<string name="users_delete_question">删除聊天资料?</string>
<string name="button_delete_contact">删除联系人</string>
<string name="delete_contact_question">删除联系人?</string>
@@ -161,8 +159,6 @@
<string name="chat_database_deleted">聊天数据库已删除</string>
<string name="chat_database_imported">聊天数据库已导入</string>
<string name="keychain_error">钥匙串错误</string>
<string name="chat_archive_section">聊天档案</string>
<string name="chat_archive_header">聊天档案</string>
<string name="chat_console">聊天控制台</string>
<string name="chat_database_section">聊天数据库</string>
<string name="chat_is_stopped_indication">聊天已停止</string>
@@ -632,7 +628,6 @@
<string name="ttl_sec">%d 秒</string>
<string name="how_simplex_works">SimpleX 是如何工作的</string>
<string name="ensure_ICE_server_address_are_correct_format_and_unique">确保 WebRTC ICE 服务器地址格式正确、每行分开且不重复。</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[许多人问:<i>如果SimpleX没有用户标识符,它是怎样传递信息的?</i>]]></string>
<string name="ensure_smp_server_address_are_correct_format_and_unique">确保 SMP 服务器地址格式正确、每行分开且不重复。</string>
<string name="markdown_help">Markdown 帮助</string>
<string name="mark_code_verified">标记为已验证</string>
@@ -698,7 +693,6 @@
<string name="network_use_onion_hosts_required">必须</string>
<string name="save_and_notify_contact">保存并通知联系人</string>
<string name="save_and_notify_contacts">保存并通知联系人</string>
<string name="read_more_in_github">在我们的 GitHub 仓库中阅读更多内容。</string>
<string name="reject">拒绝</string>
<string name="to_protect_privacy_simplex_has_ids_for_queues">为了保护隐私,而不是所有其他平台使用的用户 ID,SimpleX 具有消息队列的标识符,每个联系人都是分开的。</string>
<string name="network_option_tcp_connection_timeout">TCP 连接超时</string>
@@ -719,7 +713,6 @@
<string name="reply_verb">回复</string>
<string name="network_options_reset_to_defaults">重置为默认</string>
<string name="run_chat_section">运行聊天程序</string>
<string name="save_archive">保存存档</string>
<string name="scan_code">扫码</string>
<string name="scan_code_from_contacts_app">从您联系人的应用程序中扫描安全码。</string>
<string name="security_code">安全码</string>
@@ -870,10 +863,8 @@
<string name="icon_descr_simplex_team">SimpleX 团队</string>
<string name="group_info_section_title_num_members">%1$s 成员</string>
<string name="chat_preferences_yes"></string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[您可以控制通过哪些服务器<b>接收</b>消息,您的联系人 - 您用来向他们发送消息的服务器。]]></string>
<string name="you_will_be_connected_when_group_host_device_is_online">您将在组主设备上线时连接到该群组,请稍等或稍后再检查!</string>
<string name="auth_you_will_be_required_to_authenticate_when_you_start_or_resume">当您启动应用或在应用程序驻留后台超过30 秒后,您将需要进行身份验证。</string>
<string name="archive_created_on_ts">创建于 %1$s</string>
<string name="you_can_connect_to_simplex_chat_founder"><![CDATA[您可以 <font color="#0088ff"> 连接到 SimpleX Chat 开发者提出任何问题并接收更新 </font>。]]></string>
<string name="you_accepted_connection">您已接受连接</string>
<string name="your_SMP_servers">您的 SMP 服务器</string>
@@ -554,7 +554,6 @@
<string name="description_via_group_link_incognito">透過群組連結使用匿名聊天模式</string>
<string name="description_via_contact_address_link_incognito">一個使用了匿名聊天模式的人透過連結加入了群組</string>
<string name="description_via_one_time_link_incognito">透過使用一次性連結匿名聊天模式連接</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[有很多人問:<i>如果 SimpleX 沒有任何的用戶標識符,它如何傳送訊息?</i>]]></string>
<string name="onboarding_notifications_mode_service">即時</string>
<string name="onboarding_notifications_mode_periodic">定期的</string>
<string name="no_call_on_lock_screen">關閉</string>
@@ -632,7 +631,6 @@
<string name="chat_item_ttl_seconds">%s 秒(s)</string>
<string name="error_encrypting_database">加密數據庫時出錯</string>
<string name="save_passphrase_in_keychain">在金鑰庫儲存密碼</string>
<string name="archive_created_on_ts">建立於 %1$s</string>
<string name="restore_database">還原數據庫的備份</string>
<string name="icon_descr_group_inactive">群組為不活躍狀態</string>
<string name="alert_title_group_invitation_expired">邀請連結過時!</string>
@@ -700,8 +698,6 @@
<string name="restore_database_alert_confirm">還原</string>
<string name="restore_database_alert_title">還原數據庫的備份?</string>
<string name="database_restore_error">還原數據庫時出錯</string>
<string name="save_archive">儲存存檔</string>
<string name="delete_archive">刪除存檔</string>
<string name="join_group_button">加入</string>
<string name="join_group_question">確定要加入群組?</string>
<string name="join_group_incognito_button">加入匿名聊天模式</string>
@@ -777,7 +773,6 @@
<string name="error_exporting_chat_database">匯出數據庫時出錯</string>
<string name="error_importing_database">匯入數據庫時出錯</string>
<string name="database_passphrase_will_be_updated">受加密的數據庫密碼會再次更新。</string>
<string name="delete_chat_archive_question">刪除封存對話?</string>
<string name="encrypt_database_question">加密數據庫?</string>
<string name="group_invitation_item_description">邀請至群組 %1$s</string>
<string name="icon_descr_add_members">邀請成員</string>
@@ -791,7 +786,6 @@
<string name="ttl_s">%ds</string>
<string name="onboarding_notifications_mode_title">私人通知</string>
<string name="read_more_in_github_with_link"><![CDATA[可在 <font color="#0088ff">GitHub</font>內查看更多。]]></string>
<string name="read_more_in_github">於 GitHub 儲存庫內查看更多。</string>
<string name="incoming_video_call">視訊通話來電</string>
<string name="icon_descr_hang_up">掛斷電話來電</string>
<string name="call_connection_peer_to_peer">點對點</string>
@@ -799,13 +793,11 @@
<string name="status_contact_has_no_e2e_encryption">對話沒有經過端對端加密</string>
<string name="database_encrypted">數據庫已加密!</string>
<string name="encrypted_database">已加密數據庫</string>
<string name="chat_archive_section">封存對話</string>
<string name="snd_group_event_group_profile_updated">群組資料已經更新</string>
<string name="group_member_role_member">成員</string>
<string name="group_info_member_you">你:%1$s</string>
<string name="button_delete_group">刪除群組</string>
<string name="v4_4_live_messages">即時訊息</string>
<string name="chat_archive_header">封存對話</string>
<string name="error_removing_member">移除成員時出錯</string>
<string name="error_changing_role">修改身份時出錯</string>
<string name="info_row_group">群組</string>
@@ -880,7 +872,6 @@
<string name="update_network_session_mode_question">更新傳輸隔離模式?</string>
<string name="to_protect_privacy_simplex_has_ids_for_queues">為了保護隱私,而不像是其他平台般需要提取和存儲用戶的 IDs 資料, SimpleX 平台有自家佇列的標識符,這對於你的每個聯絡人也是獨一無二的。</string>
<string name="onboarding_notifications_mode_off">當應用程式是運行中</string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[你可以控制通過哪一個伺服器 <b>來接收</b> 你的聯絡人訊息 – 這些伺服器用來接收他們傳送給你的訊息。]]></string>
<string name="allow_accepting_calls_from_lock_screen">透過設定啟用於上鎖畫面顯示來電通知。</string>
<string name="delete_chat_profile_action_cannot_be_undone_warning">這操作不能還原 - 你目前的個人檔案,聯絡人,訊息和檔案將不可逆地遺失。</string>
<string name="you_must_use_the_most_recent_version_of_database">你必須在裝置上使用最新版本的對話數據庫,否則你可能會停止接收某些聯絡人的訊息。</string>
@@ -3,6 +3,7 @@ package chat.simplex.common.platform
import chat.simplex.common.model.*
import chat.simplex.common.simplexWindowState
import chat.simplex.common.views.call.RcvCallInvitation
import chat.simplex.common.views.database.deleteOldChatArchive
import chat.simplex.common.views.helpers.*
import java.util.*
import chat.simplex.res.MR
@@ -30,6 +31,7 @@ fun initApp() {
override fun showMessage(title: String, text: String) = chat.simplex.common.model.NtfManager.showMessage(title, text)
}
applyAppLocale()
deleteOldChatArchive()
if (DatabaseUtils.ksSelfDestructPassword.get() == null) {
initChatControllerOnStart()
}
@@ -1,6 +1,8 @@
package chat.simplex.common.platform
import androidx.compose.ui.graphics.*
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntSize
import boofcv.io.image.ConvertBufferedImage
import boofcv.struct.image.GrayU8
import chat.simplex.res.MR
@@ -67,8 +69,16 @@ actual fun cropToSquare(image: ImageBitmap): ImageBitmap {
} else {
yOffset = (image.height - side) / 2
}
// LALAL MAKE REAL CROP
return image
val croppedImage = ImageBitmap(side, side)
val canvas = Canvas(croppedImage)
canvas.drawImageRect(
image,
srcOffset = IntOffset(xOffset, yOffset),
srcSize = IntSize(side, side),
dstSize = IntSize(side, side),
paint = Paint()
)
return croppedImage
}
actual fun compressImageStr(bitmap: ImageBitmap): String {
@@ -20,6 +20,7 @@ import androidx.compose.ui.unit.dp
import chat.simplex.common.model.ChatController.appPrefs
import chat.simplex.common.ui.theme.DEFAULT_PADDING
import chat.simplex.common.views.helpers.*
import chat.simplex.common.views.onboarding.OnboardingStage
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.filter
import kotlin.math.*
@@ -206,7 +207,7 @@ actual fun ColumnWithScrollBar(
}
val modifier = if (fillMaxSize) Modifier.fillMaxSize().then(modifier) else modifier
Box(Modifier.nestedScroll(connection)) {
val oneHandUI = remember { appPrefs.oneHandUI.state }
val oneHandUI = remember { derivedStateOf { if (appPrefs.onboardingStage.state.value == OnboardingStage.OnboardingComplete) appPrefs.oneHandUI.state.value else false } }
val padding = if (oneHandUI.value) PaddingValues(bottom = AppBarHeight * fontSizeSqrtMultiplier) else PaddingValues(top = AppBarHeight * fontSizeSqrtMultiplier)
Column(
if (maxIntrinsicSize) {
@@ -9,14 +9,14 @@ import kotlinx.datetime.Instant
actual fun restartChatOrApp() {
if (chatModel.chatRunning.value == false) {
chatModel.chatDbChanged.value = true
startChat(chatModel, mutableStateOf(Instant.DISTANT_PAST), chatModel.chatDbChanged)
startChat(chatModel, mutableStateOf(Instant.DISTANT_PAST), chatModel.chatDbChanged, mutableStateOf(false))
} else {
authStopChat(chatModel) {
withBGApi {
// adding delay in order to prevent locked database by previous initialization
delay(1000)
chatModel.chatDbChanged.value = true
startChat(chatModel, mutableStateOf(Instant.DISTANT_PAST), chatModel.chatDbChanged)
startChat(chatModel, mutableStateOf(Instant.DISTANT_PAST), chatModel.chatDbChanged, mutableStateOf(false))
}
}
}