From c4d75366b57ca13e8b0a9f1968a059c4298fe6df Mon Sep 17 00:00:00 2001 From: Stanislav Dmitrenko <7953703+avently@users.noreply.github.com> Date: Fri, 19 Jan 2024 00:16:44 +0700 Subject: [PATCH] android, desktop: ability to delete the last profile (#3645) * android, desktop: ability to delete the last profile * hide modals to see onboarding after removing the last visible user * removed unused checks * make multiple profile creation usable * deleting the last user by removing the whole database * adapted to new logic * changes * not deleting the whole database * refactor * hide search when no profile * changes --- .../chat/simplex/common/model/ChatModel.kt | 2 +- .../chat/simplex/common/model/SimpleXAPI.kt | 7 +- .../chat/simplex/common/views/WelcomeView.kt | 5 +- .../common/views/chatlist/ChatListView.kt | 4 +- .../common/views/chatlist/UserPicker.kt | 31 ++--- .../common/views/database/DatabaseView.kt | 11 +- .../common/views/localauth/LocalAuthView.kt | 28 ++--- .../views/onboarding/CreateSimpleXAddress.kt | 13 +- .../common/views/usersettings/SettingsView.kt | 4 +- .../views/usersettings/UserProfilesView.kt | 112 +++++++++--------- .../commonMain/resources/MR/ar/strings.xml | 3 - .../commonMain/resources/MR/base/strings.xml | 3 - .../commonMain/resources/MR/bg/strings.xml | 3 - .../commonMain/resources/MR/cs/strings.xml | 3 - .../commonMain/resources/MR/de/strings.xml | 3 - .../commonMain/resources/MR/es/strings.xml | 3 - .../commonMain/resources/MR/fi/strings.xml | 3 - .../commonMain/resources/MR/fr/strings.xml | 3 - .../commonMain/resources/MR/hu/strings.xml | 3 - .../commonMain/resources/MR/it/strings.xml | 3 - .../commonMain/resources/MR/iw/strings.xml | 3 - .../commonMain/resources/MR/ja/strings.xml | 3 - .../commonMain/resources/MR/ko/strings.xml | 3 - .../commonMain/resources/MR/lt/strings.xml | 3 - .../commonMain/resources/MR/nl/strings.xml | 3 - .../commonMain/resources/MR/pl/strings.xml | 3 - .../resources/MR/pt-rBR/strings.xml | 3 - .../commonMain/resources/MR/pt/strings.xml | 1 - .../commonMain/resources/MR/ru/strings.xml | 3 - .../commonMain/resources/MR/th/strings.xml | 3 - .../commonMain/resources/MR/tr/strings.xml | 3 - .../commonMain/resources/MR/uk/strings.xml | 3 - .../resources/MR/zh-rCN/strings.xml | 3 - .../resources/MR/zh-rTW/strings.xml | 3 - 34 files changed, 110 insertions(+), 177 deletions(-) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt index abd6e4fa3..e53459015 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt @@ -152,7 +152,7 @@ object ChatModel { fun removeUser(user: User) { val i = getUserIndex(user) - if (i != -1 && users[i].user.userId != currentUser.value?.userId) { + if (i != -1) { users.removeAt(i) } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt index 97853e2fd..a70b1190d 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt @@ -351,7 +351,6 @@ object ChatController { suspend fun startChat(user: User) { Log.d(TAG, "user: $user") try { - if (chatModel.chatRunning.value == true) return apiSetNetworkConfig(getNetCfg()) val justStarted = apiStartChat() appPrefs.chatStopped.set(false) @@ -410,9 +409,9 @@ object ChatController { } } - suspend fun changeActiveUser_(rhId: Long?, toUserId: Long, viewPwd: String?) { + suspend fun changeActiveUser_(rhId: Long?, toUserId: Long?, viewPwd: String?) { val currentUser = changingActiveUserMutex.withLock { - apiSetActiveUser(rhId, toUserId, viewPwd).also { + (if (toUserId != null) apiSetActiveUser(rhId, toUserId, viewPwd) else apiGetActiveUser(rhId)).also { chatModel.currentUser.value = it } } @@ -421,7 +420,7 @@ object ChatController { chatModel.users.addAll(users) getUserChatData(rhId) val invitation = chatModel.callInvitations.values.firstOrNull { inv -> inv.user.userId == toUserId } - if (invitation != null) { + if (invitation != null && currentUser != null) { chatModel.callManager.reportNewIncomingCall(invitation.copy(user = currentUser)) } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/WelcomeView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/WelcomeView.kt index b9a8b4d9e..c4cbe0683 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/WelcomeView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/WelcomeView.kt @@ -177,8 +177,10 @@ fun CreateFirstProfile(chatModel: ChatModel, close: () -> Unit) { fun createProfileInNoProfileSetup(displayName: String, close: () -> Unit) { withBGApi { val user = controller.apiCreateActiveUser(null, Profile(displayName.trim(), "", null)) ?: return@withBGApi + if (!chatModel.connectedToRemote()) { + chatModel.localUserCreated.value = true + } controller.appPrefs.onboardingStage.set(OnboardingStage.Step3_CreateSimpleXAddress) - chatModel.chatRunning.value = false controller.startChat(user) controller.switchUIRemoteHost(null) close() @@ -210,6 +212,7 @@ fun createProfileOnboarding(chatModel: ChatModel, displayName: String, close: () chatModel.currentUser.value = chatModel.controller.apiCreateActiveUser( null, Profile(displayName.trim(), "", null) ) ?: return@withBGApi + chatModel.localUserCreated.value = true val onboardingStage = chatModel.controller.appPrefs.onboardingStage if (chatModel.users.isEmpty()) { onboardingStage.set(if (appPlatform.isDesktop && chatModel.controller.appPrefs.initialRandomDBPassphrase.get() && !chatModel.desktopOnboardingRandomPassword.value) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt index 6570db469..28d276b26 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt @@ -107,7 +107,9 @@ fun ChatListView(chatModel: ChatModel, settingsState: SettingsViewState, setPerf modifier = Modifier .fillMaxSize() ) { - ChatList(chatModel, searchText = searchText) + if (!chatModel.desktopNoUserNoRemote) { + ChatList(chatModel, searchText = searchText) + } if (chatModel.chats.isEmpty() && !chatModel.switchingUsersAndHosts.value && !chatModel.desktopNoUserNoRemote) { Text(stringResource( if (chatModel.chatRunning.value == null) MR.strings.loading_chats else MR.strings.you_have_no_chats), Modifier.align(Alignment.Center), color = MaterialTheme.colors.secondary) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/UserPicker.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/UserPicker.kt index 1c455da00..23272fcc0 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/UserPicker.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/UserPicker.kt @@ -213,26 +213,29 @@ fun UserPicker( userPickerState.value = AnimatedViewState.GONE } Divider(Modifier.requiredHeight(1.dp)) - } else if (remoteHosts.isEmpty()) { - LinkAMobilePickerItem { - ModalManager.start.showModal { - ConnectMobileView() + } else { + if (remoteHosts.isEmpty()) { + LinkAMobilePickerItem { + ModalManager.start.showModal { + ConnectMobileView() + } + userPickerState.value = AnimatedViewState.GONE } - userPickerState.value = AnimatedViewState.GONE + Divider(Modifier.requiredHeight(1.dp)) } - Divider(Modifier.requiredHeight(1.dp)) - } else if (chatModel.desktopNoUserNoRemote) { - CreateInitialProfile { - doWithAuth(generalGetString(MR.strings.auth_open_chat_profiles), generalGetString(MR.strings.auth_log_in_using_credential)) { - ModalManager.center.showModalCloseable { close -> - LaunchedEffect(Unit) { - userPickerState.value = AnimatedViewState.HIDING + if (chatModel.desktopNoUserNoRemote) { + CreateInitialProfile { + doWithAuth(generalGetString(MR.strings.auth_open_chat_profiles), generalGetString(MR.strings.auth_log_in_using_credential)) { + ModalManager.center.showModalCloseable { close -> + LaunchedEffect(Unit) { + userPickerState.value = AnimatedViewState.HIDING + } + CreateProfile(chat.simplex.common.platform.chatModel, close) } - CreateProfile(chat.simplex.common.platform.chatModel, close) } } + Divider(Modifier.requiredHeight(1.dp)) } - Divider(Modifier.requiredHeight(1.dp)) } if (showSettings) { SettingsPickerItem(settingsClicked) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/database/DatabaseView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/database/DatabaseView.kt index d4d66a19e..58d3bfd63 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/database/DatabaseView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/database/DatabaseView.kt @@ -470,10 +470,10 @@ suspend fun deleteChatAsync(m: ChatModel) { m.controller.apiDeleteStorage() DatabaseUtils.ksDatabasePassword.remove() m.controller.appPrefs.storeDBPassphrase.set(true) - deleteAppDatabaseAndFiles() + deleteChatDatabaseFilesAndState() } -fun deleteAppDatabaseAndFiles() { +fun deleteChatDatabaseFilesAndState() { val chat = File(dataDir, chatDatabaseFileName) val chatBak = File(dataDir, "$chatDatabaseFileName.bak") val agent = File(dataDir, agentDatabaseFileName) @@ -489,6 +489,13 @@ fun deleteAppDatabaseAndFiles() { tmpDir.mkdir() DatabaseUtils.ksDatabasePassword.remove() controller.appPrefs.storeDBPassphrase.set(true) + controller.ctrl = null + + // Clear sensitive data on screen just in case ModalManager will fail to prevent hiding its modals while database encrypts itself + chatModel.chatId.value = null + chatModel.chatItems.clear() + chatModel.chats.clear() + chatModel.users.clear() } private fun exportArchive( diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/localauth/LocalAuthView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/localauth/LocalAuthView.kt index 16d8a34b1..cf10d33cb 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/localauth/LocalAuthView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/localauth/LocalAuthView.kt @@ -67,12 +67,7 @@ private fun deleteStorageAndRestart(m: ChatModel, password: String, completed: ( * */ chatCloseStore(ctrl) } - deleteAppDatabaseAndFiles() - // Clear sensitive data on screen just in case ModalManager fails to hide its modals while new database is created - m.chatId.value = null - m.chatItems.clear() - m.chats.clear() - m.users.clear() + deleteChatDatabaseFilesAndState() ksAppPassword.set(password) ksSelfDestructPassword.remove() ntfManager.cancelAllNotifications() @@ -81,14 +76,7 @@ private fun deleteStorageAndRestart(m: ChatModel, password: String, completed: ( val displayName = displayNamePref.get() selfDestructPref.set(false) displayNamePref.set(null) - m.chatDbChanged.value = true - m.chatDbStatus.value = null - try { - initChatController() - } catch (e: Exception) { - Log.d(TAG, "initializeChat ${e.stackTraceToString()}") - } - m.chatDbChanged.value = false + reinitChatController() if (m.currentUser.value != null) { return@withBGApi } @@ -100,7 +88,6 @@ private fun deleteStorageAndRestart(m: ChatModel, password: String, completed: ( m.currentUser.value = createdUser m.controller.appPrefs.onboardingStage.set(OnboardingStage.OnboardingComplete) if (createdUser != null) { - controller.chatModel.chatRunning.value = false m.controller.startChat(createdUser) } ModalManager.closeAllModalsEverywhere() @@ -113,3 +100,14 @@ private fun deleteStorageAndRestart(m: ChatModel, password: String, completed: ( } } } + +suspend fun reinitChatController() { + chatModel.chatDbChanged.value = true + chatModel.chatDbStatus.value = null + try { + initChatController() + } catch (e: Exception) { + Log.d(TAG, "initializeChat ${e.stackTraceToString()}") + } + chatModel.chatDbChanged.value = false +} diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/onboarding/CreateSimpleXAddress.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/onboarding/CreateSimpleXAddress.kt index ec0ded450..190b962ea 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/onboarding/CreateSimpleXAddress.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/onboarding/CreateSimpleXAddress.kt @@ -173,17 +173,6 @@ private fun prepareChatBeforeAddressCreation(rhId: Long?) { withBGApi { val user = chatModel.controller.apiGetActiveUser(rhId) ?: return@withBGApi chatModel.currentUser.value = user - if (chatModel.users.isEmpty()) { - if (appPlatform.isDesktop) { - // Make possible to use chat after going to remote device linking and returning back to local profile creation - chatModel.chatRunning.value = false - } - chatModel.controller.startChat(user) - } else { - val users = chatModel.controller.listUsers(rhId) - chatModel.users.clear() - chatModel.users.addAll(users) - chatModel.controller.getUserChatData(rhId) - } + chatModel.controller.startChat(user) } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/SettingsView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/SettingsView.kt index ccc893085..d92f2f0f1 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/SettingsView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/SettingsView.kt @@ -33,7 +33,7 @@ import chat.simplex.common.views.onboarding.WhatsNewView import chat.simplex.common.views.remote.ConnectDesktopView import chat.simplex.common.views.remote.ConnectMobileView import chat.simplex.res.MR -import kotlinx.coroutines.launch +import kotlinx.coroutines.* @Composable fun SettingsView(chatModel: ChatModel, setPerformLA: (Boolean) -> Unit, drawerState: DrawerState) { @@ -119,7 +119,7 @@ fun SettingsLayout( SectionItemView(showCustomModal { chatModel, close -> UserProfileView(chatModel, close) }, 80.dp, padding = PaddingValues(start = 16.dp, end = DEFAULT_PADDING), disabled = stopped) { ProfilePreview(profile, stopped = stopped) } - SettingsActionItem(painterResource(MR.images.ic_manage_accounts), stringResource(MR.strings.your_chat_profiles), { withAuth(generalGetString(MR.strings.auth_open_chat_profiles), generalGetString(MR.strings.auth_log_in_using_credential)) { showSettingsModalWithSearch { it, search -> UserProfilesView(it, search, profileHidden) } } }, disabled = stopped, extraPadding = true) + SettingsActionItem(painterResource(MR.images.ic_manage_accounts), stringResource(MR.strings.your_chat_profiles), { withAuth(generalGetString(MR.strings.auth_open_chat_profiles), generalGetString(MR.strings.auth_log_in_using_credential)) { showSettingsModalWithSearch { it, search -> UserProfilesView(it, search, profileHidden, drawerState) } } }, disabled = stopped, extraPadding = true) SettingsActionItem(painterResource(MR.images.ic_qr_code), stringResource(MR.strings.your_simplex_contact_address), showCustomModal { it, close -> UserAddressView(it, shareViaProfile = it.currentUser.value!!.addressShared, close = close) }, disabled = stopped, extraPadding = true) ChatPreferencesItem(showCustomModal, stopped = stopped) } else if (chatModel.localUserCreated.value == false) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/UserProfilesView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/UserProfilesView.kt index 390f1cac9..1beccd516 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/UserProfilesView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/UserProfilesView.kt @@ -27,18 +27,20 @@ import chat.simplex.common.ui.theme.* import chat.simplex.common.views.chat.item.ItemAction import chat.simplex.common.views.chatlist.UserProfilePickerItem import chat.simplex.common.views.chatlist.UserProfileRow -import chat.simplex.common.views.database.PassphraseField import chat.simplex.common.views.helpers.* import chat.simplex.common.views.CreateProfile +import chat.simplex.common.views.database.* +import chat.simplex.common.views.onboarding.OnboardingStage import chat.simplex.res.MR import dev.icerock.moko.resources.StringResource -import kotlinx.coroutines.delay +import kotlinx.coroutines.* @Composable -fun UserProfilesView(m: ChatModel, search: MutableState, profileHidden: MutableState) { +fun UserProfilesView(m: ChatModel, search: MutableState, profileHidden: MutableState, drawerState: DrawerState) { val searchTextOrPassword = rememberSaveable { search } val users by remember { derivedStateOf { m.users.map { it.user } } } val filteredUsers by remember { derivedStateOf { filteredUsers(m, searchTextOrPassword.value) } } + val scope = rememberCoroutineScope() UserProfilesLayout( users = users, filteredUsers = filteredUsers, @@ -49,6 +51,12 @@ fun UserProfilesView(m: ChatModel, search: MutableState, profileHidden: addUser = { ModalManager.center.showModalCloseable { close -> CreateProfile(m, close) + if (appPlatform.isDesktop) { + // Hide settings to allow clicks to pass through to CreateProfile view + DisposableEffectOnGone(always = { scope.launch { drawerState.close() } }) { + // Show settings again to allow intercept clicks to close modals after profile creation finishes + scope.launch(NonCancellable) { drawerState.open() } } + } } }, activateUser = { user -> @@ -63,45 +71,34 @@ fun UserProfilesView(m: ChatModel, search: MutableState, profileHidden: } }, removeUser = { user -> - if (m.users.size > 1 && (user.hidden || visibleUsersCount(m) > 1)) { - val text = buildAnnotatedString { - append(generalGetString(MR.strings.users_delete_all_chats_deleted) + "\n\n" + generalGetString(MR.strings.users_delete_profile_for) + " ") - withStyle(SpanStyle(fontWeight = FontWeight.Bold)) { - append(user.displayName) - } - append(":") + val text = buildAnnotatedString { + append(generalGetString(MR.strings.users_delete_all_chats_deleted) + "\n\n" + generalGetString(MR.strings.users_delete_profile_for) + " ") + withStyle(SpanStyle(fontWeight = FontWeight.Bold)) { + append(user.displayName) } - AlertManager.shared.showAlertDialogButtonsColumn( - title = generalGetString(MR.strings.users_delete_question), - text = text, - buttons = { - Column { - SectionItemView({ - AlertManager.shared.hideAlert() - removeUser(m, user, users, true, searchTextOrPassword.value.trim()) - }) { - Text(stringResource(MR.strings.users_delete_with_connections), Modifier.fillMaxWidth(), textAlign = TextAlign.Center, color = Color.Red) - } - SectionItemView({ - AlertManager.shared.hideAlert() - removeUser(m, user, users, false, searchTextOrPassword.value.trim()) - } - ) { - Text(stringResource(MR.strings.users_delete_data_only), Modifier.fillMaxWidth(), textAlign = TextAlign.Center, color = Color.Red) - } + append(":") + } + AlertManager.shared.showAlertDialogButtonsColumn( + title = generalGetString(MR.strings.users_delete_question), + text = text, + buttons = { + Column { + SectionItemView({ + AlertManager.shared.hideAlert() + removeUser(m, user, users, true, searchTextOrPassword.value.trim()) + }) { + Text(stringResource(MR.strings.users_delete_with_connections), Modifier.fillMaxWidth(), textAlign = TextAlign.Center, color = Color.Red) + } + SectionItemView({ + AlertManager.shared.hideAlert() + removeUser(m, user, users, false, searchTextOrPassword.value.trim()) + } + ) { + Text(stringResource(MR.strings.users_delete_data_only), Modifier.fillMaxWidth(), textAlign = TextAlign.Center, color = Color.Red) } } - ) - } else { - AlertManager.shared.showAlertMsg( - title = generalGetString(MR.strings.cant_delete_user_profile), - text = if (m.users.size > 1) { - generalGetString(MR.strings.should_be_at_least_one_visible_profile) - } else { - generalGetString(MR.strings.should_be_at_least_one_profile) - } - ) - } + } + ) }, unhideUser = { user -> if (passwordEntryRequired(user, searchTextOrPassword.value)) { @@ -178,7 +175,7 @@ private fun UserProfilesLayout( SectionView { for (user in filteredUsers) { - UserView(user, users, visibleUsersCount, activateUser, removeUser, unhideUser, muteUser, unmuteUser, showHiddenProfile) + UserView(user, visibleUsersCount, activateUser, removeUser, unhideUser, muteUser, unmuteUser, showHiddenProfile) SectionDivider() } if (searchTextOrPassword.value.trim().isEmpty()) { @@ -210,7 +207,6 @@ private fun UserProfilesLayout( @Composable private fun UserView( user: User, - users: List, visibleUsersCount: Int, activateUser: (User) -> Unit, removeUser: (User) -> Unit, @@ -220,7 +216,7 @@ private fun UserView( showHiddenProfile: (User) -> Unit, ) { val showMenu = remember { mutableStateOf(false) } - UserProfilePickerItem(user, onLongClick = { if (users.size > 1) showMenu.value = true }) { + UserProfilePickerItem(user, onLongClick = { showMenu.value = true }) { activateUser(user) } Box(Modifier.padding(horizontal = DEFAULT_PADDING)) { @@ -350,22 +346,28 @@ private fun removeUser(m: ChatModel, user: User, users: List, delSMPQueues } private suspend fun doRemoveUser(m: ChatModel, user: User, users: List, delSMPQueues: Boolean, viewPwd: String?) { - if (users.size < 2) return - - suspend fun deleteUser(user: User) { - m.controller.apiDeleteUser(user, delSMPQueues, viewPwd) - m.removeUser(user) - } try { - if (user.activeUser) { - val newActive = users.firstOrNull { u -> !u.activeUser && !u.hidden } - if (newActive != null) { - m.controller.changeActiveUser_(newActive.remoteHostId, newActive.userId, null) - deleteUser(user.copy(activeUser = false)) + when { + user.activeUser -> { + val newActive = users.firstOrNull { u -> !u.activeUser && !u.hidden } + if (newActive != null) { + m.controller.changeActiveUser_(user.remoteHostId, newActive.userId, null) + m.controller.apiDeleteUser(user, delSMPQueues, viewPwd) + } else { + // Deleting the last visible user while having hidden one(s) + m.controller.apiDeleteUser(user, delSMPQueues, viewPwd) + m.controller.changeActiveUser_(user.remoteHostId, null, null) + if (appPlatform.isAndroid) { + controller.appPrefs.onboardingStage.set(OnboardingStage.Step1_SimpleXInfo) + ModalManager.closeAllModalsEverywhere() + } + } + } + else -> { + m.controller.apiDeleteUser(user, delSMPQueues, viewPwd) } - } else { - deleteUser(user) } + m.removeUser(user) } catch (e: Exception) { AlertManager.shared.showAlertMsg(generalGetString(MR.strings.error_deleting_user), e.stackTraceToString()) } diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml index b53f230a5..616cd9c75 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml @@ -145,7 +145,6 @@ المكالمات لا يمكن دعوة جهات الاتصال! تم تغيير العنوان من أجلك - لا يمكن حذف ملف تعريف المستخدم! طلب لاستلام الفيديو مكالمتك تحت الإجراء تغيير عبارة مرور قاعدة البيانات؟ @@ -1127,7 +1126,6 @@ قاعدة البيانات لا تعمل بشكل صحيح. انقر لمعرفة المزيد ألوان السمة انقر لتنشيط الملف الشخصي. - يجب أن يكون هناك ملف تعريف مستخدم واحد على الأقل. عزل النقل هذه السلسلة ليست رابط اتصال! هذه الإعدادات لملف التعريف الحالي الخاص بك @@ -1138,7 +1136,6 @@ بفضل المستخدمين - المساهمة عبر Weblate! لم تكتمل محاولة تغيير عبارة مرور قاعدة البيانات. لتلقي الإشعارات، يرجى إدخال عبارة مرور قاعدة البيانات - يجب أن يكون هناك ملف تعريف مستخدم مرئي واحد على الأقل. مصادقة النظام يعمل التشفير واتفاقية التشفير الجديدة غير مطلوبة. قد ينتج عن ذلك أخطاء في الاتصال! لا يمكن فك ترميز الصورة. من فضلك، جرب صورة مختلفة أو تواصل مع المطورين. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index cda7df43f..e3711afaf 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -1413,9 +1413,6 @@ Unmute Enter password in search Tap to activate profile. - Can\'t delete user profile! - There should be at least one visible user profile. - There should be at least one user profile. Make profile private! You can hide or mute a user profile - hold it for the menu. Don\'t show again diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/bg/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/bg/strings.xml index 0379bf650..a73c72670 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/bg/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/bg/strings.xml @@ -185,7 +185,6 @@ Промени Промяна на груповата роля\? Все още ще получавате обаждания и известия от заглушени профили, когато са активни. - Потребителският профил не може да се изтрие! Позволи изчезващи съобщения само ако вашият контакт ги разрешава. Позволи на вашите контакти да изтриват необратимо изпратените съобщения. (24 часа) Позволи на вашите контакти да изпращат изчезващи съобщения. @@ -1165,8 +1164,6 @@ Профилът се споделя само с вашите контакти. Това действие не може да бъде отменено - всички получени и изпратени файлове и медия ще бъдат изтрити. Снимките с ниска разделителна способност ще бъдат запазени. Докосни за активиране на профил. - Трябва да има поне един потребителски профил. - Трябва да има поне един видим потребителски профил. Системен Заглавие (за споделяне с вашия контакт) diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/cs/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/cs/strings.xml index 54ff0129b..113412984 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/cs/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/cs/strings.xml @@ -960,7 +960,6 @@ Systém Uložit servery\? Znovu neukazuj - Nemohu smazat uživatelský profil! Přidat uvítací zprávu Čínské a Španělské rozhranní Hlasové a video hovory @@ -991,12 +990,10 @@ Podpora bluetooth a další vylepšení. Klepnutím aktivujete profil. Díky uživatelům - překládejte prostřednictvím Weblate! - Měl by tam být alespoň jeden uživatelský profil. Uvítací zpráva Uvítací zpráva Zrušit ztlumení Chcete-li odhalit svůj skrytý profil, zadejte celé heslo do vyhledávacího pole na stránce Chat profily. - Měl by tam být alespoň jeden viditelný uživatelský profil. Stále budete přijímat volání a upozornění od umlčených profilů pokud budou aktivní. Můžete skrýt nebo ztlumit uživatelský profil - Podržte pro menu. Odkrýt diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml index 67af829b5..a46bfdf41 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml @@ -1041,7 +1041,6 @@ Diese Nachricht wird für alle Gruppenmitglieder gelöscht. System Passwort bestätigen - Das Benutzerprofil kann nicht gelöscht werden! Nicht nochmals anzeigen Chinesische und spanische Bedienoberfläche Audio- und Videoanrufe @@ -1060,8 +1059,6 @@ Privates Profil erzeugen! Stummschalten Zum Aktivieren des Profils tippen. - Es muss mindestens ein Benutzer-Profil vorhanden sein. - Es muss mindestens ein sichtbares Benutzer-Profil vorhanden sein. Stummschaltung aufheben Bei Inaktivität stummgeschaltet! Schützen Sie Ihre Chat-Profile mit einem Passwort! diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/es/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/es/strings.xml index 9bf522cf0..e1ded8295 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/es/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/es/strings.xml @@ -967,17 +967,14 @@ Error al guardar contraseña de usuario El retransmisor sólo se usa en caso de necesidad. Un tercero podría ver tu IP. El servidor de retransmisión protege tu IP pero puede ver la duración de la llamada. - ¡No se puede eliminar el perfil! Introduce la contraseña Ocultar Silenciar Guardar y actualizar perfil del grupo Pulsa sobre un perfil para activarlo. - Debe haber al menos un perfil de usuario visible. Mostrar Mensaje de bienvenida Mensaje de bienvenida - Debe haber al menos un perfil de usuario. ¡Hacer perfil privado! No mostrar de nuevo ¡Silenciado cuando está inactivo! diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/fi/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/fi/strings.xml index 78edeaecd..143496326 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/fi/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/fi/strings.xml @@ -335,7 +335,6 @@ Katoaa klo: %s Luo salainen ryhmä aina - Käyttäjäprofiilia ei voi poistaa! Salli kontaktiesi soittaa sinulle. Salli kontaktiesi poistaa lähetetyt viestit peruuttamattomasti. Salli kontaktiesi lähettää ääniviestejä. @@ -1238,8 +1237,6 @@ muutit osoitteeksi %s Yrität kutsua kontaktia, jonka kanssa olet jakanut inkognito-profiilin, ryhmään, jossa käytät pääprofiiliasi Tervetuloviesti - Käyttäjäprofiileja tulee olla vähintään yksi. - Näkyviä käyttäjäprofiileja tulee olla vähintään yksi. Kun jaat inkognitoprofiilin jonkun kanssa, tätä profiilia käytetään ryhmissä, joihin tämä sinut kutsuu. Keskusteluprofiilisi lähetetään ryhmän jäsenille Satunnainen profiilisi diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/fr/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/fr/strings.xml index ad5ab8bb6..88f276cea 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/fr/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/fr/strings.xml @@ -962,7 +962,6 @@ Enregistrer les serveurs ? Ne plus afficher Ajouter un message d\'accueil - Impossible de supprimer le profil d\'utilisateur ! Modération de groupe Cacher Mute en cas d\'inactivité ! @@ -993,8 +992,6 @@ Pour révéler votre profil caché, entrez le mot de passe dans le champ de recherche de la page Profils de chat. Prise en charge du Bluetooth et autres améliorations. Merci aux utilisateurs - contribuez via Weblate ! - Il doit y avoir au moins un profil d\'utilisateur. - Il doit y avoir au moins un profil d\'utilisateur visible. Dévoiler Démute Message d\'accueil diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml index d294dc980..1cc668e79 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml @@ -45,7 +45,6 @@ Mindketten, te is és az ismerősöd is küldhet eltűnő üzeneteket. 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. Téves üzenet hash - Felhasználói profil törlése nem lehetséges! Háttér Tudnivaló: az üzenet- és fájl relay szerverek SOCKS proxy által vannak kapcsolatban. A hívások és URL link előnézetek közvetlen kapcsolatot használnak.]]> App adatmentés @@ -1493,7 +1492,6 @@ A Te adatvédelmedet és biztonságodat védő üzenetküldő és alkalmazásplatform. Érintsd meg a profil aktiválásához. A kézbesítési jelentés le van tiltva %d ismerősödnél - Legalább egy felhasználói profilnak kell lennie. Munkamenet kód Köszönet a felhasználóknak - hozzájárulás a Weblaten! Kis csoportok (max. 20 tag) @@ -1510,7 +1508,6 @@ Fogadás a Kérjük, hogy a jelmondatot biztonságosan tárold, ha elveszíted, NEM fogsz tudni hozzáférni a chathez. A szerepkör \"%s\"-re fog változni. A tag új meghívót kap. - Legalább egy látható felhasználói profilnak kell lennie. profilkép helyőrző A titkosítás működik, és új titkosítási egyezményre nincs szükség. Ez kapcsolati hibákat eredményezhet! Ez a művelet nem vonható vissza - profilod, ismerőseid, üzeneteid és fájljaid visszafordíthatatlanul törlésre kerülnek. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml index 058552e7a..61755d1db 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml @@ -969,8 +969,6 @@ Tocca per attivare il profilo. Svela Rendi privato il profilo! - Deve esserci almeno un profilo utente. - Deve esserci almeno un profilo utente visibile. Puoi nascondere o silenziare un profilo utente - tienilo premuto per il menu. Non mostrare più Silenzioso quando inattivo! @@ -990,7 +988,6 @@ Ora gli amministratori possono: \n- eliminare i messaggi dei membri. \n- disattivare i membri (ruolo \"osservatore\") - Impossibile eliminare il profilo utente! Nascondi il profilo Conferma password Errore nell\'aggiornamento della privacy dell\'utente diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/iw/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/iw/strings.xml index e1657ed6d..1d5a7b690 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/iw/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/iw/strings.xml @@ -112,7 +112,6 @@ שיחה מתמשכת שיחות לא ניתן לגשת ל־Keystore כדי לאחסן את סיסמת מסד הנתונים - לא ניתן למחוק פרופיל משתמש! בוטל %s לפי פרופיל צ׳אט (ברירת מחדל) או לפי חיבור (בביטא). מתקשר… @@ -1055,8 +1054,6 @@ הגדרה זו חלה על הודעות בפרופיל הצ׳אט הנוכחי שלך הניסיון לשנות את סיסמת מסד הנתונים לא הושלם. כותרת - נדרש לפחות פרופיל משתמש אחד. - נדרש לפחות פרופיל משתמש אחד גלוי. הקבוצה מבוזרת לחלוטין - היא גלויה רק לחברי הקבוצה. כדי לשמור על הפרטיות, במקום מזהי משתמש הקיימים בכל הפלטפורמות האחרות, ל־SimpleX יש מזהים לתורי הודעות, נפרדים עבור כל אחד מאנשי הקשר שלך. משתמש בשרתי SimpleX Chatז diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ja/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ja/strings.xml index 938a4b369..d8659e009 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ja/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ja/strings.xml @@ -944,7 +944,6 @@ パスコード入力 認証失敗 パスコードを入力 - ユーザープロフィールが削除できません。 システム ロックモードを変更 中国語とスペイン語UI @@ -1113,8 +1112,6 @@ 送信者がオンラインになるまでの待ち時間がなく、速い! アプリのパスコード システム認証の代わりに設定します。 - 少なくとも1つのユーザープロフィールが表示されている必要があります。 - 少なくとも1つのユーザープロファイルが必要です。 プロフィールを非表示にできます! リレー サーバーは IP アドレスを保護しますが、通話時間は監視されます。 アドレスを連絡先と共有しますか\? diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ko/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ko/strings.xml index b059cc5cc..af3972035 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ko/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ko/strings.xml @@ -111,7 +111,6 @@ 그룹 역할을 바꾸시겠습니까\? 연결 프로필 추가 - 사용자 프로필을 삭제할 수 없습니다! 항상 대화 상대가 허용함 연락처 개별 설정 @@ -826,12 +825,10 @@ 멈추기 %s의 역할을 %s로 변경했어요. 콘솔용 - 적어도 하나의 숨겨지지 않은 사용자 프로필이 있어야 해요. 그룹 설정 지정하기 %s의 주소를 바꿨어요 주소를 바꿨어요 그룹 프로필 업데이트됨 - 적어도 하나의 사용자 프로필이 있어야 해요. 서버 테스트하기 서버 사용하기 새로운 대화에 사용 diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/lt/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/lt/strings.xml index 5d74cac33..951050fe6 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/lt/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/lt/strings.xml @@ -447,8 +447,6 @@ Grupės nariai gali siųsti tiesiogines žinutes. Grupės nariai gali siųsti išnykstančias žinutes. Slėpti programėlės ekraną paskiausių programėlių sąraše. - Turėtų būti bent vienas naudotojo profilis. - Turėtų būti matomas bent vienas naudotojo profilis. Adresatas leidžia Balso žinutės šiame pokalbyje yra uždraustos. Išsiųstos žinutės bus ištrintos po nustatyto laiko. @@ -469,7 +467,6 @@ Prisijungti Keisti SERVERIAI - Nepavyksta ištrinti naudotojo profilio! Išvalyti Nebeslėpti profilio Per daug vaizdo įrašų! diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/nl/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/nl/strings.xml index c5bb1c04f..b3ebcd916 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/nl/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/nl/strings.xml @@ -958,7 +958,6 @@ jij bent waarnemer Systeem Audio en video oproepen - Kan gebruikers profiel niet verwijderen! Bevestig wachtwoord Chinese en Spaanse interface Voer wachtwoord in bij zoeken @@ -990,12 +989,10 @@ Ondersteuning voor bluetooth en andere verbeteringen. Tik om profiel te activeren. Dank aan de gebruikers – draag bij via Weblate! - Er moet ten minste één gebruikers profiel zijn. U kunt een gebruikers profiel verbergen of dempen - houd het vast voor het menu. zichtbaar maken Dempen opheffen Welkomst bericht - "Er moet ten minste één zichtbaar gebruikers profiel zijn." Om uw verborgen profiel te onthullen, voert u een volledig wachtwoord in een zoekveld in op de pagina Uw chat profielen. Welkomst bericht U ontvangt nog steeds oproepen en meldingen van gedempte profielen wanneer deze actief zijn. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/pl/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/pl/strings.xml index 2ad18bdb0..d421f2f10 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/pl/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/pl/strings.xml @@ -743,7 +743,6 @@ W pełni zdecentralizowana – widoczna tylko dla członków. Rola zostanie zmieniona na \"%s\". Członek otrzyma nowe zaproszenie. Wiadomość powitalna - Nie można usunąć profilu użytkownika! Usunąć profil czatu\? Usuń profil czatu dla Nie pokazuj ponownie @@ -997,9 +996,7 @@ Adres kontaktowy SimpleX Zatrzymaj czat, aby wyeksportować, zaimportować lub usunąć bazę danych czatu. Podczas zatrzymania chatu nie będzie można odbierać ani wysyłać wiadomości. Niektóre serwery nie przeszły testu: - Powinien istnieć co najmniej jeden profil użytkownika. Dziękujemy za zainstalowanie SimpleX Chat! - Powinien istnieć co najmniej jeden widoczny profil użytkownika. Wiadomość zostanie oznaczona jako moderowana dla wszystkich członków. Rola zostanie zmieniona na \"%s\". Wszyscy w grupie zostaną powiadomieni. Tego działania nie można cofnąć - wszystkie odebrane i wysłane pliki oraz media zostaną usunięte. Obrazy o niskiej rozdzielczości pozostaną. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/pt-rBR/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/pt-rBR/strings.xml index 769375604..bf7d29c9c 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/pt-rBR/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/pt-rBR/strings.xml @@ -706,7 +706,6 @@ Sem contatos para adicionar A função será alterada para \"%s\". Todos no grupo serão notificados. Mutar - Deve haver pelo menos um perfil de usuário visível. Somente você pode enviar mensagens de voz. Somente seu contato pode enviar mensagens de voz. Proibir a exclusão irreversível de mensagens. @@ -739,9 +738,7 @@ Versão do banco de dados incompatível Remover membro Seu perfil de chat será enviado aos membros do grupo - Não é possível excluir o perfil do usuário! Torne o perfil privado! - Deve haver pelo menos um perfil de usuário. Avaliação de segurança Nomes diferentes, avatares e isolamento de transporte. Com mensagem de boas-vindas opcional. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/pt/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/pt/strings.xml index e755d9aab..438d6832c 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/pt/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/pt/strings.xml @@ -239,7 +239,6 @@ Chamadas no ecrã de bloqueio: Não é possível convidar contatos! Alterar - Não é possível eliminar o perfil do utilizador! cancelado %s Não é possível receber o ficheiro Cancelar pré-visualização da imagem diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ru/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ru/strings.xml index c32d81f73..df0938dbe 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ru/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ru/strings.xml @@ -1044,8 +1044,6 @@ Аудио и видео звонки Ошибка при сохранении пароля пользователя Сохранить серверы\? - Должен быть хотя бы один профиль пользователя. - Должен быть хотя бы один открытый профиль пользователя. Чтобы показать Ваш скрытый профиль, введите пароль в поле поиска на странице Ваши профили. Уведомлять Приветственное сообщение @@ -1054,7 +1052,6 @@ Приветственное сообщение Сохранить сообщение и обновить группу Без звука, когда не активный! - Нельзя удалить профиль пользователя! Введите пароль в поиске! Сохранить пароль профиля Китайский и Испанский интерфейс diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/th/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/th/strings.xml index 3eec7777f..5701c0ca7 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/th/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/th/strings.xml @@ -142,7 +142,6 @@ เปลี่ยนบทบาทกลุ่ม\? ยกเลิกข้อความสด ยกเลิกเรียบร้อยแล้ว %s - ไม่สามารถลบโปรไฟล์ผู้ใช้ได้! ไม่สามารถเชิญผู้ติดต่อได้! เปลี่ยน เปลี่ยนรหัสผ่านฐานข้อมูล\? @@ -1213,8 +1212,6 @@ การอัปเดตการตั้งค่าจะเชื่อมต่อไคลเอนต์กับเซิร์ฟเวอร์ทั้งหมดอีกครั้ง ยกเลิกการซ่อน เปิดเสียง - ควรมีโปรไฟล์ผู้ใช้อย่างน้อยหนึ่งโปรไฟล์ - ควรมีอย่างน้อยหนึ่งโปรไฟล์ผู้ใช้ที่มองเห็นได้ คุณสามารถซ่อนหรือปิดเสียงโปรไฟล์ผู้ใช้ - กดค้างไว้เพื่อที่จะแสดงเมนู เลิกซ่อนโปรไฟล์ คุณอนุญาต diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml index f07430b8e..aa66835ee 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml @@ -114,8 +114,6 @@ Grup profilini kaydet sn Kaydet - There should be at least one visible user profile. - En az bir kullanıcı profili olmalıdır. Gizli mod her farklı kişi için yeni rasgele profil kullanarak gizliliğini korur. Sistem Sistem @@ -753,7 +751,6 @@ Gruba davet edin Kişi davet edilemiyor! Üyeleri davet edin - Kullanıcı profili silinemiyor! Arka plan Bu sohbette geri alınamaz mesaj silme yasaktır. Kişiyi sil\? diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/uk/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/uk/strings.xml index f84360a8e..34ac98e40 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/uk/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/uk/strings.xml @@ -517,7 +517,6 @@ Роль непряме (%1$s) Відглушити - Повинен бути принаймні один профіль користувача. Зробіть профіль приватним! запропоновано %s Чернетка повідомлення @@ -900,7 +899,6 @@ Видалити всі файли Видаляйте повідомлення після Увімкнути автоматичне видалення повідомлень\? - Повинен бути принаймні один видимий профіль користувача. Приховані профілі чату Повідомлення вітання групи Дякуємо користувачам – приєднуйтеся через Weblate! @@ -933,7 +931,6 @@ Група неактивна ви видалили %1$s Торкніться для активації профілю. - Не вдається видалити профіль користувача! Забороняйте надсилання голосових повідомлень. Учасники групи можуть надсилати самознищувальні повідомлення. %d хв diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml index cc0c84c2c..19887d732 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml @@ -978,7 +978,6 @@ 使用密码保护您的聊天资料! 确认密码 更新用户隐私错误 - 无法删除用户资料! 保存用户密码错误 在搜索中输入密码 群组欢迎消息 @@ -990,12 +989,10 @@ 要显示您的隐藏的个人资料,请在您的聊天个人资料页面的搜索字段中输入完整密码。 保存欢迎信息? 点击以激活个人资料。 - 应该至少有一个用户资料。 取消隐藏 设置向新成员显示的消息! 支持蓝牙和其他改进。 感谢用户——通过 Weblate 做出贡献! - 应该至少有一个可见的用户资料。 解除静音 欢迎消息 当静音配置文件处于活动状态时,您仍会收到来自静音配置文件的电话和通知。 diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rTW/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rTW/strings.xml index f5b6e6987..c9d4298bc 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rTW/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rTW/strings.xml @@ -965,7 +965,6 @@ 歡迎訊息 儲存和更新群組配置檔案 儲存歡迎訊息? - 無法刪除個人檔案! 隱藏 將個人資料設為私密! 語音和視訊通話 @@ -991,10 +990,8 @@ 設定向新成員顯示的訊息! 點擊以激活配置檔案。 支援藍牙和其他改進。 - 至少要有一個可見的個人檔案。 歡迎訊息 感謝用戶-透過 Weblate 做出貢獻! - 應該至少有一個個人檔案。 解除靜音 當靜音配置檔案處於活動狀態時,你仍會接收來自靜音配置檔案的通話和通知。 取消隱藏