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
This commit is contained in:
Stanislav Dmitrenko 2024-01-19 00:16:44 +07:00 committed by GitHub
parent ddcd7d495e
commit c4d75366b5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
34 changed files with 110 additions and 177 deletions

View File

@ -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)
}
}

View File

@ -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))
}
}

View File

@ -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) {

View File

@ -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)

View File

@ -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)

View File

@ -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(

View File

@ -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
}

View File

@ -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)
}
}

View File

@ -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) {

View File

@ -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<String>, profileHidden: MutableState<Boolean>) {
fun UserProfilesView(m: ChatModel, search: MutableState<String>, profileHidden: MutableState<Boolean>, 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<String>, 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<String>, 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<User>,
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<User>, delSMPQueues
}
private suspend fun doRemoveUser(m: ChatModel, user: User, users: List<User>, 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())
}

View File

@ -145,7 +145,6 @@
<string name="settings_section_title_calls">المكالمات</string>
<string name="alert_title_cant_invite_contacts">لا يمكن دعوة جهات الاتصال!</string>
<string name="rcv_conn_event_switch_queue_phase_completed">تم تغيير العنوان من أجلك</string>
<string name="cant_delete_user_profile">لا يمكن حذف ملف تعريف المستخدم!</string>
<string name="icon_descr_video_asked_to_receive">طلب لاستلام الفيديو</string>
<string name="callstatus_in_progress">مكالمتك تحت الإجراء</string>
<string name="change_database_passphrase_question">تغيير عبارة مرور قاعدة البيانات؟</string>
@ -1127,7 +1126,6 @@
<string name="database_initialization_error_desc">قاعدة البيانات لا تعمل بشكل صحيح. انقر لمعرفة المزيد</string>
<string name="theme_colors_section_title">ألوان السمة</string>
<string name="tap_to_activate_profile">انقر لتنشيط الملف الشخصي.</string>
<string name="should_be_at_least_one_profile">يجب أن يكون هناك ملف تعريف مستخدم واحد على الأقل.</string>
<string name="v4_5_transport_isolation">عزل النقل</string>
<string name="this_string_is_not_a_connection_link">هذه السلسلة ليست رابط اتصال!</string>
<string name="receipts_section_description">هذه الإعدادات لملف التعريف الحالي الخاص بك</string>
@ -1138,7 +1136,6 @@
<string name="whats_new_thanks_to_users_contribute_weblate">بفضل المستخدمين - المساهمة عبر Weblate!</string>
<string name="database_backup_can_be_restored">لم تكتمل محاولة تغيير عبارة مرور قاعدة البيانات.</string>
<string name="enter_passphrase_notification_desc">لتلقي الإشعارات، يرجى إدخال عبارة مرور قاعدة البيانات</string>
<string name="should_be_at_least_one_visible_profile">يجب أن يكون هناك ملف تعريف مستخدم مرئي واحد على الأقل.</string>
<string name="la_lock_mode_system">مصادقة النظام</string>
<string name="sync_connection_force_desc">يعمل التشفير واتفاقية التشفير الجديدة غير مطلوبة. قد ينتج عن ذلك أخطاء في الاتصال!</string>
<string name="image_decoding_exception_desc">لا يمكن فك ترميز الصورة. من فضلك، جرب صورة مختلفة أو تواصل مع المطورين.</string>

View File

@ -1413,9 +1413,6 @@
<string name="user_unmute">Unmute</string>
<string name="enter_password_to_show">Enter password in search</string>
<string name="tap_to_activate_profile">Tap to activate profile.</string>
<string name="cant_delete_user_profile">Can\'t delete user profile!</string>
<string name="should_be_at_least_one_visible_profile">There should be at least one visible user profile.</string>
<string name="should_be_at_least_one_profile">There should be at least one user profile.</string>
<string name="make_profile_private">Make profile private!</string>
<string name="you_can_hide_or_mute_user_profile">You can hide or mute a user profile - hold it for the menu.</string>
<string name="dont_show_again">Don\'t show again</string>

View File

@ -185,7 +185,6 @@
<string name="change_verb">Промени</string>
<string name="change_member_role_question">Промяна на груповата роля\?</string>
<string name="you_will_still_receive_calls_and_ntfs">Все още ще получавате обаждания и известия от заглушени профили, когато са активни.</string>
<string name="cant_delete_user_profile">Потребителският профил не може да се изтрие!</string>
<string name="allow_disappearing_messages_only_if">Позволи изчезващи съобщения само ако вашият контакт ги разрешава.</string>
<string name="allow_your_contacts_irreversibly_delete">Позволи на вашите контакти да изтриват необратимо изпратените съобщения. (24 часа)</string>
<string name="allow_your_contacts_to_send_disappearing_messages">Позволи на вашите контакти да изпращат изчезващи съобщения.</string>
@ -1165,8 +1164,6 @@
<string name="profile_is_only_shared_with_your_contacts">Профилът се споделя само с вашите контакти.</string>
<string name="delete_files_and_media_desc">Това действие не може да бъде отменено - всички получени и изпратени файлове и медия ще бъдат изтрити. Снимките с ниска разделителна способност ще бъдат запазени.</string>
<string name="tap_to_activate_profile">Докосни за активиране на профил.</string>
<string name="should_be_at_least_one_profile">Трябва да има поне един потребителски профил.</string>
<string name="should_be_at_least_one_visible_profile">Трябва да има поне един видим потребителски профил.</string>
<string name="language_system">Системен</string>
<string name="color_title">Заглавие</string>
<string name="to_share_with_your_contact">(за споделяне с вашия контакт)</string>

View File

@ -960,7 +960,6 @@
<string name="language_system">Systém</string>
<string name="smp_save_servers_question">Uložit servery\?</string>
<string name="dont_show_again">Znovu neukazuj</string>
<string name="cant_delete_user_profile">Nemohu smazat uživatelský profil!</string>
<string name="button_add_welcome_message">Přidat uvítací zprávu</string>
<string name="v4_6_chinese_spanish_interface">Čínské a Španělské rozhranní</string>
<string name="v4_6_audio_video_calls">Hlasové a video hovory</string>
@ -991,12 +990,10 @@
<string name="v4_6_audio_video_calls_descr">Podpora bluetooth a další vylepšení.</string>
<string name="tap_to_activate_profile">Klepnutím aktivujete profil.</string>
<string name="v4_6_chinese_spanish_interface_descr">Díky uživatelům - překládejte prostřednictvím Weblate!</string>
<string name="should_be_at_least_one_profile">Měl by tam být alespoň jeden uživatelský profil.</string>
<string name="button_welcome_message">Uvítací zpráva</string>
<string name="group_welcome_title">Uvítací zpráva</string>
<string name="user_unmute">Zrušit ztlumení</string>
<string name="to_reveal_profile_enter_password">Chcete-li odhalit svůj skrytý profil, zadejte celé heslo do vyhledávacího pole na stránce Chat profily.</string>
<string name="should_be_at_least_one_visible_profile">Měl by tam být alespoň jeden viditelný uživatelský profil.</string>
<string name="you_will_still_receive_calls_and_ntfs">Stále budete přijímat volání a upozornění od umlčených profilů pokud budou aktivní.</string>
<string name="you_can_hide_or_mute_user_profile">Můžete skrýt nebo ztlumit uživatelský profil - Podržte pro menu.</string>
<string name="user_unhide">Odkrýt</string>

View File

@ -1041,7 +1041,6 @@
<string name="moderate_message_will_be_deleted_warning">Diese Nachricht wird für alle Gruppenmitglieder gelöscht.</string>
<string name="language_system">System</string>
<string name="confirm_password">Passwort bestätigen</string>
<string name="cant_delete_user_profile">Das Benutzerprofil kann nicht gelöscht werden!</string>
<string name="dont_show_again">Nicht nochmals anzeigen</string>
<string name="v4_6_chinese_spanish_interface">Chinesische und spanische Bedienoberfläche</string>
<string name="v4_6_audio_video_calls">Audio- und Videoanrufe</string>
@ -1060,8 +1059,6 @@
<string name="make_profile_private">Privates Profil erzeugen!</string>
<string name="user_mute">Stummschalten</string>
<string name="tap_to_activate_profile">Zum Aktivieren des Profils tippen.</string>
<string name="should_be_at_least_one_profile">Es muss mindestens ein Benutzer-Profil vorhanden sein.</string>
<string name="should_be_at_least_one_visible_profile">Es muss mindestens ein sichtbares Benutzer-Profil vorhanden sein.</string>
<string name="user_unmute">Stummschaltung aufheben</string>
<string name="muted_when_inactive">Bei Inaktivität stummgeschaltet!</string>
<string name="v4_6_hidden_chat_profiles_descr">Schützen Sie Ihre Chat-Profile mit einem Passwort!</string>

View File

@ -967,17 +967,14 @@
<string name="error_saving_user_password">Error al guardar contraseña de usuario</string>
<string name="relay_server_if_necessary">El retransmisor sólo se usa en caso de necesidad. Un tercero podría ver tu IP.</string>
<string name="relay_server_protects_ip">El servidor de retransmisión protege tu IP pero puede ver la duración de la llamada.</string>
<string name="cant_delete_user_profile">¡No se puede eliminar el perfil!</string>
<string name="enter_password_to_show">Introduce la contraseña</string>
<string name="user_hide">Ocultar</string>
<string name="user_mute">Silenciar</string>
<string name="save_and_update_group_profile">Guardar y actualizar perfil del grupo</string>
<string name="tap_to_activate_profile">Pulsa sobre un perfil para activarlo.</string>
<string name="should_be_at_least_one_visible_profile">Debe haber al menos un perfil de usuario visible.</string>
<string name="user_unhide">Mostrar</string>
<string name="button_welcome_message">Mensaje de bienvenida</string>
<string name="group_welcome_title">Mensaje de bienvenida</string>
<string name="should_be_at_least_one_profile">Debe haber al menos un perfil de usuario.</string>
<string name="make_profile_private">¡Hacer perfil privado!</string>
<string name="dont_show_again">No mostrar de nuevo</string>
<string name="muted_when_inactive">¡Silenciado cuando está inactivo!</string>

View File

@ -335,7 +335,6 @@
<string name="share_text_disappears_at">Katoaa klo: %s</string>
<string name="create_secret_group_title">Luo salainen ryhmä</string>
<string name="chat_preferences_always">aina</string>
<string name="cant_delete_user_profile">Käyttäjäprofiilia ei voi poistaa!</string>
<string name="allow_your_contacts_to_call">Salli kontaktiesi soittaa sinulle.</string>
<string name="allow_your_contacts_irreversibly_delete">Salli kontaktiesi poistaa lähetetyt viestit peruuttamattomasti.</string>
<string name="allow_your_contacts_to_send_voice_messages">Salli kontaktiesi lähettää ääniviestejä.</string>
@ -1238,8 +1237,6 @@
<string name="snd_conn_event_switch_queue_phase_completed_for_member">muutit osoitteeksi %s</string>
<string name="invite_prohibited_description">Yrität kutsua kontaktia, jonka kanssa olet jakanut inkognito-profiilin, ryhmään, jossa käytät pääprofiiliasi</string>
<string name="group_welcome_title">Tervetuloviesti</string>
<string name="should_be_at_least_one_profile">Käyttäjäprofiileja tulee olla vähintään yksi.</string>
<string name="should_be_at_least_one_visible_profile">Näkyviä käyttäjäprofiileja tulee olla vähintään yksi.</string>
<string name="incognito_info_share">Kun jaat inkognitoprofiilin jonkun kanssa, tätä profiilia käytetään ryhmissä, joihin tämä sinut kutsuu.</string>
<string name="group_main_profile_sent">Keskusteluprofiilisi lähetetään ryhmän jäsenille</string>
<string name="incognito_random_profile">Satunnainen profiilisi</string>

View File

@ -962,7 +962,6 @@
<string name="smp_save_servers_question">Enregistrer les serveurs?</string>
<string name="dont_show_again">Ne plus afficher</string>
<string name="button_add_welcome_message">Ajouter un message d\'accueil</string>
<string name="cant_delete_user_profile">Impossible de supprimer le profil d\'utilisateur !</string>
<string name="v4_6_group_moderation">Modération de groupe</string>
<string name="user_hide">Cacher</string>
<string name="muted_when_inactive">Mute en cas d\'inactivité !</string>
@ -993,8 +992,6 @@
<string name="to_reveal_profile_enter_password">Pour révéler votre profil caché, entrez le mot de passe dans le champ de recherche de la page Profils de chat.</string>
<string name="v4_6_audio_video_calls_descr">Prise en charge du Bluetooth et autres améliorations.</string>
<string name="v4_6_chinese_spanish_interface_descr">Merci aux utilisateurs - contribuez via Weblate !</string>
<string name="should_be_at_least_one_profile">Il doit y avoir au moins un profil d\'utilisateur.</string>
<string name="should_be_at_least_one_visible_profile">Il doit y avoir au moins un profil d\'utilisateur visible.</string>
<string name="user_unhide">Dévoiler</string>
<string name="user_unmute">Démute</string>
<string name="button_welcome_message">Message d\'accueil</string>

View File

@ -45,7 +45,6 @@
<string name="both_you_and_your_contact_can_send_disappearing">Mindketten, te is és az ismerősöd is 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">Téves üzenet hash</string>
<string name="cant_delete_user_profile">Felhasználói profil törlése nem lehetséges!</string>
<string name="color_background">Háttér</string>
<string name="socks_proxy_setting_limitations"><![CDATA[<b>Tudnivaló</b>: 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.]]></string>
<string name="full_backup">App adatmentés</string>
@ -1493,7 +1492,6 @@
<string name="the_messaging_and_app_platform_protecting_your_privacy_and_security">A Te adatvédelmedet és biztonságodat védő üzenetküldő és alkalmazásplatform.</string>
<string name="tap_to_activate_profile">Érintsd meg a profil aktiválásához.</string>
<string name="receipts_contacts_override_disabled">A kézbesítési jelentés le van tiltva %d ismerősödnél</string>
<string name="should_be_at_least_one_profile">Legalább egy felhasználói profilnak kell lennie.</string>
<string name="session_code">Munkamenet kód</string>
<string name="v4_4_french_interface_descr">Köszönet a felhasználóknak - hozzájárulás a Weblaten!</string>
<string name="receipts_section_groups">Kis csoportok (max. 20 tag)</string>
@ -1510,7 +1508,6 @@
<string name="receiving_via">Fogadás a</string>
<string name="store_passphrase_securely_without_recover">Kérjük, hogy a jelmondatot biztonságosan tárold, ha elveszíted, NEM fogsz tudni hozzáférni a chathez.</string>
<string name="member_role_will_be_changed_with_invitation">A szerepkör \"%s\"-re fog változni. A tag új meghívót kap.</string>
<string name="should_be_at_least_one_visible_profile">Legalább egy látható felhasználói profilnak kell lennie.</string>
<string name="icon_descr_profile_image_placeholder">profilkép helyőrző</string>
<string name="sync_connection_force_desc">A titkosítás működik, és új titkosítási egyezményre nincs szükség. Ez kapcsolati hibákat eredményezhet!</string>
<string name="delete_chat_profile_action_cannot_be_undone_warning">Ez a művelet nem vonható vissza - profilod, ismerőseid, üzeneteid és fájljaid visszafordíthatatlanul törlésre kerülnek.</string>

View File

@ -969,8 +969,6 @@
<string name="tap_to_activate_profile">Tocca per attivare il profilo.</string>
<string name="user_unhide">Svela</string>
<string name="make_profile_private">Rendi privato il profilo!</string>
<string name="should_be_at_least_one_profile">Deve esserci almeno un profilo utente.</string>
<string name="should_be_at_least_one_visible_profile">Deve esserci almeno un profilo utente visibile.</string>
<string name="you_can_hide_or_mute_user_profile">Puoi nascondere o silenziare un profilo utente - tienilo premuto per il menu.</string>
<string name="dont_show_again">Non mostrare più</string>
<string name="muted_when_inactive">Silenzioso quando inattivo!</string>
@ -990,7 +988,6 @@
<string name="v4_6_group_moderation_descr">Ora gli amministratori possono:
\n- eliminare i messaggi dei membri.
\n- disattivare i membri (ruolo \"osservatore\")</string>
<string name="cant_delete_user_profile">Impossibile eliminare il profilo utente!</string>
<string name="hide_profile">Nascondi il profilo</string>
<string name="confirm_password">Conferma password</string>
<string name="error_updating_user_privacy">Errore nell\'aggiornamento della privacy dell\'utente</string>

View File

@ -112,7 +112,6 @@
<string name="icon_descr_call_progress">שיחה מתמשכת</string>
<string name="settings_section_title_calls">שיחות</string>
<string name="cannot_access_keychain">לא ניתן לגשת ל־Keystore כדי לאחסן את סיסמת מסד הנתונים</string>
<string name="cant_delete_user_profile">לא ניתן למחוק פרופיל משתמש!</string>
<string name="feature_cancelled_item">בוטל %s</string>
<string name="v4_5_transport_isolation_descr">לפי פרופיל צ׳אט (ברירת מחדל) או לפי חיבור (בביטא).</string>
<string name="callstatus_calling">מתקשר…</string>
@ -1055,8 +1054,6 @@
<string name="messages_section_description">הגדרה זו חלה על הודעות בפרופיל הצ׳אט הנוכחי שלך</string>
<string name="database_backup_can_be_restored">הניסיון לשנות את סיסמת מסד הנתונים לא הושלם.</string>
<string name="color_title">כותרת</string>
<string name="should_be_at_least_one_profile">נדרש לפחות פרופיל משתמש אחד.</string>
<string name="should_be_at_least_one_visible_profile">נדרש לפחות פרופיל משתמש אחד גלוי.</string>
<string name="group_is_decentralized">הקבוצה מבוזרת לחלוטין - היא גלויה רק לחברי הקבוצה.</string>
<string name="to_protect_privacy_simplex_has_ids_for_queues">כדי לשמור על הפרטיות, במקום מזהי משתמש הקיימים בכל הפלטפורמות האחרות, ל־SimpleX יש מזהים לתורי הודעות, נפרדים עבור כל אחד מאנשי הקשר שלך.</string>
<string name="using_simplex_chat_servers">משתמש בשרתי SimpleX Chatז</string>

View File

@ -944,7 +944,6 @@
<string name="la_lock_mode_passcode">パスコード入力</string>
<string name="la_auth_failed">認証失敗</string>
<string name="la_enter_app_passcode">パスコードを入力</string>
<string name="cant_delete_user_profile">ユーザープロフィールが削除できません。</string>
<string name="la_mode_system">システム</string>
<string name="change_lock_mode">ロックモードを変更</string>
<string name="v4_6_chinese_spanish_interface">中国語とスペイン語UI</string>
@ -1113,8 +1112,6 @@
<string name="v5_0_large_files_support_descr">送信者がオンラインになるまでの待ち時間がなく、速い!</string>
<string name="v5_0_app_passcode">アプリのパスコード</string>
<string name="v5_0_app_passcode_descr">システム認証の代わりに設定します。</string>
<string name="should_be_at_least_one_visible_profile">少なくとも1つのユーザープロフィールが表示されている必要があります。</string>
<string name="should_be_at_least_one_profile">少なくとも1つのユーザープロファイルが必要です。</string>
<string name="make_profile_private">プロフィールを非表示にできます!</string>
<string name="relay_server_protects_ip">リレー サーバーは IP アドレスを保護しますが、通話時間は監視されます。</string>
<string name="share_address_with_contacts_question">アドレスを連絡先と共有しますか\?</string>

View File

@ -111,7 +111,6 @@
<string name="change_member_role_question">그룹 역할을 바꾸시겠습니까\?</string>
<string name="info_row_connection">연결</string>
<string name="users_add">프로필 추가</string>
<string name="cant_delete_user_profile">사용자 프로필을 삭제할 수 없습니다!</string>
<string name="chat_preferences_always">항상</string>
<string name="chat_preferences_contact_allows">대화 상대가 허용함</string>
<string name="contact_preferences">연락처 개별 설정</string>
@ -826,12 +825,10 @@
<string name="stop_chat_confirmation">멈추기</string>
<string name="snd_group_event_changed_member_role">%s의 역할을 %s로 변경했어요.</string>
<string name="section_title_for_console">콘솔용</string>
<string name="should_be_at_least_one_visible_profile">적어도 하나의 숨겨지지 않은 사용자 프로필이 있어야 해요.</string>
<string name="set_group_preferences">그룹 설정 지정하기</string>
<string name="snd_conn_event_switch_queue_phase_completed_for_member">%s의 주소를 바꿨어요</string>
<string name="snd_conn_event_switch_queue_phase_completed">주소를 바꿨어요</string>
<string name="snd_group_event_group_profile_updated">그룹 프로필 업데이트됨</string>
<string name="should_be_at_least_one_profile">적어도 하나의 사용자 프로필이 있어야 해요.</string>
<string name="smp_servers_test_server">서버 테스트하기</string>
<string name="smp_servers_use_server">서버 사용하기</string>
<string name="smp_servers_use_server_for_new_conn">새로운 대화에 사용</string>

View File

@ -447,8 +447,6 @@
<string name="group_members_can_send_dms">Grupės nariai gali siųsti tiesiogines žinutes.</string>
<string name="group_members_can_send_disappearing">Grupės nariai gali siųsti išnykstančias žinutes.</string>
<string name="v4_3_improved_privacy_and_security_desc">Slėpti programėlės ekraną paskiausių programėlių sąraše.</string>
<string name="should_be_at_least_one_profile">Turėtų būti bent vienas naudotojo profilis.</string>
<string name="should_be_at_least_one_visible_profile">Turėtų būti matomas bent vienas naudotojo profilis.</string>
<string name="chat_preferences_contact_allows">Adresatas leidžia</string>
<string name="voice_prohibited_in_this_chat">Balso žinutės šiame pokalbyje yra uždraustos.</string>
<string name="v4_4_disappearing_messages_desc">Išsiųstos žinutės bus ištrintos po nustatyto laiko.</string>
@ -469,7 +467,6 @@
<string name="join_group_button">Prisijungti</string>
<string name="change_verb">Keisti</string>
<string name="conn_stats_section_title_servers">SERVERIAI</string>
<string name="cant_delete_user_profile">Nepavyksta ištrinti naudotojo profilio!</string>
<string name="clear_chat_menu_action">Išvalyti</string>
<string name="unhide_profile">Nebeslėpti profilio</string>
<string name="videos_limit_title">Per daug vaizdo įrašų!</string>

View File

@ -958,7 +958,6 @@
<string name="you_are_observer">jij bent waarnemer</string>
<string name="language_system">Systeem</string>
<string name="v4_6_audio_video_calls">Audio en video oproepen</string>
<string name="cant_delete_user_profile">Kan gebruikers profiel niet verwijderen!</string>
<string name="confirm_password">Bevestig wachtwoord</string>
<string name="v4_6_chinese_spanish_interface">Chinese en Spaanse interface</string>
<string name="enter_password_to_show">Voer wachtwoord in bij zoeken</string>
@ -990,12 +989,10 @@
<string name="v4_6_audio_video_calls_descr">Ondersteuning voor bluetooth en andere verbeteringen.</string>
<string name="tap_to_activate_profile">Tik om profiel te activeren.</string>
<string name="v4_6_chinese_spanish_interface_descr">Dank aan de gebruikers draag bij via Weblate!</string>
<string name="should_be_at_least_one_profile">Er moet ten minste één gebruikers profiel zijn.</string>
<string name="you_can_hide_or_mute_user_profile">U kunt een gebruikers profiel verbergen of dempen - houd het vast voor het menu.</string>
<string name="user_unhide">zichtbaar maken</string>
<string name="user_unmute">Dempen opheffen</string>
<string name="group_welcome_title">Welkomst bericht</string>
<string name="should_be_at_least_one_visible_profile">"Er moet ten minste één zichtbaar gebruikers profiel zijn."</string>
<string name="to_reveal_profile_enter_password">Om uw verborgen profiel te onthullen, voert u een volledig wachtwoord in een zoekveld in op de pagina Uw chat profielen.</string>
<string name="button_welcome_message">Welkomst bericht</string>
<string name="you_will_still_receive_calls_and_ntfs">U ontvangt nog steeds oproepen en meldingen van gedempte profielen wanneer deze actief zijn.</string>

View File

@ -743,7 +743,6 @@
<string name="group_is_decentralized">W pełni zdecentralizowana widoczna tylko dla członków.</string>
<string name="member_role_will_be_changed_with_invitation">Rola zostanie zmieniona na \"%s\". Członek otrzyma nowe zaproszenie.</string>
<string name="group_welcome_title">Wiadomość powitalna</string>
<string name="cant_delete_user_profile">Nie można usunąć profilu użytkownika!</string>
<string name="users_delete_question">Usunąć profil czatu\?</string>
<string name="users_delete_profile_for">Usuń profil czatu dla</string>
<string name="dont_show_again">Nie pokazuj ponownie</string>
@ -997,9 +996,7 @@
<string name="simplex_link_contact">Adres kontaktowy SimpleX</string>
<string name="stop_chat_to_export_import_or_delete_chat_database">Zatrzymaj czat, aby wyeksportować, zaimportować lub usunąć bazę danych czatu. Podczas zatrzymania chatu nie będzie można odbierać ani wysyłać wiadomości.</string>
<string name="smp_servers_test_some_failed">Niektóre serwery nie przeszły testu:</string>
<string name="should_be_at_least_one_profile">Powinien istnieć co najmniej jeden profil użytkownika.</string>
<string name="thank_you_for_installing_simplex">Dziękujemy za zainstalowanie SimpleX Chat!</string>
<string name="should_be_at_least_one_visible_profile">Powinien istnieć co najmniej jeden widoczny profil użytkownika.</string>
<string name="moderate_message_will_be_marked_warning">Wiadomość zostanie oznaczona jako moderowana dla wszystkich członków.</string>
<string name="member_role_will_be_changed_with_notification">Rola zostanie zmieniona na \"%s\". Wszyscy w grupie zostaną powiadomieni.</string>
<string name="delete_files_and_media_desc">Tego działania nie można cofnąć - wszystkie odebrane i wysłane pliki oraz media zostaną usunięte. Obrazy o niskiej rozdzielczości pozostaną.</string>

View File

@ -706,7 +706,6 @@
<string name="no_contacts_to_add">Sem contatos para adicionar</string>
<string name="member_role_will_be_changed_with_notification">A função será alterada para \"%s\". Todos no grupo serão notificados.</string>
<string name="user_mute">Mutar</string>
<string name="should_be_at_least_one_visible_profile">Deve haver pelo menos um perfil de usuário visível.</string>
<string name="only_you_can_send_voice">Somente você pode enviar mensagens de voz.</string>
<string name="only_your_contact_can_send_voice">Somente seu contato pode enviar mensagens de voz.</string>
<string name="prohibit_message_deletion">Proibir a exclusão irreversível de mensagens.</string>
@ -739,9 +738,7 @@
<string name="incompatible_database_version">Versão do banco de dados incompatível</string>
<string name="button_remove_member">Remover membro</string>
<string name="group_main_profile_sent">Seu perfil de chat será enviado aos membros do grupo</string>
<string name="cant_delete_user_profile">Não é possível excluir o perfil do usuário!</string>
<string name="make_profile_private">Torne o perfil privado!</string>
<string name="should_be_at_least_one_profile">Deve haver pelo menos um perfil de usuário.</string>
<string name="v4_2_security_assessment">Avaliação de segurança</string>
<string name="v4_5_multiple_chat_profiles_descr">Nomes diferentes, avatares e isolamento de transporte.</string>
<string name="v4_2_auto_accept_contact_requests_desc">Com mensagem de boas-vindas opcional.</string>

View File

@ -239,7 +239,6 @@
<string name="call_on_lock_screen">Chamadas no ecrã de bloqueio:</string>
<string name="alert_title_cant_invite_contacts">Não é possível convidar contatos!</string>
<string name="change_verb">Alterar</string>
<string name="cant_delete_user_profile">Não é possível eliminar o perfil do utilizador!</string>
<string name="feature_cancelled_item">cancelado %s</string>
<string name="cannot_receive_file">Não é possível receber o ficheiro</string>
<string name="icon_descr_cancel_image_preview">Cancelar pré-visualização da imagem</string>

View File

@ -1044,8 +1044,6 @@
<string name="v4_6_audio_video_calls">Аудио и видео звонки</string>
<string name="error_saving_user_password">Ошибка при сохранении пароля пользователя</string>
<string name="smp_save_servers_question">Сохранить серверы\?</string>
<string name="should_be_at_least_one_profile">Должен быть хотя бы один профиль пользователя.</string>
<string name="should_be_at_least_one_visible_profile">Должен быть хотя бы один открытый профиль пользователя.</string>
<string name="to_reveal_profile_enter_password">Чтобы показать Ваш скрытый профиль, введите пароль в поле поиска на странице Ваши профили.</string>
<string name="user_unmute">Уведомлять</string>
<string name="group_welcome_title">Приветственное сообщение</string>
@ -1054,7 +1052,6 @@
<string name="button_welcome_message">Приветственное сообщение</string>
<string name="save_and_update_group_profile">Сохранить сообщение и обновить группу</string>
<string name="muted_when_inactive">Без звука, когда не активный!</string>
<string name="cant_delete_user_profile">Нельзя удалить профиль пользователя!</string>
<string name="enter_password_to_show">Введите пароль в поиске!</string>
<string name="save_profile_password">Сохранить пароль профиля</string>
<string name="v4_6_chinese_spanish_interface">Китайский и Испанский интерфейс</string>

View File

@ -142,7 +142,6 @@
<string name="change_member_role_question">เปลี่ยนบทบาทกลุ่ม\?</string>
<string name="icon_descr_cancel_live_message">ยกเลิกข้อความสด</string>
<string name="feature_cancelled_item">ยกเลิกเรียบร้อยแล้ว %s</string>
<string name="cant_delete_user_profile">ไม่สามารถลบโปรไฟล์ผู้ใช้ได้!</string>
<string name="alert_title_cant_invite_contacts">ไม่สามารถเชิญผู้ติดต่อได้!</string>
<string name="change_verb">เปลี่ยน</string>
<string name="change_database_passphrase_question">เปลี่ยนรหัสผ่านฐานข้อมูล\?</string>
@ -1213,8 +1212,6 @@
<string name="updating_settings_will_reconnect_client_to_all_servers">การอัปเดตการตั้งค่าจะเชื่อมต่อไคลเอนต์กับเซิร์ฟเวอร์ทั้งหมดอีกครั้ง</string>
<string name="user_unhide">ยกเลิกการซ่อน</string>
<string name="user_unmute">เปิดเสียง</string>
<string name="should_be_at_least_one_profile">ควรมีโปรไฟล์ผู้ใช้อย่างน้อยหนึ่งโปรไฟล์</string>
<string name="should_be_at_least_one_visible_profile">ควรมีอย่างน้อยหนึ่งโปรไฟล์ผู้ใช้ที่มองเห็นได้</string>
<string name="you_can_hide_or_mute_user_profile">คุณสามารถซ่อนหรือปิดเสียงโปรไฟล์ผู้ใช้ - กดค้างไว้เพื่อที่จะแสดงเมนู</string>
<string name="unhide_profile">เลิกซ่อนโปรไฟล์</string>
<string name="chat_preferences_you_allow">คุณอนุญาต</string>

View File

@ -114,8 +114,6 @@
<string name="save_group_profile">Grup profilini kaydet</string>
<string name="network_option_seconds_label">sn</string>
<string name="network_options_save">Kaydet</string>
<string name="should_be_at_least_one_visible_profile">There should be at least one visible user profile.</string>
<string name="should_be_at_least_one_profile">En az bir kullanıcı profili olmalıdır.</string>
<string name="incognito_info_protects">Gizli mod her farklı kişi için yeni rasgele profil kullanarak gizliliğini korur.</string>
<string name="theme_system">Sistem</string>
<string name="language_system">Sistem</string>
@ -753,7 +751,6 @@
<string name="invite_to_group_button">Gruba davet edin</string>
<string name="invite_prohibited">Kişi davet edilemiyor!</string>
<string name="button_add_members">Üyeleri davet edin</string>
<string name="cant_delete_user_profile">Kullanıcı profili silinemiyor!</string>
<string name="color_background">Arka plan</string>
<string name="message_deletion_prohibited">Bu sohbette geri alınamaz mesaj silme yasaktır.</string>
<string name="delete_contact_question">Kişiyi sil\?</string>

View File

@ -517,7 +517,6 @@
<string name="role_in_group">Роль</string>
<string name="conn_level_desc_indirect">непряме (%1$s)</string>
<string name="user_unmute">Відглушити</string>
<string name="should_be_at_least_one_profile">Повинен бути принаймні один профіль користувача.</string>
<string name="make_profile_private">Зробіть профіль приватним!</string>
<string name="feature_offered_item">запропоновано %s</string>
<string name="v4_5_message_draft">Чернетка повідомлення</string>
@ -900,7 +899,6 @@
<string name="delete_files_and_media_all">Видалити всі файли</string>
<string name="delete_messages_after">Видаляйте повідомлення після</string>
<string name="enable_automatic_deletion_question">Увімкнути автоматичне видалення повідомлень\?</string>
<string name="should_be_at_least_one_visible_profile">Повинен бути принаймні один видимий профіль користувача.</string>
<string name="v4_6_hidden_chat_profiles">Приховані профілі чату</string>
<string name="v4_6_group_welcome_message">Повідомлення вітання групи</string>
<string name="v4_6_chinese_spanish_interface_descr">Дякуємо користувачам приєднуйтеся через Weblate!</string>
@ -933,7 +931,6 @@
<string name="icon_descr_group_inactive">Група неактивна</string>
<string name="snd_group_event_member_deleted">ви видалили %1$s</string>
<string name="tap_to_activate_profile">Торкніться для активації профілю.</string>
<string name="cant_delete_user_profile">Не вдається видалити профіль користувача!</string>
<string name="prohibit_sending_voice">Забороняйте надсилання голосових повідомлень.</string>
<string name="group_members_can_send_disappearing">Учасники групи можуть надсилати самознищувальні повідомлення.</string>
<string name="ttl_min">%d хв</string>

View File

@ -978,7 +978,6 @@
<string name="v4_6_hidden_chat_profiles_descr">使用密码保护您的聊天资料!</string>
<string name="confirm_password">确认密码</string>
<string name="error_updating_user_privacy">更新用户隐私错误</string>
<string name="cant_delete_user_profile">无法删除用户资料!</string>
<string name="error_saving_user_password">保存用户密码错误</string>
<string name="enter_password_to_show">在搜索中输入密码</string>
<string name="v4_6_group_welcome_message">群组欢迎消息</string>
@ -990,12 +989,10 @@
<string name="to_reveal_profile_enter_password">要显示您的隐藏的个人资料,请在您的聊天个人资料页面的搜索字段中输入完整密码。</string>
<string name="save_welcome_message_question">保存欢迎信息?</string>
<string name="tap_to_activate_profile">点击以激活个人资料。</string>
<string name="should_be_at_least_one_profile">应该至少有一个用户资料。</string>
<string name="user_unhide">取消隐藏</string>
<string name="v4_6_group_welcome_message_descr">设置向新成员显示的消息!</string>
<string name="v4_6_audio_video_calls_descr">支持蓝牙和其他改进。</string>
<string name="v4_6_chinese_spanish_interface_descr">感谢用户——通过 Weblate 做出贡献!</string>
<string name="should_be_at_least_one_visible_profile">应该至少有一个可见的用户资料。</string>
<string name="user_unmute">解除静音</string>
<string name="button_welcome_message">欢迎消息</string>
<string name="you_will_still_receive_calls_and_ntfs">当静音配置文件处于活动状态时,您仍会收到来自静音配置文件的电话和通知。</string>

View File

@ -965,7 +965,6 @@
<string name="button_welcome_message">歡迎訊息</string>
<string name="save_and_update_group_profile">儲存和更新群組配置檔案</string>
<string name="save_welcome_message_question">儲存歡迎訊息?</string>
<string name="cant_delete_user_profile">無法刪除個人檔案!</string>
<string name="user_hide">隱藏</string>
<string name="make_profile_private">將個人資料設為私密!</string>
<string name="v4_6_audio_video_calls">語音和視訊通話</string>
@ -991,10 +990,8 @@
<string name="v4_6_group_welcome_message_descr">設定向新成員顯示的訊息!</string>
<string name="tap_to_activate_profile">點擊以激活配置檔案。</string>
<string name="v4_6_audio_video_calls_descr">支援藍牙和其他改進。</string>
<string name="should_be_at_least_one_visible_profile">至少要有一個可見的個人檔案。</string>
<string name="group_welcome_title">歡迎訊息</string>
<string name="v4_6_chinese_spanish_interface_descr">感謝用戶-透過 Weblate 做出貢獻!</string>
<string name="should_be_at_least_one_profile">應該至少有一個個人檔案。</string>
<string name="user_unmute">解除靜音</string>
<string name="you_will_still_receive_calls_and_ntfs">當靜音配置檔案處於活動狀態時,你仍會接收來自靜音配置檔案的通話和通知。</string>
<string name="user_unhide">取消隱藏</string>