change (member moderation) : extract in a separate module

This commit is contained in:
ganfra 2025-05-06 22:39:18 +02:00
parent 9234de6b8e
commit 58d9b12ab3
80 changed files with 1062 additions and 633 deletions

View file

@ -0,0 +1,37 @@
/*
* Copyright 2025 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.features.roommembermoderation.impl
import androidx.compose.runtime.Composable
import androidx.compose.runtime.SideEffect
import androidx.compose.ui.Modifier
import com.squareup.anvil.annotations.ContributesBinding
import io.element.android.features.roommembermoderation.api.ModerationAction
import io.element.android.features.roommembermoderation.api.RoomMemberModerationRenderer
import io.element.android.features.roommembermoderation.api.RoomMemberModerationState
import io.element.android.libraries.di.RoomScope
import timber.log.Timber
import javax.inject.Inject
@ContributesBinding(RoomScope::class)
class DefaultRoomMemberModerationRenderer @Inject constructor() : RoomMemberModerationRenderer {
@Composable
override fun Render(
state: RoomMemberModerationState,
onSelectAction: (ModerationAction) -> Unit,
modifier: Modifier
) {
if (state is InternalRoomMemberModerationState) {
RoomMemberModerationView(state, onSelectAction, modifier)
} else {
SideEffect {
Timber.d("RoomMemberModerationRenderer: Render called with unsupported state: $state")
}
}
}
}

View file

@ -0,0 +1,17 @@
/*
* Copyright 2024 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.features.roommembermoderation.impl
import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvents
sealed interface InternalRoomMemberModerationEvents: RoomMemberModerationEvents {
data class DoKickUser(val reason: String) : InternalRoomMemberModerationEvents
data class DoBanUser(val reason: String) : InternalRoomMemberModerationEvents
data object DoUnbanUser : InternalRoomMemberModerationEvents
data object Reset : InternalRoomMemberModerationEvents
}

View file

@ -0,0 +1,32 @@
/*
* Copyright 2024 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.features.roommembermoderation.impl
import io.element.android.features.roommembermoderation.api.ModerationAction
import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvents
import io.element.android.features.roommembermoderation.api.RoomMemberModerationState
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.matrix.api.room.RoomMember
import kotlinx.collections.immutable.ImmutableList
data class InternalRoomMemberModerationState(
override val canKick: Boolean,
override val canBan: Boolean,
val selectedRoomMember: AsyncData<RoomMember>,
val actions: ImmutableList<ModerationAction>,
val kickUserAsyncAction: AsyncAction<Unit>,
val banUserAsyncAction: AsyncAction<Unit>,
val unbanUserAsyncAction: AsyncAction<Unit>,
override val eventSink: (RoomMemberModerationEvents) -> Unit,
) : RoomMemberModerationState {
val canOnlyDisplayProfile = actions.size == 1 && actions.first() is ModerationAction.DisplayProfile
val canDisplayActions = actions.isNotEmpty() && !canOnlyDisplayProfile
}

View file

@ -0,0 +1,197 @@
/*
* Copyright 2024 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.features.roommembermoderation.impl
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import im.vector.app.features.analytics.plan.RoomModeration
import io.element.android.features.roommembermoderation.api.ModerationAction
import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvents
import io.element.android.features.roommembermoderation.api.RoomMemberModerationState
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.architecture.runUpdatingState
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.room.JoinedRoom
import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.ui.room.canBanAsState
import io.element.android.libraries.matrix.ui.room.canKickAsState
import io.element.android.libraries.matrix.ui.room.userPowerLevelAsState
import io.element.android.services.analytics.api.AnalyticsService
import kotlinx.collections.immutable.PersistentList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.drop
import kotlinx.coroutines.flow.take
import kotlinx.coroutines.launch
import javax.inject.Inject
class RoomMemberModerationPresenter @Inject constructor(
private val room: JoinedRoom,
private val dispatchers: CoroutineDispatchers,
private val analyticsService: AnalyticsService,
) : Presenter<RoomMemberModerationState> {
private var selectedMember by mutableStateOf<AsyncData<RoomMember>>(AsyncData.Uninitialized)
@Composable
override fun present(): RoomMemberModerationState {
val coroutineScope = rememberCoroutineScope()
val syncUpdateFlow = room.syncUpdateFlow.collectAsState()
val canBan = room.canBanAsState(syncUpdateFlow.value)
val canKick = room.canKickAsState(syncUpdateFlow.value)
val currentUserMemberPowerLevel = room.userPowerLevelAsState(syncUpdateFlow.value)
val kickUserAsyncAction =
remember { mutableStateOf(AsyncAction.Uninitialized as AsyncAction<Unit>) }
val banUserAsyncAction =
remember { mutableStateOf(AsyncAction.Uninitialized as AsyncAction<Unit>) }
val unbanUserAsyncAction =
remember { mutableStateOf(AsyncAction.Uninitialized as AsyncAction<Unit>) }
val moderationActions = remember { mutableStateOf(persistentListOf<ModerationAction>()) }
fun handleEvent(event: RoomMemberModerationEvents) {
when (event) {
is RoomMemberModerationEvents.RenderActions -> {
selectedMember = AsyncData.Success(event.roomMember)
moderationActions.value = computeModerationActions(
member = event.roomMember,
canKick = canKick.value,
canBan = canBan.value,
currentUserMemberPowerLevel = currentUserMemberPowerLevel.value,
)
}
is RoomMemberModerationEvents.ProcessAction -> {
when(val action = event.action) {
is ModerationAction.DisplayProfile -> Unit
is ModerationAction.KickUser -> {
selectedMember = AsyncData.Success(action.member)
kickUserAsyncAction.value = AsyncAction.ConfirmingNoParams
}
is ModerationAction.BanUser -> {
selectedMember = AsyncData.Success(action.member)
banUserAsyncAction.value = AsyncAction.ConfirmingNoParams
}
is ModerationAction.UnbanUser -> {
selectedMember = AsyncData.Success(action.member)
unbanUserAsyncAction.value = AsyncAction.ConfirmingNoParams
}
}
}
is InternalRoomMemberModerationEvents.DoKickUser -> {
selectedMember.dataOrNull()?.let {
coroutineScope.kickUser(it.userId, event.reason, kickUserAsyncAction)
}
selectedMember = AsyncData.Uninitialized
}
is InternalRoomMemberModerationEvents.DoBanUser -> {
selectedMember.dataOrNull()?.let {
coroutineScope.banUser(it.userId, event.reason, banUserAsyncAction)
}
selectedMember = AsyncData.Uninitialized
}
is InternalRoomMemberModerationEvents.Reset -> {
selectedMember = AsyncData.Uninitialized
kickUserAsyncAction.value = AsyncAction.Uninitialized
banUserAsyncAction.value = AsyncAction.Uninitialized
unbanUserAsyncAction.value = AsyncAction.Uninitialized
}
is InternalRoomMemberModerationEvents.DoUnbanUser -> {
selectedMember.dataOrNull()?.let {
coroutineScope.unbanUser(it.userId, unbanUserAsyncAction)
}
selectedMember = AsyncData.Uninitialized
}
}
}
return InternalRoomMemberModerationState(
canKick = canKick.value,
canBan = canBan.value,
selectedRoomMember = selectedMember,
actions = moderationActions.value,
kickUserAsyncAction = kickUserAsyncAction.value,
banUserAsyncAction = banUserAsyncAction.value,
unbanUserAsyncAction = unbanUserAsyncAction.value,
eventSink = { handleEvent(it) },
)
}
private fun computeModerationActions(
member: RoomMember,
canKick: Boolean,
canBan: Boolean,
currentUserMemberPowerLevel: Long,
): PersistentList<ModerationAction> {
return buildList {
add(ModerationAction.DisplayProfile(member))
if (canKick && member.powerLevel < currentUserMemberPowerLevel) {
add(ModerationAction.KickUser(member))
}
if (canBan && member.powerLevel < currentUserMemberPowerLevel) {
add(ModerationAction.BanUser(member))
}
}.toPersistentList()
}
private fun CoroutineScope.kickUser(
userId: UserId,
reason: String,
kickUserAction: MutableState<AsyncAction<Unit>>,
) = runActionAndWaitForMembershipChange(kickUserAction) {
analyticsService.capture(RoomModeration(RoomModeration.Action.KickMember))
room.kickUser(
userId = userId,
reason = reason.takeIf { it.isNotBlank() },
)
}
private fun CoroutineScope.banUser(
userId: UserId,
reason: String,
banUserAction: MutableState<AsyncAction<Unit>>,
) = runActionAndWaitForMembershipChange(banUserAction) {
analyticsService.capture(RoomModeration(RoomModeration.Action.BanMember))
room.banUser(
userId = userId,
reason = reason.takeIf { it.isNotBlank() },
)
}
private fun CoroutineScope.unbanUser(
userId: UserId,
unbanUserAction: MutableState<AsyncAction<Unit>>,
) = runActionAndWaitForMembershipChange(unbanUserAction) {
analyticsService.capture(RoomModeration(RoomModeration.Action.UnbanMember))
room.unbanUser(userId = userId)
}
private fun <T> CoroutineScope.runActionAndWaitForMembershipChange(
action: MutableState<AsyncAction<T>>,
block: suspend () -> Result<T>
) {
launch(dispatchers.io) {
action.runUpdatingState {
val result = block()
if (result.isSuccess) {
room.membersStateFlow.drop(1).take(1)
}
result
}
}
}
}

View file

@ -0,0 +1,94 @@
/*
* Copyright 2024 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.features.roommembermoderation.impl
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.features.roommembermoderation.api.ModerationAction
import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvents
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.room.RoomMembershipState
import kotlinx.collections.immutable.toPersistentList
class RoomMemberModerationStateProvider : PreviewParameterProvider<InternalRoomMemberModerationState> {
override val values: Sequence<InternalRoomMemberModerationState>
get() = sequenceOf(
aRoomMembersModerationState(
selectedRoomMember = AsyncData.Success(anAlice()),
actions = listOf(
ModerationAction.DisplayProfile(anAlice()),
),
),
aRoomMembersModerationState(
selectedRoomMember = AsyncData.Success(anAlice()),
actions = listOf(
ModerationAction.DisplayProfile(anAlice()),
ModerationAction.KickUser(anAlice()),
),
),
aRoomMembersModerationState(
selectedRoomMember = AsyncData.Success(anAlice()),
actions = listOf(
ModerationAction.DisplayProfile(anAlice()),
ModerationAction.KickUser(anAlice()),
ModerationAction.BanUser(anAlice()),
),
),
aRoomMembersModerationState(
selectedRoomMember = AsyncData.Success(anAlice()),
kickUserAsyncAction = AsyncAction.ConfirmingNoParams,
),
aRoomMembersModerationState(
selectedRoomMember = AsyncData.Success(anAlice()),
kickUserAsyncAction = AsyncAction.Loading,
),
aRoomMembersModerationState(
selectedRoomMember = AsyncData.Success(anAlice()),
banUserAsyncAction = AsyncAction.ConfirmingNoParams,
),
aRoomMembersModerationState(
selectedRoomMember = AsyncData.Success(anAlice()),
banUserAsyncAction = AsyncAction.Loading,
),
)
}
fun anAlice() = RoomMember(
UserId(value = "@alice:server.org"),
displayName = "Alice",
avatarUrl = null,
role = RoomMember.Role.forPowerLevel(100L),
membership = RoomMembershipState.JOIN,
isNameAmbiguous = false,
powerLevel = 100L,
normalizedPowerLevel = 100L,
isIgnored = false,
membershipChangeReason = null,
)
fun aRoomMembersModerationState(
canKick: Boolean = false,
canBan: Boolean = false,
selectedRoomMember: AsyncData<RoomMember> = AsyncData.Uninitialized,
actions: List<ModerationAction> = emptyList(),
kickUserAsyncAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
banUserAsyncAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
unbanUserAsyncAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
eventSink: (RoomMemberModerationEvents) -> Unit = {},
) = InternalRoomMemberModerationState(
canKick = canKick,
canBan = canBan,
selectedRoomMember = selectedRoomMember,
actions = actions.toPersistentList(),
kickUserAsyncAction = kickUserAsyncAction,
banUserAsyncAction = banUserAsyncAction,
unbanUserAsyncAction = unbanUserAsyncAction,
eventSink = eventSink,
)

View file

@ -0,0 +1,313 @@
/*
* Copyright 2024 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.features.roommembermoderation.impl
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.layout.systemBarsPadding
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
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.roommembermoderation.api.ModerationAction
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.designsystem.components.async.AsyncIndicator
import io.element.android.libraries.designsystem.components.async.AsyncIndicatorHost
import io.element.android.libraries.designsystem.components.async.rememberAsyncIndicatorState
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
import io.element.android.libraries.designsystem.components.dialogs.TextFieldDialog
import io.element.android.libraries.designsystem.components.list.ListItemContent
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.IconSource
import io.element.android.libraries.designsystem.theme.components.ListItem
import io.element.android.libraries.designsystem.theme.components.ListItemStyle
import io.element.android.libraries.designsystem.theme.components.ModalBottomSheet
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.room.getBestName
import io.element.android.libraries.matrix.ui.model.getAvatarData
import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.collections.immutable.ImmutableList
import kotlinx.coroutines.launch
import timber.log.Timber
@Composable
fun RoomMemberModerationView(
state: InternalRoomMemberModerationState,
onSelectAction: (ModerationAction) -> Unit,
modifier: Modifier = Modifier,
) {
val selectedRoomMember = state.selectedRoomMember.dataOrNull()
Box(modifier = modifier) {
if (selectedRoomMember != null && state.canDisplayActions) {
RoomMemberActionsBottomSheet(
roomMember = selectedRoomMember,
actions = state.actions,
onSelectAction = onSelectAction,
onDismiss = { state.eventSink(InternalRoomMemberModerationEvents.Reset) },
)
}
val onSelectAction by rememberUpdatedState(onSelectAction)
LaunchedEffect(state.canOnlyDisplayProfile) {
if (state.canOnlyDisplayProfile) {
onSelectAction(state.actions.first())
}
}
val asyncIndicatorState = rememberAsyncIndicatorState()
AsyncIndicatorHost(modifier = Modifier.statusBarsPadding(), state = asyncIndicatorState)
when (val action = state.kickUserAsyncAction) {
is AsyncAction.Confirming -> {
TextFieldDialog(
title = stringResource(R.string.screen_bottom_sheet_manage_room_member_kick_member_confirmation_title),
submitText = stringResource(R.string.screen_bottom_sheet_manage_room_member_kick_member_confirmation_action),
onSubmit = { reason ->
state.eventSink(InternalRoomMemberModerationEvents.DoKickUser(reason = reason))
},
onDismissRequest = { state.eventSink(InternalRoomMemberModerationEvents.Reset) },
placeholder = stringResource(id = CommonStrings.common_reason),
label = stringResource(id = CommonStrings.common_reason),
content = stringResource(R.string.screen_bottom_sheet_manage_room_member_kick_member_confirmation_description),
value = "",
)
}
is AsyncAction.Loading -> {
LaunchedEffect(action) {
val userDisplayName = selectedRoomMember?.getBestName().orEmpty()
asyncIndicatorState.enqueue {
AsyncIndicator.Loading(text = stringResource(R.string.screen_bottom_sheet_manage_room_member_removing_user, userDisplayName))
}
}
}
is AsyncAction.Failure -> {
Timber.e(action.error, "Failed to kick user.")
LaunchedEffect(action) {
asyncIndicatorState.enqueue(AsyncIndicator.DURATION_SHORT) {
AsyncIndicator.Failure(
text = stringResource(CommonStrings.common_failed),
)
}
}
}
is AsyncAction.Success -> {
LaunchedEffect(action) { asyncIndicatorState.clear() }
}
else -> Unit
}
when (val action = state.banUserAsyncAction) {
is AsyncAction.Confirming -> {
TextFieldDialog(
title = stringResource(R.string.screen_bottom_sheet_manage_room_member_ban_member_confirmation_title),
submitText = stringResource(R.string.screen_bottom_sheet_manage_room_member_ban_member_confirmation_action),
onSubmit = { reason ->
state.eventSink(InternalRoomMemberModerationEvents.DoBanUser(reason = reason))
},
onDismissRequest = { state.eventSink(InternalRoomMemberModerationEvents.Reset) },
placeholder = stringResource(id = CommonStrings.common_reason),
label = stringResource(id = CommonStrings.common_reason),
content = stringResource(R.string.screen_bottom_sheet_manage_room_member_ban_member_confirmation_description),
value = "",
)
}
is AsyncAction.Loading -> {
LaunchedEffect(action) {
val userDisplayName = selectedRoomMember?.getBestName().orEmpty()
asyncIndicatorState.enqueue {
AsyncIndicator.Loading(text = stringResource(R.string.screen_bottom_sheet_manage_room_member_banning_user, userDisplayName))
}
}
}
is AsyncAction.Failure -> {
Timber.e(action.error, "Failed to ban user.")
LaunchedEffect(action) {
asyncIndicatorState.enqueue(AsyncIndicator.DURATION_SHORT) {
AsyncIndicator.Failure(
text = stringResource(CommonStrings.common_failed),
)
}
}
}
is AsyncAction.Success -> {
LaunchedEffect(action) { asyncIndicatorState.clear() }
}
else -> Unit
}
when (val action = state.unbanUserAsyncAction) {
is AsyncAction.Confirming -> {
ConfirmationDialog(
title = stringResource(R.string.screen_room_member_list_manage_member_unban_title),
content = stringResource(R.string.screen_room_member_list_manage_member_unban_message),
submitText = stringResource(R.string.screen_room_member_list_manage_member_unban_action),
onSubmitClick = {
val userDisplayName = selectedRoomMember?.getBestName().orEmpty()
asyncIndicatorState.enqueue {
AsyncIndicator.Loading(text = stringResource(R.string.screen_room_member_list_unbanning_user, userDisplayName))
}
state.eventSink(InternalRoomMemberModerationEvents.DoUnbanUser)
},
onDismiss = { state.eventSink(InternalRoomMemberModerationEvents.Reset) },
)
}
is AsyncAction.Failure -> {
Timber.e(action.error, "Failed to unban user.")
LaunchedEffect(action) {
asyncIndicatorState.enqueue(AsyncIndicator.DURATION_SHORT) {
AsyncIndicator.Failure(
text = stringResource(CommonStrings.common_failed),
)
}
}
}
is AsyncAction.Success -> {
LaunchedEffect(action) { asyncIndicatorState.clear() }
}
is AsyncAction.Loading,
AsyncAction.Uninitialized -> Unit
}
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun RoomMemberActionsBottomSheet(
roomMember: RoomMember,
actions: ImmutableList<ModerationAction>,
onSelectAction: (ModerationAction) -> Unit,
onDismiss: () -> Unit,
) {
val coroutineScope = rememberCoroutineScope()
val bottomSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
ModalBottomSheet(
modifier = Modifier.systemBarsPadding(),
sheetState = bottomSheetState,
onDismissRequest = {
coroutineScope.launch {
bottomSheetState.hide()
onDismiss()
}
},
) {
Column(
modifier = Modifier.padding(vertical = 16.dp)
) {
Avatar(
avatarData = roomMember.getAvatarData(size = AvatarSize.RoomListManageUser),
modifier = Modifier
.padding(bottom = 28.dp)
.align(Alignment.CenterHorizontally)
)
roomMember.displayName?.let {
Text(
text = it,
style = ElementTheme.typography.fontHeadingLgBold,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
textAlign = TextAlign.Center,
modifier = Modifier
.padding(start = 16.dp, end = 16.dp, bottom = 8.dp)
.fillMaxWidth()
)
}
Text(
text = roomMember.userId.toString(),
style = ElementTheme.typography.fontBodyLgRegular,
color = ElementTheme.colors.textSecondary,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
textAlign = TextAlign.Center,
modifier = Modifier
.padding(horizontal = 16.dp)
.fillMaxWidth()
)
Spacer(modifier = Modifier.height(32.dp))
for (action in actions) {
when (action) {
is ModerationAction.DisplayProfile -> {
ListItem(
headlineContent = { Text(stringResource(R.string.screen_bottom_sheet_manage_room_member_member_user_info)) },
leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Info())),
onClick = {
coroutineScope.launch {
onSelectAction(action)
bottomSheetState.hide()
}
}
)
}
is ModerationAction.KickUser -> {
ListItem(
headlineContent = { Text(stringResource(R.string.screen_bottom_sheet_manage_room_member_remove)) },
leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Block())),
onClick = {
coroutineScope.launch {
bottomSheetState.hide()
onSelectAction(action)
}
}
)
}
is ModerationAction.BanUser -> {
ListItem(
headlineContent = { Text(stringResource(R.string.screen_bottom_sheet_manage_room_member_ban)) },
leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Block())),
style = ListItemStyle.Destructive,
onClick = {
coroutineScope.launch {
bottomSheetState.hide()
onSelectAction(action)
}
}
)
}
is ModerationAction.UnbanUser -> Unit
}
}
}
}
}
@PreviewsDayNight
@Composable
internal fun RoomMembersModerationViewPreview(@PreviewParameter(RoomMemberModerationStateProvider::class) state: InternalRoomMemberModerationState) {
ElementPreview {
Box(
modifier = Modifier
.fillMaxWidth()
.heightIn(min = 64.dp)
) {
RoomMemberModerationView(
state = state,
onSelectAction = {},
)
}
}
}

View file

@ -0,0 +1,24 @@
/*
* Copyright 2025 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.features.roommembermoderation.impl.di
import com.squareup.anvil.annotations.ContributesTo
import dagger.Binds
import dagger.Module
import io.element.android.features.roommembermoderation.api.RoomMemberModerationState
import io.element.android.features.roommembermoderation.impl.RoomMemberModerationPresenter
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.di.RoomScope
import io.element.android.libraries.di.SessionScope
@ContributesTo(RoomScope::class)
@Module
interface RoomMemberModerationModule {
@Binds
fun bindRoomMemberModerationPresenter(presenter: RoomMemberModerationPresenter): Presenter<RoomMemberModerationState>
}

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Выдаліць і заблакіраваць удзельніка"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Заблакіраваць"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"Яны не змогуць зноў далучыцца да гэтага пакоя, калі іх запросяць."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Вы ўпэўнены, што хочаце заблакіраваць гэтага карыстальніка?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"Блакіроўка %1$s"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Прагляд профілю"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Выдаліць удзельніка з пакоя"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Выдаліць удзельніка і забараніць далучацца ў будучыні?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"Выдаленне %1$s…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Выдаліць і заблакіраваць удзельніка"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Толькі выдаліць удзельніка"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Разблакіраваць"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Яны змогуць зноў далучыцца да гэтага пакоя, калі іх запросяць."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Разблакіраваць удзельніка"</string>
<string name="screen_room_member_list_unbanning_user">"Разблакіроўка %1$s"</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Odebrat a vykázat člena"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Vykázat"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"Nebudou se moci znovu připojit k této místnosti, pokud budou pozváni."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Jste si jisti, že chcete vykázat tohoto člena?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"Vykazování %1$s"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_action">"Odebrat"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_description">"Budou moci znovu vstoupit do této místnosti, pokud budou pozváni."</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_title">"Opravdu chcete tohoto člena odebrat?"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Zobrazit profil"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Odebrat z místnosti"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Odebrat člena a zakázat mu připojení v budoucnu?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"Odstraňování %1$s…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Odebrat a vykázat člena"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Pouze odebrat člena"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Zrušit vykázání"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Pokud budou pozváni, budou se moci do této místnosti znovu připojit."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Zrušit vykázání uživatele"</string>
<string name="screen_room_member_list_unbanning_user">"Rušení vykázání %1$s"</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Gwahardd o ystafell"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Atal"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"Fyddan nhw ddim yn gallu ymuno â\'r ystafell hon eto os cân nhw wahoddiad."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Ydych chi\'n siŵr eich bod am wahardd yr aelod hwn?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"Yn gwahardd %1$s"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_action">"Tynnu"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_description">"Fyddan nhw yn gallu ymuno â\'r ystafell hon eto os cân nhw wahoddiad."</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_title">"Ydych chi\'n siŵr eich bod am ddileu\'r aelod hwn?"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Gweld proffil"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Tynnu o\'r ystafell"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Dileu aelod a\'u gwahardd rhag ymuno yn y dyfodol?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"Wrthi\'n dileu %1$s…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Gwahardd o ystafell"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Dileu aelod yn unig"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Adfer"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Fyddan nhw yn gallu ymuno â\'r ystafell hon eto os cân nhw wahoddiad."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Gwahardd defnyddiwr"</string>
<string name="screen_room_member_list_unbanning_user">"Dad-wahardd %1$s"</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Mitglied entfernen und sperren"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Sperren"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"Sie können dem Raum nicht mehr beitreten, selbst wenn sie eingeladen werden."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Bist du sicher, dass du dieses Mitglied sperren möchtest?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"%1$s wird gesperrt."</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_action">"Entfernen"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_description">"Sie können diesen Raum wieder betreten, wenn sie eingeladen werden."</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_title">"Möchten Sie dieses Mitglied wirklich entfernen?"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Benutzerinformationen anzeigen"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Mitglied entfernen"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Mitglied entfernen und den erneuten Beitritt sperren?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"%1$s wird entfernt."</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Mitglied entfernen und sperren"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Mitglied nur entfernen"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Sperre aufheben"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Die Nutzer können den Raum wieder beitreten, wenn sie dazu eingeladen werden."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Benutzer entsperren"</string>
<string name="screen_room_member_list_unbanning_user">"%1$s wird entsperrt."</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Αφαίρεση και αποκλεισμός μέλους"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Αποκλεισμός"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"Δεν θα μπορεί να συμμετέχει ξανά σε αυτό το δωμάτιο εάν προσκληθεί."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Θες σίγουρα να αποκλείσεις αυτό το μέλος;"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"Αποκλεισμός %1$s"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_action">"Αφαίρεση"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_description">"Θα μπορούν να συμμετάσχουν ξανά σε αυτό το δωμάτιο εάν προσκληθούν."</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_title">"Είστε βέβαιοι ότι θέλετε να αφαιρέσετε αυτό το μέλος;"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Προβολή προφίλ"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Αφαίρεση από το δωμάτιο"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Αφαίρεση μέλους και απαγόρευση συμμετοχής στο μέλλον;"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"Αφαίρεση %1$s…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Αφαίρεση και αποκλεισμός μέλους"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Μόνο αφαίρεση μέλους"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Αναίρεση αποκλεισμού"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Θα μπορεί να συμμετάσχει ξανά στο δωμάτιο εάν προσκληθεί."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Άρση αποκλεισμού χρήστη"</string>
<string name="screen_room_member_list_unbanning_user">"Άρση αποκλεισμού %1$s"</string>
</resources>

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Sacar y vetar a un miembro"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Vetar"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"No podrán volver a unirse a esta sala si son invitados."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"¿Estás seguro de que quieres vetar a este miembro?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"Vetando a %1$s"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Ver perfil"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Sacar de la sala"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"¿Sacar al miembro y prohibirle unirse en el futuro?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"Eliminando %1$s…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Sacar y vetar a un miembro"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Solo eliminar miembro"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Quitar veto"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Podrán volver a unirse a esta sala si son invitados de nuevo."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Quitar veto al usuario"</string>
<string name="screen_room_member_list_unbanning_user">"Levantando veto a %1$s"</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Eemalda ja sea suhtluskeeld"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Sea suhtluskeeld"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"Ta ei saa selle jututoaga liituda isegi kutse olemasolul."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Kas sa oled kindel, et soovid sellele kasutajale seada suhtluskeelu?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"Seame kasutajale %1$s suhtluskeelu"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_action">"Eemalda"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_description">"Uue kutse saamisel on tal võimalik selle jututoaga uuesti liituda."</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_title">"Kas sa oled kindel, et soovid selle osaleja eemaldada?"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Vaata profiili"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Eemalda kasutaja jututoast"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Kas eemaldama kasutaja ja seame talle tulevikuks suhtluskeelu?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"Eemaldame kasutajat %1$s…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Eemalda ja sea suhtluskeeld"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Ainult eemalda kasutaja"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Eemalda suhtluskeeld"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Kutse olemasolul saab ta nüüd jututoaga uuesti liituda"</string>
<string name="screen_room_member_list_manage_member_unban_title">"Eemalda kasutaja suhtluskeeld"</string>
<string name="screen_room_member_list_unbanning_user">"Eemaldame suhtluskeelu kasutajalt %1$s"</string>
</resources>

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Kendu kidea eta ezarri debekua"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Ezarri debekua"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Ziur kide honi debekua ezarri nahi diozula?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"%1$s(r)i debekua ezartzen"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Ikusi profila"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Kendu gelatik"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Kidea kendu eta etorkizunean sartzea debekatu?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"%1$s kentzen…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Kendu kidea eta ezarri debekua"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Kendu kidea soilik"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Kendu debekua"</string>
<string name="screen_room_member_list_manage_member_unban_title">"Kendu debekua erabiltzaileari"</string>
<string name="screen_room_member_list_unbanning_user">"%1$s(r)i debekua kentzen"</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"برداشت و تحریم عضو"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"تحریم"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"در صورت دعوت نمی‌تواند دوباره به اتاق بپیوندد."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"مطمئنید می‌خواهید این عضو را تحریم کنید؟"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"تحریم کردن %1$s"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_action">"برداشتن"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_description">"در صورت دعوت می‌تواند دوباره به اتاق بپیوندد."</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_title">"مطمئنید می‌خواهید این عضو را بردارید؟"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"دیدن نمایه"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"برداشتن از اتاق"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"برداشتن عضو و تحریم پیوستن در آینده؟"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"برداشتن %1$s…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"برداشت و تحریم عضو"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"تنها برداشتن عضو"</string>
<string name="screen_room_member_list_manage_member_unban_action">"رفع انسداد"</string>
<string name="screen_room_member_list_manage_member_unban_message">"در صورت دعوت می‌تواند دوباره به اتاق بپیوندد."</string>
<string name="screen_room_member_list_manage_member_unban_title">"تحریم نکردن کاربر"</string>
<string name="screen_room_member_list_unbanning_user">"رفع تحریم %1$s"</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Poista jäsen huoneesta ja anna porttikielto"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Anna porttikielto"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"He eivät voi enää liittyä tähän huoneeseen, jos heidät kutsutaan."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Haluatko varmasti antaa tälle jäsenelle porttikiellon?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"Annetaan porttikieltoa käyttäjälle %1$s"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_action">"Poista"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_description">"He voivat liittyä tähän huoneeseen uudelleen, jos heidät kutsutaan."</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_title">"Haluatko varmasti poistaa tämän jäsenen?"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Näytä profiili"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Poista huoneesta"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Poistetaanko jäsen huoneesta ja kielletäänkö heitä liittymästä tulevaisuudessa?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"Poistetaan käyttäjää %1$s huoneesta…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Poista jäsen huoneesta ja anna porttikielto"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Poista vain jäsen huoneesta"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Poista porttikielto"</string>
<string name="screen_room_member_list_manage_member_unban_message">"He voivat liittyä tähän huoneeseen uudelleen, jos heidät kutsutaan."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Poista käyttäjän porttikielto"</string>
<string name="screen_room_member_list_unbanning_user">"Poistetaan käyttäjän %1$s porttikieltoa"</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Retirer et bannir ce membre"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Bannir"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"Il ne pourra pas rejoindre le salon à nouveau, même si il est invité."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Êtes-vous certain de vouloir bannir ce membre ?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"Bannissement de %1$s"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_action">"Retirer"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_description">"Cet utilisateur pourra rejoindre le salon à nouveau si il est invité."</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_title">"Voulez-vous vraiment supprimer ce membre ?"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Voir le profil"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Retirer le membre du salon"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Retirer le membre et interdire ladhésion à lavenir ?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"Enlever %1$s…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Retirer et bannir ce membre"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Retirer le membre uniquement"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Débannir"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Il pourra rejoindre le salon à nouveau si il est invité."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Débannir lutilisateur"</string>
<string name="screen_room_member_list_unbanning_user">"Débannissement de %1$s"</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Eltávolítás és a tag kitiltása"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Kitiltás"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"Többé nem csatlakozhat ehhez a szobához, akkor sem, ha meghívják."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Biztos, hogy kitiltja ezt a tagot?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"%1$s kitiltása"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_action">"Eltávolítás"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_description">"Ehhez a szobához is csatlakozhat, ha meghívják."</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_title">"Biztos, hogy eltávolítja ezt a tagot?"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Profil megtekintése"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Eltávolítás a szobából"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Eltávolítja a tagot, és megtiltja a jövőbeni csatlakozást?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"%1$s eltávolítása…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Eltávolítás és a tag kitiltása"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Csak a tag eltávolítása"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Tiltás feloldása"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Ehhez a szobához is csatlakozhat, ha meghívják."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Felhasználó tiltásának feloldása"</string>
<string name="screen_room_member_list_unbanning_user">"%1$s tiltásának feloldása"</string>
</resources>

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Rimuovi ed escludi"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Escludi"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"Non potrà entrare nuovamente in questa stanza se invitato."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Vuoi davvero escludere questo membro?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"Esclusione di %1$s"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Visualizza profilo"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Rimuovi dalla stanza"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Rimuovere e vietare l\'accesso in futuro?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"Rimozione di %1$s…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Rimuovi ed escludi"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Rimuovi soltanto"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Riammetti"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Potrà entrare nuovamente in questa stanza se invitato."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Riammetti utente"</string>
<string name="screen_room_member_list_unbanning_user">"Riammissione di %1$s"</string>
</resources>

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"წევრის წაშლა და დაბლოკვა"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"დაბლოკვა"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"მოწვევის შემთხვევაში ამ ოთახში კვლავ გაწევრიანებას ვერ შეძლებენ."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"დარწმუნებული ხართ, რომ ამ წევრის დაბლოკვა გსურთ?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"%1$s-ს დაბლოკვა"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"პროფილის ნახვა"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"ოთახიდან გაგდება"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"გსურთ წევრის გაგდება და მომავალში გაწევრიანების აკრძალვა?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"%1$s-ს გაგდება…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"წევრის წაშლა და დაბლოკვა"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"მხოლოდ წევრის წაშლა"</string>
<string name="screen_room_member_list_manage_member_unban_action">"განბლოკვა"</string>
<string name="screen_room_member_list_manage_member_unban_message">"მოწვევის შემთხვევაში განბლოკილი მომხმარებელი ისევ შეძლებს ოთახს შეუერთდეს."</string>
<string name="screen_room_member_list_manage_member_unban_title">"მომხმარებლის განბლოკვა"</string>
<string name="screen_room_member_list_unbanning_user">"%1$s-ს განბლოკვა"</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Fjern og utesteng medlem"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Utesteng"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"De vil ikke kunne bli med i dette rommet igjen hvis de blir invitert."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Er du sikker på at du vil utestenge dette medlemmet?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"Utestenger %1$s"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_action">"Fjern"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_description">"De vil kunne bli med i dette rommet igjen hvis de blir invitert."</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_title">"Er du sikker på at du vil fjerne dette medlemmet?"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Vis profil"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Fjern fra rommet"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Fjerne medlem og utestenge fra å bli med i fremtiden?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"Fjerner %1$s…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Fjern og utesteng medlem"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Bare fjern medlem"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Opphev utestengelse"</string>
<string name="screen_room_member_list_manage_member_unban_message">"De vil kunne bli med i dette rommet igjen hvis de blir invitert."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Opphev utestengelse av bruker"</string>
<string name="screen_room_member_list_unbanning_user">"Oppheve utestengelsen av %1$s"</string>
</resources>

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Lid verwijderen en verbannen"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Verbannen"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"Ze kunnen niet meer toetreden tot deze kamer als ze worden uitgenodigd."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Weet je zeker dat je dit lid wilt verbannen?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"%1$s verbannen"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Profiel bekijken"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Verwijderen uit kamer"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Lid verwijderen en toekomstige deelname verbieden?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"%1$s wordt verwijderd…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Lid verwijderen en verbannen"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Alleen lid verwijderen"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Ontbannen"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Ze kunnen opnieuw tot de kamer toetreden als ze worden uitgenodigd."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Ontban gebruiker"</string>
<string name="screen_room_member_list_unbanning_user">"%1$s ontbannen"</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Usuń i zbanuj członka"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Zbanuj"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"Nie będą mogli ponownie dołączyć do tego pokoju, jeśli zostaną zaproszeni."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Czy na pewno chcesz zbanować tego członka?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"Banowanie %1$s"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_action">"Usuń"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_description">"Będą mogli ponownie dołączyć do pokoju, jeśli zostaną zaproszeni."</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_title">"Czy na pewno chcesz usunąć tego członka?"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Wyświetl profil"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Usuń z pokoju"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Usunąć członka i zablokować możliwość dołączenia w przyszłości?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"Usuwanie %1$s…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Usuń i zbanuj członka"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Tylko usuń członka"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Odbanuj"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Będą mogli ponownie dołączyć do tego pokoju, jeśli zostaną zaproszeni."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Odbanuj użytkownika"</string>
<string name="screen_room_member_list_unbanning_user">"Odbanowanie %1$s"</string>
</resources>

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Remover e banir membro"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Banir"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"Eles não poderão entrar nesta sala novamente se forem convidados."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Tem certeza de que quer banir este membro?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"Banindo %1$s"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Ver perfil"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Remover da sala"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Remover membro e banir de entrar novamente no futuro?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"Removendo %1$s…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Remover e banir membro"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Somente remover membro"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Desbanir"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Eles poderão entrar nesta sala novamente se forem convidados."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Desbanir usuário"</string>
<string name="screen_room_member_list_unbanning_user">"Desbanindo %1$s"</string>
</resources>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Remover e banir participante"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Banir"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"Não poderão voltar a entrar nesta sala, mesmo se forem convidados."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Tens a certeza que queres banir este participante?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"A banir %1$s"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_description">"Poderão entrar na sala novamente se convidados."</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Ver perfil"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Remover da sala"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Remover participante e proibir que entre no futuro?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"A remover %1$s…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Remover e banir participante"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Remover apenas"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Anular banimento"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Poderão juntar-se novamente a esta sala se forem convidados."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Anular banimento do utilizador"</string>
<string name="screen_room_member_list_unbanning_user">"A anular banimento de %1$s"</string>
</resources>

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Eliminați și interziceți membrul"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Interzicere"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"Nu se vor putea alătura din nou acestei camere dacă sunt invitați."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Sunteți sigur că doriți să interziceți acest membru?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"Se interzice %1$s"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Vizualizare profil"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Înlăturați membrul"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Înlăturați membrul și interziceți-i să se alăture în viitor?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"Se elimină %1$s"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Eliminați și interziceți membrul"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Doar înlăturare"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Anulare excludere"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Se vor putea alătura din nou acestei săli dacă sunt invitați."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Anulați interzicerea utilizatorului"</string>
<string name="screen_room_member_list_unbanning_user">"Se anulează interzicerea lui %1$s"</string>
</resources>

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Удалить и заблокировать участника"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Заблокировать"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"Они не смогут снова присоединиться к этой комнате, если их пригласят."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Вы уверены, что хотите заблокировать этого участника?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"Блокировка %1$s"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_action">"Удалить"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_title">"Вы действительно хотите удалить этого участника?"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Посмотреть профиль"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Удалить участника из комнаты"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Удалить участника и запретить присоединяться в будущем?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"Удаление %1$s…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Удалить и заблокировать участника"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Только удалить участника"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Разблокировать"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Они снова смогут присоединиться в эту комнату если их пригласят."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Разбанить пользователя?"</string>
<string name="screen_room_member_list_unbanning_user">"Разблокировка %1$s"</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Odstrániť a zakázať člena"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Zakázať"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"Nebudú sa môcť pripojiť k tejto miestnosti znova ani ak budú pozvaní."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Ste si istý, že chcete zakázať tohto člena?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"Zakazuje sa %1$s"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_action">"Odstrániť"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_description">"V prípade pozvania sa budú môcť znova pripojiť k tejto miestnosti."</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_title">"Ste si istý, že chcete odstrániť tohto člena?"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Zobraziť profil"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Odstrániť z miestnosti"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Odstrániť člena a zakázať vstup v budúcnosti?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"Odstraňuje sa %1$s…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Odstrániť a zakázať člena"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Iba odstrániť člena"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Zrušiť zákaz"</string>
<string name="screen_room_member_list_manage_member_unban_message">"V prípade pozvania sa budú môcť znova pripojiť k tejto miestnosti."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Zrušiť zákaz používateľa"</string>
<string name="screen_room_member_list_unbanning_user">"Zrušenie zákazu %1$s"</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Ta bort och banna medlem"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Banna"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"Denne kommer inte att kunna gå med i det här rummet igen om denne bjuds in."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Är du säker på att du vill banna den här medlemmen?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"Bannar %1$s"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_action">"Ta bort"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_description">"Denne kommer kunna gå med i rummet igen om denne bjuds in"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_title">"Är du säker på att du vill ta bort den här medlemmen?"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Visa profil"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Ta bort från rummet"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Ta bort medlem och banna från att gå med i framtiden?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"Tar bort %1$s …"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Ta bort och banna medlem"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Ta bara bort medlem"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Avbanna"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Denne kommer kunna gå med i rummet igen om denne bjuds in"</string>
<string name="screen_room_member_list_manage_member_unban_title">"Avbanna användare"</string>
<string name="screen_room_member_list_unbanning_user">"Avbannar %1$s"</string>
</resources>

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Üyeyi çıkar ve yasakla"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Yasakla"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"Davet edilseler bile bu odaya tekrar katılamazlar."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Bu üyeyi yasaklamak istediğinize emin misiniz?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"Yasaklanıyor %1$s"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Profili görüntüle"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Odadan çıkar"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Üyeyi çıkarın ve gelecekte katılmasını yasaklayın?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"Kaldırılıyor %1$s…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Üyeyi çıkar ve yasakla"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Yalnızca üyeyi kaldır"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Yasağı Kaldır"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Davet edildikleri takdirde bu odaya tekrar katılabileceklerdir."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Kullanıcının yasağını kaldır"</string>
<string name="screen_room_member_list_unbanning_user">"Yasak kaldırılıyor %1$s"</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Вилучити й заблокувати учасника"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Заблокувати"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"Він не зможе приєднатися до цієї кімнати знову, якщо його запросять."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Ви точно хочете заблокувати цього користувача?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"Блокування %1$s"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_action">"Вилучити"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_description">"Вони зможуть знову приєднатися до цієї кімнати, якщо їх запросять."</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_title">"Ви дійсно хочете вилучити цього учасника?"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"Переглянути профіль"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Вилучити з кімнати"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Вилучити учасника та заборонити приєднання в майбутньому?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"Вилучення %1$s…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Вилучити й заблокувати учасника"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Лише вилучити учасника"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Розблокувати"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Вони зможуть знову приєднатися до цієї кімнати, якщо їх запросять."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Розблокувати користувача"</string>
<string name="screen_room_member_list_unbanning_user">"Розблокування %1$s"</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"踢出並加入黑名單"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"加入黑名單"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"即使收到邀請,他們仍然無法加入聊天室。"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"您確定要將此成員加入黑名單?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"正在將 %1$s 加入黑名單"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_action">"移除"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_description">"若收到邀請,他們可以再次加入此聊天室。"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_title">"您真的想要移除此成員嗎?"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"查看個人檔案"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"踢出聊天室"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"移除成員並禁止未來再度加入?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"正在踢出 %1$s…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"踢出並加入黑名單"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"僅移除成員"</string>
<string name="screen_room_member_list_manage_member_unban_action">"解除黑名單"</string>
<string name="screen_room_member_list_manage_member_unban_message">"如果收到邀請,他們能再次加入聊天室。"</string>
<string name="screen_room_member_list_manage_member_unban_title">"解除黑名單"</string>
<string name="screen_room_member_list_unbanning_user">"正在解除黑名單 %1$s"</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"移除并封禁成员"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"封禁"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"即使受到邀请,他们也无法再次加入聊天室。"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"您确定要封禁该成员吗?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"封禁 %1$s"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_action">"移除"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_description">"如果受到邀请,他们可以重新加入聊天室。"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_title">"您确定要移除此成员吗?"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"查看个人资料"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"从聊天室移除"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"删除成员并禁止重新加入?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"正在移除 %1$s……"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"移除并封禁成员"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"仅移除成员"</string>
<string name="screen_room_member_list_manage_member_unban_action">"取消封禁"</string>
<string name="screen_room_member_list_manage_member_unban_message">"如果受到邀请,他们可以重新加入聊天室。"</string>
<string name="screen_room_member_list_manage_member_unban_title">"解封用户"</string>
<string name="screen_room_member_list_unbanning_user">"解除封禁 %1$s"</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_manage_room_member_ban">"Ban from room"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_action">"Ban"</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_description">"They wont be able to join this room again if invited."</string>
<string name="screen_bottom_sheet_manage_room_member_ban_member_confirmation_title">"Are you sure you want to ban this member?"</string>
<string name="screen_bottom_sheet_manage_room_member_banning_user">"Banning %1$s"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_action">"Remove"</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_description">"They will be able to join this room again if invited."</string>
<string name="screen_bottom_sheet_manage_room_member_kick_member_confirmation_title">"Are you sure you want to remove this member?"</string>
<string name="screen_bottom_sheet_manage_room_member_member_user_info">"View profile"</string>
<string name="screen_bottom_sheet_manage_room_member_remove">"Remove from room"</string>
<string name="screen_bottom_sheet_manage_room_member_remove_confirmation_title">"Remove member and ban from joining in the future?"</string>
<string name="screen_bottom_sheet_manage_room_member_removing_user">"Removing %1$s…"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Ban from room"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Only remove member"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Unban"</string>
<string name="screen_room_member_list_manage_member_unban_message">"They will be able to join this room again if invited."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Unban user"</string>
<string name="screen_room_member_list_unbanning_user">"Unbanning %1$s"</string>
</resources>