Add proper localization for space room removal UI

This commit is contained in:
ganfra
2026-01-15 12:14:08 +01:00
parent d4e676fd5a
commit 834a4ae2a7
44 changed files with 77 additions and 63 deletions

View File

@@ -216,6 +216,7 @@ class SpacePresenter(
}
}
return SpaceState(
currentSpaceId = spaceRoomList.roomId,
currentSpace = currentSpace.getOrNull(),
children = filteredChildren,
seenSpaceInvites = seenSpaceInvites,

View File

@@ -18,6 +18,7 @@ import kotlinx.collections.immutable.ImmutableMap
import kotlinx.collections.immutable.ImmutableSet
data class SpaceState(
private val currentSpaceId: RoomId,
val currentSpace: SpaceRoom?,
val children: ImmutableList<SpaceRoom>,
val seenSpaceInvites: ImmutableSet<RoomId>,
@@ -35,10 +36,12 @@ data class SpaceState(
) {
fun isJoining(spaceId: RoomId): Boolean = joinActions[spaceId] == AsyncAction.Loading
fun isSelected(spaceId: RoomId): Boolean = selectedRoomIds.contains(spaceId)
val hasAnyFailure: Boolean = joinActions.values.any {
val hasAnyJoinFailures: Boolean = joinActions.values.any {
it is AsyncAction.Failure
}
val currentSpaceDisplayName = currentSpace?.displayName ?: currentSpaceId.value
val showManageRoomsAction: Boolean = canManageRooms && children.any { spaceRoom -> !spaceRoom.isSpace }
val selectedCount: Int = selectedRoomIds.size
val isRemoveButtonEnabled: Boolean = selectedRoomIds.isNotEmpty()

View File

@@ -63,7 +63,7 @@ open class SpaceStateProvider : PreviewParameterProvider<SpaceState> {
}
fun aSpaceState(
parentSpace: SpaceRoom? = aParentSpace(),
parentSpace: SpaceRoom = aParentSpace(),
children: List<SpaceRoom> = emptyList(),
seenSpaceInvites: Set<RoomId> = emptySet(),
joiningRooms: Set<RoomId> = emptySet(),
@@ -79,6 +79,7 @@ fun aSpaceState(
removeRoomsAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
eventSink: (SpaceEvents) -> Unit = { },
) = SpaceState(
currentSpaceId = parentSpace.roomId,
currentSpace = parentSpace,
children = children.toImmutableList(),
seenSpaceInvites = seenSpaceInvites.toImmutableSet(),

View File

@@ -15,8 +15,6 @@ import androidx.compose.animation.expandVertically
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.shrinkVertically
import androidx.compose.animation.slideIn
import androidx.compose.animation.veilOut
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Box
@@ -40,6 +38,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.heading
import androidx.compose.ui.semantics.semantics
@@ -49,6 +48,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.features.space.impl.R
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.designsystem.atomic.molecules.InviteButtonsRowMolecule
import io.element.android.libraries.designsystem.components.ClickableLinkText
@@ -82,6 +82,7 @@ import io.element.android.libraries.matrix.ui.components.JoinButton
import io.element.android.libraries.matrix.ui.components.SpaceHeaderView
import io.element.android.libraries.matrix.ui.components.SpaceRoomItemView
import io.element.android.libraries.matrix.ui.model.getAvatarData
import io.element.android.libraries.ui.strings.CommonPlurals
import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.delay
@@ -160,10 +161,17 @@ fun SpaceView(
state.eventSink(SpaceEvents.ShowTopicViewer(topic))
}
)
JoinRoomFailureEffect(
hasAnyFailure = state.hasAnyFailure,
JoinFailuresEffect(
hasAnyFailure = state.hasAnyJoinFailures,
eventSink = state.eventSink
)
RemoveRoomsActionView(
spaceDisplayName = state.currentSpaceDisplayName,
removeRoomsAction = state.removeRoomsAction,
selectedCount = state.selectedCount,
onConfirm = { state.eventSink(SpaceEvents.ConfirmRoomRemoval) },
onDismiss = { state.eventSink(SpaceEvents.ClearRemoveAction) },
)
acceptDeclineInviteView()
}
},
@@ -176,18 +184,10 @@ fun SpaceView(
}
)
}
// Confirmation dialog for removing rooms
RemoveRoomsConfirmationDialog(
removeRoomsAction = state.removeRoomsAction,
selectedCount = state.selectedCount,
onConfirm = { state.eventSink(SpaceEvents.ConfirmRoomRemoval) },
onDismiss = { state.eventSink(SpaceEvents.ClearRemoveAction) },
)
}
@Composable
private fun JoinRoomFailureEffect(
private fun JoinFailuresEffect(
hasAnyFailure: Boolean,
eventSink: (SpaceEvents) -> Unit,
) {
@@ -380,7 +380,7 @@ private fun SpaceViewTopBar(
onDismissRequest = { showMenu = false }
) {
SpaceMenuItem(
titleRes = CommonStrings.screen_space_menu_action_members,
titleRes = R.string.screen_space_menu_action_members,
icon = CompoundIcons.User(),
onClick = {
showMenu = false
@@ -448,7 +448,7 @@ private fun ManageModeTopBar(
},
title = {
Text(
text = "$selectedCount selected",
text = pluralStringResource(CommonPlurals.common_selected_count, selectedCount, selectedCount),
style = ElementTheme.typography.fontBodyLgMedium,
)
},
@@ -551,17 +551,19 @@ private fun SpaceRoom.inviteButtons(
}
@Composable
private fun RemoveRoomsConfirmationDialog(
private fun RemoveRoomsActionView(
spaceDisplayName: String,
removeRoomsAction: AsyncAction<Unit>,
selectedCount: Int,
onConfirm: () -> Unit,
onDismiss: () -> Unit,
) {
when (removeRoomsAction) {
AsyncAction.ConfirmingNoParams -> {
AsyncActionView(
async = removeRoomsAction,
confirmationDialog = {
ConfirmationDialog(
title = "Remove $selectedCount rooms from space?",
content = "Removing a room will not affect the room access. To change the access go to Room info > Privacy & security.",
title = pluralStringResource(R.plurals.screen_space_remove_rooms_confirmation_title, selectedCount, selectedCount, spaceDisplayName),
content = stringResource(R.string.screen_space_remove_rooms_confirmation_content),
submitText = stringResource(CommonStrings.action_remove),
onSubmitClick = onConfirm,
onDismiss = onDismiss,
@@ -574,15 +576,17 @@ private fun RemoveRoomsConfirmationDialog(
)
}
)
}
else -> {
AsyncActionView(
async = removeRoomsAction,
onSuccess = { onDismiss() },
onErrorDismiss = onDismiss,
)
}
}
},
onRetry = onConfirm,
errorTitle = {
stringResource(CommonStrings.common_something_went_wrong)
},
errorMessage = {
stringResource(CommonStrings.error_network_or_server_issue)
},
onSuccess = { onDismiss() },
onErrorDismiss = onDismiss,
)
}
@PreviewsDayNight

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_space_menu_action_members">"Преглед на членовете"</string>
<string name="screen_space_settings_leave_space">"Напускане на пространството"</string>
<string name="screen_space_settings_roles_and_permissions">"Роли и разрешения"</string>
<string name="screen_space_settings_security_and_privacy">"Защита и поверителност"</string>

View File

@@ -11,6 +11,7 @@
<string name="screen_leave_space_subtitle_only_last_admin">"Z následujících místností nebudete odstraněni, protože jste jediným administrátorem:"</string>
<string name="screen_leave_space_title">"Opustit %1$s?"</string>
<string name="screen_leave_space_title_last_admin">"Jste jediným administrátorem pro %1$s"</string>
<string name="screen_space_menu_action_members">"Zobrazit členy"</string>
<string name="screen_space_settings_leave_space">"Opustit prostor"</string>
<string name="screen_space_settings_roles_and_permissions">"Role a oprávnění"</string>
<string name="screen_space_settings_security_and_privacy">"Zabezpečení a soukromí"</string>

View File

@@ -10,6 +10,7 @@
<string name="screen_leave_space_subtitle_only_last_admin">"Du vil ikke blive fjernet fra følgende rum, fordi du er den eneste administrator:"</string>
<string name="screen_leave_space_title">"Forlad %1$s?"</string>
<string name="screen_leave_space_title_last_admin">"Du er den eneste administrator for %1$s"</string>
<string name="screen_space_menu_action_members">"Vis medlemmer"</string>
<string name="screen_space_settings_leave_space">"Forlad gruppe"</string>
<string name="screen_space_settings_roles_and_permissions">"Roller og tilladelser"</string>
<string name="screen_space_settings_security_and_privacy">"Sikkerhed og privatliv"</string>

View File

@@ -10,6 +10,12 @@
<string name="screen_leave_space_subtitle_only_last_admin">"Du wirst aus den folgenden Chats nicht entfernt, weil du der einzige Admin bist:"</string>
<string name="screen_leave_space_title">"%1$s verlassen?"</string>
<string name="screen_leave_space_title_last_admin">"Du bist der einzige Administrator für %1$s"</string>
<string name="screen_space_menu_action_members">"Mitglieder anzeigen"</string>
<string name="screen_space_remove_rooms_confirmation_content">"Das Entfernen eines Chats hat keinen Einfluss auf die Beitrittsregeln. Um die Regeln zu ändern, gehe zu \"Raum Info\" und dann zu \"Datenschutz und Sicherheit\""</string>
<plurals name="screen_space_remove_rooms_confirmation_title">
<item quantity="one">"%1$d chat aus %2$s entfernen"</item>
<item quantity="other">"%1$d chats aus %2$s entfernen"</item>
</plurals>
<string name="screen_space_settings_leave_space">"Space verlassen"</string>
<string name="screen_space_settings_roles_and_permissions">"Rollen und Berechtigungen"</string>
<string name="screen_space_settings_security_and_privacy">"Sicherheit &amp; Datenschutz"</string>

View File

@@ -10,6 +10,7 @@
<string name="screen_leave_space_subtitle_only_last_admin">"Sind ei saa järgnevatest jututubadest eemaldada, kuna oled seal/neis ainus peakasutaja:"</string>
<string name="screen_leave_space_title">"Kas lahkud %1$s kogukonnast?"</string>
<string name="screen_leave_space_title_last_admin">"Sa oled siin ainus peakasutaja: %1$s"</string>
<string name="screen_space_menu_action_members">"Vaata liikmeid"</string>
<string name="screen_space_settings_leave_space">"Lahku kogukonnast"</string>
<string name="screen_space_settings_roles_and_permissions">"Rollid ja õigused"</string>
<string name="screen_space_settings_security_and_privacy">"Turvalisus ja privaatsus"</string>

View File

@@ -5,6 +5,7 @@
<string name="screen_leave_space_subtitle_only_last_admin">"از اتاق(های) زیر برداشته نخواهید شد؛ چرا که تنها مدیر هستید:"</string>
<string name="screen_leave_space_title">"ترک %1$s؟"</string>
<string name="screen_leave_space_title_last_admin">"تنها مدیر %1$s هستید"</string>
<string name="screen_space_menu_action_members">"دیدن اعضا"</string>
<string name="screen_space_settings_leave_space">"ترک فضا"</string>
<string name="screen_space_settings_roles_and_permissions">"نقش‌ها و اجازه‌ها"</string>
<string name="screen_space_settings_security_and_privacy">"امنیت و محرمانگی"</string>

View File

@@ -10,6 +10,7 @@
<string name="screen_leave_space_subtitle_only_last_admin">"Sinua ei poisteta seuraavista huoneista, koska olet ainoa ylläpitäjä:"</string>
<string name="screen_leave_space_title">"Haluatko poistua tilasta %1$s?"</string>
<string name="screen_leave_space_title_last_admin">"Olet ainoa ylläpitäjä tilassa %1$s"</string>
<string name="screen_space_menu_action_members">"Näytä jäsenet"</string>
<string name="screen_space_settings_leave_space">"Poistu tilasta"</string>
<string name="screen_space_settings_roles_and_permissions">"Roolit ja oikeudet"</string>
<string name="screen_space_settings_security_and_privacy">"Turvallisuus ja yksityisyys"</string>

View File

@@ -10,6 +10,7 @@
<string name="screen_leave_space_subtitle_only_last_admin">"Vous ne quitterez pas le ou les salons suivants car vous y êtes le seul administrateur:"</string>
<string name="screen_leave_space_title">"Quitter %1$s?"</string>
<string name="screen_leave_space_title_last_admin">"Vous êtes le seul administrateur de %1$s"</string>
<string name="screen_space_menu_action_members">"Voir les membres"</string>
<string name="screen_space_settings_leave_space">"Quitter lespace"</string>
<string name="screen_space_settings_roles_and_permissions">"Rôles &amp; autorisations"</string>
<string name="screen_space_settings_security_and_privacy">"Sécurité &amp; confidentialité"</string>

View File

@@ -11,6 +11,7 @@
<string name="screen_leave_space_subtitle_only_last_admin">"Nećete biti uklonjeni iz sljedećih soba jer ste jedini administrator:"</string>
<string name="screen_leave_space_title">"Želite li napustiti %1$s?"</string>
<string name="screen_leave_space_title_last_admin">"Vi ste jedini administrator za %1$s"</string>
<string name="screen_space_menu_action_members">"Prikaži članove"</string>
<string name="screen_space_settings_leave_space">"Napusti prostor"</string>
<string name="screen_space_settings_roles_and_permissions">"Uloge i dopuštenja"</string>
<string name="screen_space_settings_security_and_privacy">"Sigurnost i privatnost"</string>

View File

@@ -10,6 +10,7 @@
<string name="screen_leave_space_subtitle_only_last_admin">"Nem lesz eltávolítva a következő szobá(k)ból, mert ön az egyetlen adminisztrátor:"</string>
<string name="screen_leave_space_title">"Kilép innen: %1$s?"</string>
<string name="screen_leave_space_title_last_admin">"Ön az egyetlen adminisztrátor itt: %1$s"</string>
<string name="screen_space_menu_action_members">"Tagok megtekintése"</string>
<string name="screen_space_settings_leave_space">"Tér elhagyása"</string>
<string name="screen_space_settings_roles_and_permissions">"Szerepkörök és jogosultságok"</string>
<string name="screen_space_settings_security_and_privacy">"Biztonság és adatvédelem"</string>

View File

@@ -10,6 +10,7 @@
<string name="screen_leave_space_subtitle_only_last_admin">"Non verrai rimosso dalle seguenti stanze perché sei l\'unico amministratore:"</string>
<string name="screen_leave_space_title">"Uscire da %1$s?"</string>
<string name="screen_leave_space_title_last_admin">"Sei l\'unico amministratore di %1$s"</string>
<string name="screen_space_menu_action_members">"Visualizza membri"</string>
<string name="screen_space_settings_leave_space">"Esci dallo spazio"</string>
<string name="screen_space_settings_roles_and_permissions">"Ruoli e autorizzazioni"</string>
<string name="screen_space_settings_security_and_privacy">"Sicurezza e privacy"</string>

View File

@@ -10,6 +10,7 @@
<string name="screen_leave_space_subtitle_only_last_admin">"Du vil ikke bli fjernet fra følgende rom fordi du er den eneste administratoren:"</string>
<string name="screen_leave_space_title">"Forlat %1$s?"</string>
<string name="screen_leave_space_title_last_admin">"Du er den eneste administratoren for %1$s"</string>
<string name="screen_space_menu_action_members">"Vis medlemmer"</string>
<string name="screen_space_settings_leave_space">"Forlat område"</string>
<string name="screen_space_settings_roles_and_permissions">"Roller og tillatelser"</string>
<string name="screen_space_settings_security_and_privacy">"Sikkerhet og personvern"</string>

View File

@@ -10,6 +10,7 @@
<string name="screen_leave_space_subtitle_only_last_admin">"Você não será removido das seguintes salas porque você é o único administrador:"</string>
<string name="screen_leave_space_title">"Sair de %1$s?"</string>
<string name="screen_leave_space_title_last_admin">"Você é o único administrador de %1$s"</string>
<string name="screen_space_menu_action_members">"Ver membros"</string>
<string name="screen_space_settings_leave_space">"Sair do espaço"</string>
<string name="screen_space_settings_roles_and_permissions">"Cargos e permissões"</string>
<string name="screen_space_settings_security_and_privacy">"Segurança e privacidade"</string>

View File

@@ -11,6 +11,7 @@
<string name="screen_leave_space_subtitle_only_last_admin">"Nu veți părăsi următoarele camere deoarece sunteți singurul administrator:"</string>
<string name="screen_leave_space_title">"Părăsiți %1$s?"</string>
<string name="screen_leave_space_title_last_admin">"Sunteți singurul administrator pentru %1$s"</string>
<string name="screen_space_menu_action_members">"Vizualizați membrii"</string>
<string name="screen_space_settings_leave_space">"Părăsiți spațiul"</string>
<string name="screen_space_settings_roles_and_permissions">"Roluri și permisiuni"</string>
<string name="screen_space_settings_security_and_privacy">"Securitate &amp; confidențialitate"</string>

View File

@@ -11,6 +11,7 @@
<string name="screen_leave_space_subtitle_only_last_admin">"Вы не будете удалены из следующих комнат, поскольку вы являетесь единственным администратором:"</string>
<string name="screen_leave_space_title">"Выйти из %1$s?"</string>
<string name="screen_leave_space_title_last_admin">"Вы единственный администратор для %1$s"</string>
<string name="screen_space_menu_action_members">"Просмотреть участников"</string>
<string name="screen_space_settings_leave_space">"Покинуть пространство"</string>
<string name="screen_space_settings_roles_and_permissions">"Роли и разрешения"</string>
<string name="screen_space_settings_security_and_privacy">"Безопасность и конфиденциальность"</string>

View File

@@ -11,6 +11,7 @@
<string name="screen_leave_space_subtitle_only_last_admin">"Z nasledujúcich miestností nebudete odstránený/á, pretože ste jediným správcom:"</string>
<string name="screen_leave_space_title">"Opustiť %1$s?"</string>
<string name="screen_leave_space_title_last_admin">"Ste jediným administrátorom pre %1$s"</string>
<string name="screen_space_menu_action_members">"Zobraziť členov"</string>
<string name="screen_space_settings_leave_space">"Opustiť priestor"</string>
<string name="screen_space_settings_roles_and_permissions">"Roly a povolenia"</string>
<string name="screen_space_settings_security_and_privacy">"Bezpečnosť a súkromie"</string>

View File

@@ -9,6 +9,7 @@
<string name="screen_leave_space_subtitle_only_last_admin">"您不會被從以下聊天室移除,因為您是唯一的管理員:"</string>
<string name="screen_leave_space_title">"離開 %1$s"</string>
<string name="screen_leave_space_title_last_admin">"您是 %1$s 唯一的管理員"</string>
<string name="screen_space_menu_action_members">"檢視成員"</string>
<string name="screen_space_settings_leave_space">"離開空間"</string>
<string name="screen_space_settings_roles_and_permissions">"角色與權限"</string>
<string name="screen_space_settings_security_and_privacy">"安全與隱私"</string>

View File

@@ -9,6 +9,7 @@
<string name="screen_leave_space_subtitle_only_last_admin">"您不会从以下房间中被移除,因为您是唯一的管理员:"</string>
<string name="screen_leave_space_title">"离开%1$s"</string>
<string name="screen_leave_space_title_last_admin">"您是 %1$s 的唯一管理员"</string>
<string name="screen_space_menu_action_members">"查看成员"</string>
<string name="screen_space_settings_leave_space">"离开空间"</string>
<string name="screen_space_settings_roles_and_permissions">"角色与权限"</string>
<string name="screen_space_settings_security_and_privacy">"安全与隐私"</string>

View File

@@ -10,6 +10,12 @@
<string name="screen_leave_space_subtitle_only_last_admin">"You will not be removed from the following room(s) because you\'re the only administrator:"</string>
<string name="screen_leave_space_title">"Leave %1$s?"</string>
<string name="screen_leave_space_title_last_admin">"You are the only admin for %1$s"</string>
<string name="screen_space_menu_action_members">"View members"</string>
<string name="screen_space_remove_rooms_confirmation_content">"Removing a room will not affect the room access. To change the access go to Room info &gt; Privacy &amp; security."</string>
<plurals name="screen_space_remove_rooms_confirmation_title">
<item quantity="one">"Remove %1$d room from %2$s"</item>
<item quantity="other">"Remove %1$d rooms from %2$s"</item>
</plurals>
<string name="screen_space_settings_leave_space">"Leave space"</string>
<string name="screen_space_settings_roles_and_permissions">"Roles &amp; permissions"</string>
<string name="screen_space_settings_security_and_privacy">"Security &amp; privacy"</string>

View File

@@ -22,7 +22,7 @@ class SpaceStateTest {
@Test
fun `test default state`() {
val state = aSpaceState()
assertThat(state.hasAnyFailure).isFalse()
assertThat(state.hasAnyJoinFailures).isFalse()
assertThat(state.isJoining(A_ROOM_ID)).isFalse()
}
@@ -35,7 +35,7 @@ class SpaceStateTest {
A_ROOM_ID_3 to AsyncAction.Success(Unit),
)
)
assertThat(state.hasAnyFailure).isTrue()
assertThat(state.hasAnyJoinFailures).isTrue()
}
@Test