Merge branch 'develop' into feature/fga/room_list_filter_iteration

This commit is contained in:
ganfra
2024-03-13 12:07:20 +01:00
177 changed files with 2324 additions and 870 deletions

1
.gitignore vendored
View File

@@ -56,6 +56,7 @@ captures/
.idea/libraries
# Android Studio 3 in .gitignore file.
.idea/caches
.idea/copilot
.idea/inspectionProfiles
# Shelved changes in the IDE
.idea/shelf

1
changelog.d/2259.feature Normal file
View File

@@ -0,0 +1 @@
Change a room's permissions power levels.

1
changelog.d/2530.bugfix Normal file
View File

@@ -0,0 +1 @@
Fix timeline not showing sender info when room is marked as direct but not a 1:1 room.

View File

@@ -3,5 +3,5 @@
<string name="screen_analytics_settings_help_us_improve">"Condividi dati di utilizzo anonimi per aiutarci a identificare problemi."</string>
<string name="screen_analytics_settings_read_terms">"Puoi leggere tutti i nostri termini %1$s."</string>
<string name="screen_analytics_settings_read_terms_content_link">"qui"</string>
<string name="screen_analytics_settings_share_data">"Condividi dati statistici"</string>
<string name="screen_analytics_settings_share_data">"Condividi statistiche"</string>
</resources>

View File

@@ -2,8 +2,8 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_invites_decline_chat_message">"Vuoi davvero rifiutare l\'invito ad entrare in %1$s?"</string>
<string name="screen_invites_decline_chat_title">"Rifiuta l\'invito"</string>
<string name="screen_invites_decline_direct_chat_message">"Vuoi davvero rifiutare questa chat privata con %1$s?"</string>
<string name="screen_invites_decline_direct_chat_title">"Rifiuta la chat"</string>
<string name="screen_invites_decline_direct_chat_message">"Vuoi davvero rifiutare questa conversazione privata con %1$s?"</string>
<string name="screen_invites_decline_direct_chat_title">"Rifiuta l\'invito alla conversazione"</string>
<string name="screen_invites_empty_list">"Nessun invito"</string>
<string name="screen_invites_invited_you">"%1$s (%2$s) ti ha invitato"</string>
</resources>

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="leave_conversation_alert_subtitle">"Вы ўпэўнены, што хочаце пакінуць гэту размову? Гэта размова не з\'яўляецца публічнай, і вы не зможаце далучыцца зноў без запрашэння."</string>
<string name="leave_room_alert_empty_subtitle">"Вы ўпэўнены, што жадаеце пакінуць гэты пакой? Вы тут адзіны карыстальнік. Калі вы выйдзеце, ніхто не зможа далучыцца ў будучыні, у тым ліку і вы."</string>
<string name="leave_room_alert_private_subtitle">"Вы ўпэўнены, што жадаеце пакінуць гэты пакой? Гэты пакой не агульнадаступны, і вы не зможаце далучыцца да яго зноў без запрашэння."</string>
<string name="leave_room_alert_subtitle">"Вы ўпэўнены, што жадаеце пакінуць пакой?"</string>

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_app_lock_biometric_authentication">"autenticazione biometrica"</string>
<string name="screen_app_lock_biometric_unlock">"sblocco biometrico"</string>
<string name="screen_app_lock_biometric_unlock_title_android">"Sblocca con la biometria"</string>
<string name="screen_app_lock_biometric_unlock">"sblocco con biometria"</string>
<string name="screen_app_lock_biometric_unlock_title_android">"Sblocca con biometria"</string>
<string name="screen_app_lock_forgot_pin">"PIN dimenticato?"</string>
<string name="screen_app_lock_settings_change_pin">"Modifica il codice PIN"</string>
<string name="screen_app_lock_settings_enable_biometric_unlock">"Consenti lo sblocco biometrico"</string>
@@ -16,9 +16,9 @@
<string name="screen_app_lock_setup_confirm_pin">"Conferma il PIN"</string>
<string name="screen_app_lock_setup_pin_blacklisted_dialog_content">"Non puoi scegliere questo codice PIN per motivi di sicurezza"</string>
<string name="screen_app_lock_setup_pin_blacklisted_dialog_title">"Scegli un PIN diverso"</string>
<string name="screen_app_lock_setup_pin_context">"Blocca %1$s per aggiungere ulteriore sicurezza alle tue chat.
<string name="screen_app_lock_setup_pin_context">"Blocca %1$s per aggiungere ulteriore sicurezza alle tue conversazioni.
Scegli qualcosa che puoi ricordare. Se dimentichi questo PIN, verrai disconnesso dall\'app."</string>
Scegli qualcosa facile da ricordare. Se dimentichi questo PIN, verrai disconnesso dall\'app."</string>
<string name="screen_app_lock_setup_pin_mismatch_dialog_content">"Inserisci lo stesso PIN due volte"</string>
<string name="screen_app_lock_setup_pin_mismatch_dialog_title">"I PIN non corrispondono"</string>
<string name="screen_app_lock_signout_alert_message">"Dovrai effettuare nuovamente l\'accesso e creare un nuovo PIN per procedere"</string>
@@ -33,5 +33,5 @@ Scegli qualcosa che puoi ricordare. Se dimentichi questo PIN, verrai disconnesso
</plurals>
<string name="screen_app_lock_use_biometric_android">"Usa la biometria"</string>
<string name="screen_app_lock_use_pin_android">"Usa il PIN"</string>
<string name="screen_signout_in_progress_dialog_content">"Uscita in corso…"</string>
<string name="screen_signout_in_progress_dialog_content">"Disconnessione in corso…"</string>
</resources>

View File

@@ -14,6 +14,8 @@
<string name="screen_change_account_provider_subtitle">"Выкарыстоўвайце іншага правайдара ўліковых запісаў, напрыклад, уласны прыватны сервер або працоўны ўліковы запіс."</string>
<string name="screen_change_account_provider_title">"Змяніць правайдара ўліковага запісу"</string>
<string name="screen_change_server_error_invalid_homeserver">"Нам не ўдалося звязацца з гэтым хатнім серверам. Упэўніцеся, што вы правільна ўвялі URL-адрас хатняга сервера. Калі URL-адрас пазначаны правільна, звярніцеся да адміністратара хатняга сервера за дадатковай дапамогай."</string>
<string name="screen_change_server_error_invalid_well_known">"Sliding sync недаступны з-за праблемы ў вядомым файле:
%1$s"</string>
<string name="screen_change_server_error_no_sliding_sync_message">"На жаль, гэты сервер не падтрымлівае sliding sync."</string>
<string name="screen_change_server_form_header">"URL хатняга сервера"</string>
<string name="screen_change_server_form_notice">"Вы можаце падключыцца толькі да існуючага сервера, які падтрымлівае sliding sync. Адміністратару хатняга сервера запатрабуецца наладзіць яго. %1$s"</string>
@@ -22,6 +24,7 @@
<string name="screen_login_error_deactivated_account">"Гэты ўліковы запіс быў дэактываваны."</string>
<string name="screen_login_error_invalid_credentials">"Няправільнае імя карыстальніка і/або пароль"</string>
<string name="screen_login_error_invalid_user_id">"Гэта несапраўдны ідэнтыфікатар карыстальніка. Чаканы фармат: @user:homeserver.org"</string>
<string name="screen_login_error_refresh_tokens">"Гэты сервер настроены на выкарыстанне маркераў абнаўлення. Яны не падтрымліваюцца пры ўваходзе на аснове пароля."</string>
<string name="screen_login_error_unsupported_authentication">"Выбраны хатні сервер не падтрымлівае пароль або ўваход у OIDC. Калі ласка, звярніцеся да адміністратара або абярыце іншы хатні сервер."</string>
<string name="screen_login_form_header">"Увядзіце свае даныя"</string>
<string name="screen_login_subtitle">"Matrix - гэта адкрытая сетка для бяспечнай, дэцэнтралізаванай сувязі."</string>
@@ -38,4 +41,5 @@
Дзякуй за цярпенне!"</string>
<string name="screen_waitlist_message_success">"Вітаем у %1$s!"</string>
<string name="screen_waitlist_title">"Амаль гатова."</string>
<string name="screen_waitlist_title_success">"Вы зарэгістраваны."</string>
</resources>

View File

@@ -3,25 +3,28 @@
<string name="screen_account_provider_change">"Cambia fornitore dell\'account"</string>
<string name="screen_account_provider_form_hint">"Indirizzo dell\'homeserver"</string>
<string name="screen_account_provider_form_notice">"Inserisci un termine di ricerca o un indirizzo di dominio."</string>
<string name="screen_account_provider_form_subtitle">"Cerca un\' azienda, una comunità o un server privato."</string>
<string name="screen_account_provider_form_subtitle">"Cerca un\'azienda, una comunità o un server privato."</string>
<string name="screen_account_provider_form_title">"Trova un fornitore di account"</string>
<string name="screen_account_provider_signin_subtitle">"Qui è dove vivranno le tue conversazioni — proprio come useresti un fornitore di posta elettronica per conservare le tue email."</string>
<string name="screen_account_provider_signin_title">"Stai per accedere a %s"</string>
<string name="screen_account_provider_signup_subtitle">"Qui è dove vivranno le tue conversazioni — proprio come useresti un fornitore di posta elettronica per conservare le tue email."</string>
<string name="screen_account_provider_signup_title">"Stai per creare un account su %s"</string>
<string name="screen_change_account_provider_matrix_org_subtitle">"Matrix.org è un grande server gratuito nella rete pubblica Matrix per una comunicazione sicura e decentralizzata, gestito dalla Fondazione Matrix.org."</string>
<string name="screen_change_account_provider_matrix_org_subtitle">"Matrix.org è un grande server gratuito nella rete pubblica Matrix per una comunicazione sicura e decentralizzata, gestito da Matrix.org Foundation."</string>
<string name="screen_change_account_provider_other">"Altro"</string>
<string name="screen_change_account_provider_subtitle">"Utilizza un provider di account diverso, ad esempio il tuo server privato o un account di lavoro."</string>
<string name="screen_change_account_provider_title">"Cambia fornitore dell\'account"</string>
<string name="screen_change_server_error_invalid_homeserver">"Non siamo riusciti a raggiungere questo homserver. Verifica di aver inserito correttamente l\'URL del server domestico. Se l\'URL è corretto, contatta l\'amministratore del tuo server domestico per ulteriore assistenza."</string>
<string name="screen_change_server_error_no_sliding_sync_message">"Questo server attualmente non supporta la sincronizzazione scorrevole."</string>
<string name="screen_change_server_error_invalid_homeserver">"Non siamo riusciti a raggiungere questo homeserver. Verifica di aver inserito correttamente l\'URL. Se l\'URL è corretto, contatta l\'amministratore del homeserver per ulteriore assistenza."</string>
<string name="screen_change_server_error_invalid_well_known">"La sliding sync non è disponibile per un problema nel file well-known:
%1$s"</string>
<string name="screen_change_server_error_no_sliding_sync_message">"Questo server attualmente non supporta la sliding sync."</string>
<string name="screen_change_server_form_header">"URL dell\'homeserver"</string>
<string name="screen_change_server_form_notice">"Puoi connetterti solo a un server esistente che supporta la sincronizzazione scorrevole. L\'amministratore del tuo server domestico dovrà configurarlo. %1$s"</string>
<string name="screen_change_server_form_notice">"Puoi connetterti solo a un server esistente che supporta la sliding sync. L\'amministratore del tuo homeserver dovrà configurarla. %1$s"</string>
<string name="screen_change_server_subtitle">"Qual è l\'indirizzo del tuo server?"</string>
<string name="screen_change_server_title">"Seleziona il tuo server"</string>
<string name="screen_login_error_deactivated_account">"Questo profilo è stato disattivato."</string>
<string name="screen_login_error_deactivated_account">"Questo account è stato disattivato."</string>
<string name="screen_login_error_invalid_credentials">"Nome utente e/o password errati"</string>
<string name="screen_login_error_invalid_user_id">"Questo non è un identificatore utente valido. Formato previsto: \'@user:homeserver.org\'"</string>
<string name="screen_login_error_invalid_user_id">"Questo non è un identi utente valida. il formato atteso é: \'@user:homeserver.org\'"</string>
<string name="screen_login_error_refresh_tokens">"Questo server è configurato per usare i token di aggiornamento. Non sono supportati quando si usa l\'accesso basato su password."</string>
<string name="screen_login_error_unsupported_authentication">"L\'homeserver selezionato non supporta la password o l\'accesso OIDC. Contatta il tuo amministratore o scegli un altro homeserver."</string>
<string name="screen_login_form_header">"Inserisci i tuoi dati"</string>
<string name="screen_login_subtitle">"Matrix è una rete aperta per comunicazioni sicure e decentralizzate."</string>

View File

@@ -3,7 +3,7 @@
<string name="screen_signout_confirmation_dialog_content">"Sei sicuro di voler uscire?"</string>
<string name="screen_signout_confirmation_dialog_submit">"Disconnetti"</string>
<string name="screen_signout_confirmation_dialog_title">"Disconnetti"</string>
<string name="screen_signout_in_progress_dialog_content">"Uscita in corso…"</string>
<string name="screen_signout_in_progress_dialog_content">"Disconnessione in corso…"</string>
<string name="screen_signout_key_backup_disabled_subtitle">"Stai per disconnettere la tua ultima sessione. Se esci ora, perderai l\'accesso ai tuoi messaggi cifrati."</string>
<string name="screen_signout_key_backup_disabled_title">"Hai disattivato il backup"</string>
<string name="screen_signout_key_backup_offline_subtitle">"Il backup delle chiavi era ancora in corso quando sei andato offline. Riconnettiti per eseguire il backup delle chiavi prima di uscire."</string>

View File

@@ -445,7 +445,7 @@ class MessagesPresenter @AssistedInject constructor(
clipboardHelper.copyPlainText(content)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
snackbarDispatcher.post(SnackbarMessage(R.string.screen_room_message_copied))
snackbarDispatcher.post(SnackbarMessage(R.string.screen_room_timeline_message_copied))
}
}
}

View File

@@ -551,7 +551,7 @@ private fun CantSendMessageBanner() {
horizontalArrangement = Arrangement.Center
) {
Text(
text = stringResource(id = R.string.screen_room_no_permission_to_post),
text = stringResource(id = R.string.screen_room_timeline_no_permission_to_post),
color = MaterialTheme.colorScheme.onSecondary,
style = MaterialTheme.typography.bodyMedium,
textAlign = TextAlign.Center,

View File

@@ -101,14 +101,14 @@ fun ReportMessageView(
OutlinedTextField(
value = state.reason,
onValueChange = { state.eventSink(ReportMessageEvents.UpdateReason(it)) },
placeholder = { Text(stringResource(R.string.report_content_hint)) },
placeholder = { Text(stringResource(R.string.screen_report_content_hint)) },
enabled = !isSending,
modifier = Modifier
.fillMaxWidth()
.heightIn(min = 90.dp)
)
Text(
text = stringResource(R.string.report_content_explanation),
text = stringResource(R.string.screen_report_content_explanation),
style = ElementTheme.typography.fontBodySmRegular,
color = MaterialTheme.colorScheme.secondary,
textAlign = TextAlign.Start,

View File

@@ -94,6 +94,7 @@ class TimelinePresenter @AssistedInject constructor(
val timelineItems by timelineItemsFactory.collectItemsAsState()
val paginationState by timeline.paginationState.collectAsState()
val syncUpdateFlow = room.syncUpdateFlow.collectAsState()
val userHasPermissionToSendMessage by room.canSendMessageAsState(type = MessageEventType.ROOM_MESSAGE, updateKey = syncUpdateFlow.value)
val userHasPermissionToSendReaction by room.canSendMessageAsState(type = MessageEventType.REACTION, updateKey = syncUpdateFlow.value)
@@ -170,7 +171,7 @@ class TimelinePresenter @AssistedInject constructor(
val timelineRoomInfo by remember {
derivedStateOf {
TimelineRoomInfo(
isDirect = room.isDirect,
isDm = room.isDm,
userHasPermissionToSendMessage = userHasPermissionToSendMessage,
userHasPermissionToSendReaction = userHasPermissionToSendReaction,
)

View File

@@ -38,7 +38,7 @@ data class TimelineState(
@Immutable
data class TimelineRoomInfo(
val isDirect: Boolean,
val isDm: Boolean,
val userHasPermissionToSendMessage: Boolean,
val userHasPermissionToSendReaction: Boolean,
)

View File

@@ -235,10 +235,10 @@ internal fun aGroupedEvents(
}
internal fun aTimelineRoomInfo(
isDirect: Boolean = false,
isDm: Boolean = false,
userHasPermissionToSendMessage: Boolean = true,
) = TimelineRoomInfo(
isDirect = isDirect,
isDm = isDm,
userHasPermissionToSendMessage = userHasPermissionToSendMessage,
userHasPermissionToSendReaction = true,
)

View File

@@ -160,7 +160,7 @@ fun TimelineView(
}
}
}
if (state.paginationState.beginningOfRoomReached && !state.timelineRoomInfo.isDirect) {
if (state.paginationState.beginningOfRoomReached && !state.timelineRoomInfo.isDm) {
item(contentType = "BeginningOfRoomReached") {
TimelineItemRoomBeginningView(roomName = roomName)
}

View File

@@ -95,7 +95,7 @@ fun MessageEventBubble(
fun Modifier.offsetForItem(): Modifier {
return when {
state.isMine -> this
state.timelineRoomInfo.isDirect -> this
state.timelineRoomInfo.isDm -> this
else -> offset(x = BUBBLE_INCOMING_OFFSET)
}
}

View File

@@ -301,7 +301,7 @@ private fun TimelineItemEventRowContent(
// Sender
val avatarStrokeSize = 3.dp
if (event.showSenderInformation && !timelineRoomInfo.isDirect) {
if (event.showSenderInformation && !timelineRoomInfo.isDm) {
MessageSenderInformation(
event.safeSenderName,
event.senderAvatar,
@@ -371,7 +371,7 @@ private fun TimelineItemEventRowContent(
// In design we want a offset of 6.dp compare to the bubble, so start is 22.dp (16 + 6)
start = when {
event.isMine -> 22.dp
timelineRoomInfo.isDirect -> 22.dp
timelineRoomInfo.isDm -> 22.dp
else -> 22.dp + BUBBLE_INCOMING_OFFSET
},
end = 16.dp

View File

@@ -41,7 +41,7 @@ internal fun TimelineItemEventRowForDirectRoomPreview() = ElementPreview {
groupPosition = TimelineItemGroupPosition.First,
),
timelineRoomInfo = aTimelineRoomInfo(
isDirect = true,
isDm = true,
),
)
ATimelineItemEventRow(
@@ -53,7 +53,7 @@ internal fun TimelineItemEventRowForDirectRoomPreview() = ElementPreview {
groupPosition = TimelineItemGroupPosition.Last,
),
timelineRoomInfo = aTimelineRoomInfo(
isDirect = true,
isDm = true,
),
)
}

View File

@@ -113,7 +113,7 @@ private fun TimelineItemGroupedEventsRowContent(
Column(modifier = modifier.animateContentSize()) {
GroupHeaderView(
text = pluralStringResource(
id = R.plurals.room_timeline_state_changes,
id = R.plurals.screen_room_timeline_state_changes,
count = timelineItem.events.size,
timelineItem.events.size
),

View File

@@ -90,7 +90,13 @@ private fun TimelineItemReactionsView(
expandButton = {
MessagesReactionButton(
content = MessagesReactionsButtonContent.Text(
text = stringResource(id = if (expanded) R.string.screen_room_reactions_show_less else R.string.screen_room_reactions_show_more)
text = stringResource(
id = if (expanded) {
R.string.screen_room_timeline_reactions_show_less
} else {
R.string.screen_room_timeline_reactions_show_more
}
)
),
onClick = onToggleExpandClick,
onLongClick = {}

View File

@@ -44,7 +44,7 @@ internal fun TimelineItemReadMarkerView(
verticalArrangement = spacedBy(4.dp),
) {
Text(
text = stringResource(id = R.string.room_timeline_read_marker_title).uppercase(),
text = stringResource(id = R.string.screen_room_timeline_read_marker_title).uppercase(),
style = ElementTheme.typography.fontBodySmMedium,
color = ElementTheme.colors.textSecondary,
)

View File

@@ -45,9 +45,9 @@ fun TimelineItemRoomBeginningView(
contentAlignment = Alignment.Center,
) {
val text = if (roomName == null) {
stringResource(id = R.string.room_timeline_beginning_of_room_no_name)
stringResource(id = R.string.screen_room_timeline_beginning_of_room_no_name)
} else {
stringResource(id = R.string.room_timeline_beginning_of_room, roomName)
stringResource(id = R.string.screen_room_timeline_beginning_of_room, roomName)
}
Text(
color = MaterialTheme.colorScheme.secondary,

View File

@@ -8,18 +8,10 @@
<string name="emoji_picker_category_people">"Усмешкі &amp; Людзі"</string>
<string name="emoji_picker_category_places">"Падарожжы &amp; Месцы"</string>
<string name="emoji_picker_category_symbols">"Сімвалы"</string>
<string name="report_content_explanation">"Гэтае паведамленне будзе перададзена адміністратару вашага хатняга сервера. Яны не змогуць прачытаць зашыфраваныя паведамленні."</string>
<string name="report_content_hint">"Прычына, па якой вы паскардзіліся на гэты змест"</string>
<string name="room_timeline_beginning_of_room">"Гэта пачатак %1$s."</string>
<string name="room_timeline_beginning_of_room_no_name">"Гэта пачатак гэтай размовы."</string>
<string name="room_timeline_read_marker_title">"Новы"</string>
<plurals name="room_timeline_state_changes">
<item quantity="one">"%1$d змена ў пакоі"</item>
<item quantity="few">"%1$d змен у пакоі"</item>
<item quantity="many">"%1$d змен у пакоі"</item>
</plurals>
<string name="screen_report_content_block_user">"Заблакіраваць карыстальніка"</string>
<string name="screen_report_content_block_user_hint">"Адзначце, ці жадаеце вы схаваць усе бягучыя і будучыя паведамленні ад гэтага карыстальніка"</string>
<string name="screen_report_content_explanation">"Гэтае паведамленне будзе перададзена адміністратару вашага хатняга сервера. Яны не змогуць прачытаць зашыфраваныя паведамленні."</string>
<string name="screen_report_content_hint">"Прычына, па якой вы паскардзіліся на гэты змест"</string>
<string name="screen_room_attachment_source_camera">"Камера"</string>
<string name="screen_room_attachment_source_camera_photo">"Зрабіць фота"</string>
<string name="screen_room_attachment_source_camera_video">"Запісаць відэа"</string>
@@ -28,36 +20,36 @@
<string name="screen_room_attachment_source_location">"Месцазнаходжанне"</string>
<string name="screen_room_attachment_source_poll">"Апытанне"</string>
<string name="screen_room_attachment_text_formatting">"Фармаціраванне тэксту"</string>
<string name="screen_room_change_permissions_everyone">"Усе"</string>
<string name="screen_room_encrypted_history_banner">"Гісторыя паведамленняў зараз недаступна."</string>
<string name="screen_room_encrypted_history_banner_unverified">"Гісторыя паведамленняў у гэтым пакоі недаступная. Праверце гэтую прыладу, каб убачыць гісторыю паведамленняў."</string>
<string name="screen_room_error_failed_processing_media">"Не атрымалася апрацаваць медыяфайл для загрузкі, паспрабуйце яшчэ раз."</string>
<string name="screen_room_error_failed_retrieving_user_details">"Не ўдалося атрымаць інфармацыю пра карыстальніка"</string>
<string name="screen_room_invite_again_alert_message">"Вы жадаеце запрасіць іх назад?"</string>
<string name="screen_room_invite_again_alert_title">"Вы адзін у гэтым чаце"</string>
<string name="screen_room_mentions_at_room_subtitle">"Апавясціць увесь пакой"</string>
<string name="screen_room_mentions_at_room_title">"Усе"</string>
<string name="screen_room_message_copied">"Паведамленне скапіравана"</string>
<string name="screen_room_no_permission_to_post">"У вас няма дазволу публікаваць паведамленні ў гэтым пакоі"</string>
<string name="screen_room_notification_settings_allow_custom">"Дазволіць карыстальніцкую наладу"</string>
<string name="screen_room_notification_settings_allow_custom_footnote">"Калі гэта ўключыць, ваша налада па змаўчанні будзе адменена"</string>
<string name="screen_room_notification_settings_custom_settings_title">"Апавяшчаць мяне ў гэтым чаце для"</string>
<string name="screen_room_notification_settings_default_setting_footnote">"Вы можаце змяніць яго ў сваім %1$s."</string>
<string name="screen_room_notification_settings_default_setting_footnote_content_link">"глабальныя налады"</string>
<string name="screen_room_notification_settings_default_setting_title">"Налада па змаўчанні"</string>
<string name="screen_room_notification_settings_edit_remove_setting">"Выдаліць карыстальніцкую наладу"</string>
<string name="screen_room_notification_settings_error_loading_settings">"Падчас загрузкі налад апавяшчэнняў адбылася памылка."</string>
<string name="screen_room_notification_settings_error_restoring_default">"Не атрымалася аднавіць рэжым па змаўчанні, паспрабуйце яшчэ раз."</string>
<string name="screen_room_notification_settings_error_setting_mode">"Не ўдалося наладзіць рэжым, паспрабуйце яшчэ раз."</string>
<string name="screen_room_notification_settings_mentions_only_disclaimer">"Ваш хатні сервер не падтрымлівае гэту опцыю ў зашыфраваных пакоях, вы не атрымаеце апавяшчэнне ў гэтым пакоі."</string>
<string name="screen_room_notification_settings_mode_all_messages">"Усе паведамленні"</string>
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"Толькі згадванні і ключавыя словы"</string>
<string name="screen_room_notification_settings_room_custom_settings_title">"У гэтым пакоі паведаміце мяне пра"</string>
<string name="screen_room_reactions_show_less">"Паказаць менш"</string>
<string name="screen_room_reactions_show_more">"Паказаць больш"</string>
<string name="screen_room_retry_send_menu_send_again_action">"Адправіць зноў"</string>
<string name="screen_room_retry_send_menu_title">"Не ўдалося адправіць ваша паведамленне"</string>
<string name="screen_room_timeline_add_reaction">"Дадаць эмодзі"</string>
<string name="screen_room_timeline_beginning_of_room">"Гэта пачатак %1$s."</string>
<string name="screen_room_timeline_beginning_of_room_no_name">"Гэта пачатак гэтай размовы."</string>
<string name="screen_room_timeline_less_reactions">"Паказаць менш"</string>
<string name="screen_room_voice_message_tooltip">"Утрымлівайце для запісу"</string>
<string name="screen_room_timeline_message_copied">"Паведамленне скапіравана"</string>
<string name="screen_room_timeline_no_permission_to_post">"У вас няма дазволу публікаваць паведамленні ў гэтым пакоі"</string>
<string name="screen_room_timeline_reactions_show_less">"Паказаць менш"</string>
<string name="screen_room_timeline_reactions_show_more">"Паказаць больш"</string>
<string name="screen_room_timeline_read_marker_title">"Новы"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="one">"%1$d змена ў пакоі"</item>
<item quantity="few">"%1$d змен у пакоі"</item>
<item quantity="many">"%1$d змен у пакоі"</item>
</plurals>
<plurals name="screen_room_typing_many_members">
<item quantity="one">"%1$s, %2$s і %3$d іншы"</item>
<item quantity="many">"%1$s, %2$s і %3$d іншыя"</item>
</plurals>
<plurals name="screen_room_typing_notification">
<item quantity="one">"%1$s піша"</item>
<item quantity="few">"%1$s пішуць"</item>
<item quantity="many">"%1$s пішуць"</item>
</plurals>
<string name="screen_room_typing_two_members">"%1$s і %2$s"</string>
</resources>

View File

@@ -8,12 +8,6 @@
<string name="emoji_picker_category_people">"Усмивки &amp; Хора"</string>
<string name="emoji_picker_category_places">"Пътуване &amp; Места"</string>
<string name="emoji_picker_category_symbols">"Символи"</string>
<string name="room_timeline_beginning_of_room">"Това е началото на %1$s."</string>
<string name="room_timeline_beginning_of_room_no_name">"Това е началото на този разговор."</string>
<plurals name="room_timeline_state_changes">
<item quantity="one">"%1$d промяна в стаята"</item>
<item quantity="other">"%1$d промени в стаята"</item>
</plurals>
<string name="screen_report_content_block_user">"Блокиране на потребителя"</string>
<string name="screen_room_attachment_source_camera">"Камера"</string>
<string name="screen_room_attachment_source_camera_photo">"Снимка"</string>
@@ -24,15 +18,17 @@
<string name="screen_room_attachment_source_poll">"Анкета"</string>
<string name="screen_room_attachment_text_formatting">"Форматиране на текст"</string>
<string name="screen_room_encrypted_history_banner">"Хронологията на съобщенията не е налична в момента."</string>
<string name="screen_room_message_copied">"Съобщението е копирано"</string>
<string name="screen_room_notification_settings_custom_settings_title">"Да бъда известяван в този чат за"</string>
<string name="screen_room_notification_settings_mode_all_messages">"Всички съобщения"</string>
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"Само споменавания и ключови думи"</string>
<string name="screen_room_notification_settings_room_custom_settings_title">"В тази стая, да бъда известяван за"</string>
<string name="screen_room_reactions_show_less">"Показване на по-малко"</string>
<string name="screen_room_reactions_show_more">"Показване на повече"</string>
<string name="screen_room_timeline_add_reaction">"Добавяне на емоджи"</string>
<string name="screen_room_timeline_beginning_of_room">"Това е началото на %1$s."</string>
<string name="screen_room_timeline_beginning_of_room_no_name">"Това е началото на този разговор."</string>
<string name="screen_room_timeline_less_reactions">"Показване на по-малко"</string>
<string name="screen_room_timeline_message_copied">"Съобщението е копирано"</string>
<string name="screen_room_timeline_reactions_show_less">"Показване на по-малко"</string>
<string name="screen_room_timeline_reactions_show_more">"Показване на повече"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="one">"%1$d промяна в стаята"</item>
<item quantity="other">"%1$d промени в стаята"</item>
</plurals>
<plurals name="screen_room_typing_many_members">
<item quantity="one">"%1$s, %2$s и %3$d друг"</item>
<item quantity="other">"%1$s, %2$s и %3$d други"</item>

View File

@@ -8,18 +8,10 @@
<string name="emoji_picker_category_people">"Smajlíci a lidé"</string>
<string name="emoji_picker_category_places">"Cestování a místa"</string>
<string name="emoji_picker_category_symbols">"Symboly"</string>
<string name="report_content_explanation">"Tato zpráva bude nahlášena správci vašeho domovského serveru. Nebude si moci přečíst žádné šifrované zprávy."</string>
<string name="report_content_hint">"Důvod nahlášení tohoto obsahu"</string>
<string name="room_timeline_beginning_of_room">"Toto je začátek %1$s."</string>
<string name="room_timeline_beginning_of_room_no_name">"Toto je začátek této konverzace."</string>
<string name="room_timeline_read_marker_title">"Nové"</string>
<plurals name="room_timeline_state_changes">
<item quantity="one">"%1$d změna místnosti"</item>
<item quantity="few">"%1$d změny místnosti"</item>
<item quantity="other">"%1$d změn místnosti"</item>
</plurals>
<string name="screen_report_content_block_user">"Zablokovat uživatele"</string>
<string name="screen_report_content_block_user_hint">"Zaškrtněte, pokud chcete skrýt všechny aktuální a budoucí zprávy od tohoto uživatele"</string>
<string name="screen_report_content_explanation">"Tato zpráva bude nahlášena správci vašeho domovského serveru. Nebude si moci přečíst žádné šifrované zprávy."</string>
<string name="screen_report_content_hint">"Důvod nahlášení tohoto obsahu"</string>
<string name="screen_room_attachment_source_camera">"Fotoaparát"</string>
<string name="screen_room_attachment_source_camera_photo">"Vyfotit"</string>
<string name="screen_room_attachment_source_camera_video">"Natočit video"</string>
@@ -28,73 +20,28 @@
<string name="screen_room_attachment_source_location">"Poloha"</string>
<string name="screen_room_attachment_source_poll">"Hlasování"</string>
<string name="screen_room_attachment_text_formatting">"Formátování textu"</string>
<string name="screen_room_change_permissions_administrators">"Pouze správci"</string>
<string name="screen_room_change_permissions_ban_people">"Vykázat lidi"</string>
<string name="screen_room_change_permissions_delete_messages">"Odstranit zprávy"</string>
<string name="screen_room_change_permissions_everyone">"Všichni"</string>
<string name="screen_room_change_permissions_invite_people">"Pozvat lidi"</string>
<string name="screen_room_change_permissions_member_moderation">"Moderování členů"</string>
<string name="screen_room_change_permissions_messages_and_content">"Zprávy a obsah"</string>
<string name="screen_room_change_permissions_moderators">"Správci a moderátoři"</string>
<string name="screen_room_change_permissions_remove_people">"Odebrat lidi"</string>
<string name="screen_room_change_permissions_room_avatar">"Změnit avatar místnosti"</string>
<string name="screen_room_change_permissions_room_details">"Podrobnosti místnosti"</string>
<string name="screen_room_change_permissions_room_name">"Změnit název místnosti"</string>
<string name="screen_room_change_permissions_room_topic">"Změnit téma místnosti"</string>
<string name="screen_room_change_permissions_send_messages">"Odeslat zprávy"</string>
<string name="screen_room_change_role_administrators_title">"Upravit správce"</string>
<string name="screen_room_change_role_confirm_add_admin_description">"Tuto akci nebudete moci vrátit zpět. Upravujete oprávnění uživatele, tak aby měl stejnou úroveň jako vy."</string>
<string name="screen_room_change_role_confirm_add_admin_title">"Přidat správce?"</string>
<string name="screen_room_change_role_confirm_demote_self_action">"Degradovat"</string>
<string name="screen_room_change_role_confirm_demote_self_description">"Tuto změnu nebudete moci vrátit zpět, protože sami degradujete, pokud jste posledním privilegovaným uživatelem v místnosti, nebude možné znovu získat oprávnění."</string>
<string name="screen_room_change_role_confirm_demote_self_title">"Degradovat se?"</string>
<string name="screen_room_change_role_moderators_title">"Upravit moderátory"</string>
<string name="screen_room_change_role_unsaved_changes_description">"Máte neuložené změny."</string>
<string name="screen_room_change_role_unsaved_changes_title">"Uložit změny?"</string>
<string name="screen_room_encrypted_history_banner">"Historie zpráv je momentálně v této místnosti nedostupná"</string>
<string name="screen_room_encrypted_history_banner_unverified">"Historie zpráv není v této místnosti k dispozici. Ověřte toto zařízení, abyste viděli historii zpráv."</string>
<string name="screen_room_error_failed_processing_media">"Nahrání média se nezdařilo, zkuste to prosím znovu."</string>
<string name="screen_room_error_failed_retrieving_user_details">"Nepodařilo se načíst údaje o uživateli"</string>
<string name="screen_room_invite_again_alert_message">"Chtěli byste je pozvat zpět?"</string>
<string name="screen_room_invite_again_alert_title">"V tomto chatu jste sami"</string>
<string name="screen_room_mentions_at_room_subtitle">"Informujte celou místnost"</string>
<string name="screen_room_mentions_at_room_title">"Všichni"</string>
<string name="screen_room_message_copied">"Zpráva zkopírována"</string>
<string name="screen_room_no_permission_to_post">"Nemáte oprávnění zveřejňovat příspěvky v této místnosti"</string>
<string name="screen_room_notification_settings_allow_custom">"Povolit vlastní nastavení"</string>
<string name="screen_room_notification_settings_allow_custom_footnote">"Zapnutím této funkce přepíšete výchozí nastavení"</string>
<string name="screen_room_notification_settings_custom_settings_title">"Upozornit mě v tomto chatu na"</string>
<string name="screen_room_notification_settings_default_setting_footnote">"Můžete změnit ve vašem %1$s."</string>
<string name="screen_room_notification_settings_default_setting_footnote_content_link">"globální nastavení"</string>
<string name="screen_room_notification_settings_default_setting_title">"Výchozí nastavení"</string>
<string name="screen_room_notification_settings_edit_remove_setting">"Odebrat vlastní nastavení"</string>
<string name="screen_room_notification_settings_error_loading_settings">"Při načítání nastavení oznámení došlo k chybě."</string>
<string name="screen_room_notification_settings_error_restoring_default">"Obnovení výchozího režimu se nezdařilo, zkuste to prosím znovu."</string>
<string name="screen_room_notification_settings_error_setting_mode">"Nastavení režimu se nezdařilo, zkuste to prosím znovu."</string>
<string name="screen_room_notification_settings_mentions_only_disclaimer">"Váš domovský server tuto možnost nepodporuje v šifrovaných místnostech, v této místnosti nebudete dostávat upozornění."</string>
<string name="screen_room_notification_settings_mode_all_messages">"Všechny zprávy"</string>
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"Pouze zmínky a klíčová slova"</string>
<string name="screen_room_notification_settings_room_custom_settings_title">"V této místnosti mě upozornit na"</string>
<string name="screen_room_reactions_show_less">"Zobrazit méně"</string>
<string name="screen_room_reactions_show_more">"Zobrazit více"</string>
<string name="screen_room_retry_send_menu_send_again_action">"Odeslat znovu"</string>
<string name="screen_room_retry_send_menu_title">"Vaši zprávu se nepodařilo odeslat"</string>
<string name="screen_room_roles_and_permissions_admins">"Správci"</string>
<string name="screen_room_roles_and_permissions_change_my_role">"Změnit moji roli"</string>
<string name="screen_room_roles_and_permissions_change_role_demote_to_member">"Degradovat na člena"</string>
<string name="screen_room_roles_and_permissions_change_role_demote_to_moderator">"Degradovat na moderátora"</string>
<string name="screen_room_roles_and_permissions_member_moderation">"Moderování členů"</string>
<string name="screen_room_roles_and_permissions_messages_and_content">"Zprávy a obsah"</string>
<string name="screen_room_roles_and_permissions_moderators">"Moderátoři"</string>
<string name="screen_room_roles_and_permissions_permissions_header">"Oprávnění"</string>
<string name="screen_room_roles_and_permissions_reset">"Obnovit oprávnění"</string>
<string name="screen_room_roles_and_permissions_reset_confirm_description">"Po obnovení oprávnění ztratíte aktuální nastavení."</string>
<string name="screen_room_roles_and_permissions_reset_confirm_title">"Obnovit oprávnění?"</string>
<string name="screen_room_roles_and_permissions_roles_header">"Role"</string>
<string name="screen_room_roles_and_permissions_room_details">"Podrobnosti místnosti"</string>
<string name="screen_room_roles_and_permissions_title">"Role a oprávnění"</string>
<string name="screen_room_timeline_add_reaction">"Přidat emoji"</string>
<string name="screen_room_timeline_beginning_of_room">"Toto je začátek %1$s."</string>
<string name="screen_room_timeline_beginning_of_room_no_name">"Toto je začátek této konverzace."</string>
<string name="screen_room_timeline_less_reactions">"Zobrazit méně"</string>
<string name="screen_room_timeline_message_copied">"Zpráva zkopírována"</string>
<string name="screen_room_timeline_no_permission_to_post">"Nemáte oprávnění zveřejňovat příspěvky v této místnosti"</string>
<string name="screen_room_timeline_reactions_show_less">"Zobrazit méně"</string>
<string name="screen_room_timeline_reactions_show_more">"Zobrazit více"</string>
<string name="screen_room_timeline_read_marker_title">"Nové"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="one">"%1$d změna místnosti"</item>
<item quantity="few">"%1$d změny místnosti"</item>
<item quantity="other">"%1$d změn místnosti"</item>
</plurals>
<plurals name="screen_room_typing_many_members">
<item quantity="one">"%1$s, %2$s a %3$d další"</item>
<item quantity="few">"%1$s, %2$s a %3$d další"</item>
@@ -106,5 +53,4 @@
<item quantity="other">"%1$s píše"</item>
</plurals>
<string name="screen_room_typing_two_members">"%1$s a %2$s"</string>
<string name="screen_room_voice_message_tooltip">"Držte pro nahrávání"</string>
</resources>

View File

@@ -8,17 +8,10 @@
<string name="emoji_picker_category_people">"Smileys &amp; Menschen"</string>
<string name="emoji_picker_category_places">"Reisen &amp; Orte"</string>
<string name="emoji_picker_category_symbols">"Symbole"</string>
<string name="report_content_explanation">"Diese Meldung wird an den Administrator deines Homeservers weitergeleitet. Dieser kann keine verschlüsselten Nachrichten lesen."</string>
<string name="report_content_hint">"Grund für die Meldung dieses Inhalts"</string>
<string name="room_timeline_beginning_of_room">"Dies ist der Anfang von %1$s."</string>
<string name="room_timeline_beginning_of_room_no_name">"Dies ist der Anfang dieses Gesprächs."</string>
<string name="room_timeline_read_marker_title">"Neu"</string>
<plurals name="room_timeline_state_changes">
<item quantity="one">"%1$d Raumänderung"</item>
<item quantity="other">"%1$d Raumänderungen"</item>
</plurals>
<string name="screen_report_content_block_user">"Benutzer blockieren"</string>
<string name="screen_report_content_block_user_hint">"Prüfe, ob du alle aktuellen und zukünftigen Nachrichten dieses Benutzers ausblenden möchtest"</string>
<string name="screen_report_content_explanation">"Diese Meldung wird an den Administrator deines Homeservers weitergeleitet. Dieser kann keine verschlüsselten Nachrichten lesen."</string>
<string name="screen_report_content_hint">"Grund für die Meldung dieses Inhalts"</string>
<string name="screen_room_attachment_source_camera">"Kamera"</string>
<string name="screen_room_attachment_source_camera_photo">"Foto aufnehmen"</string>
<string name="screen_room_attachment_source_camera_video">"Video aufnehmen"</string>
@@ -27,54 +20,27 @@
<string name="screen_room_attachment_source_location">"Standort"</string>
<string name="screen_room_attachment_source_poll">"Umfrage"</string>
<string name="screen_room_attachment_text_formatting">"Textformatierung"</string>
<string name="screen_room_change_permissions_everyone">"Alle"</string>
<string name="screen_room_change_permissions_member_moderation">"Moderation der Mitglieder"</string>
<string name="screen_room_change_permissions_messages_and_content">"Nachrichten und Inhalte"</string>
<string name="screen_room_change_permissions_room_details">"Raumdetails"</string>
<string name="screen_room_change_role_confirm_add_admin_description">"Du vergibst das selbe Rolle, die auch Du hast. Diese Aktion kann daher nicht mehr rückgängig gemacht werden."</string>
<string name="screen_room_change_role_confirm_add_admin_title">"Als Administrator hinzufügen?"</string>
<string name="screen_room_change_role_confirm_demote_self_action">"Zurückstufen"</string>
<string name="screen_room_change_role_confirm_demote_self_description">"Du stufst dich selbst herab. Diese Änderung kann nicht rückgängig gemacht werden. Wenn du der letzte Benutzer mit dieser Rolle bist, ist es nicht möglich, diese Rolle wiederzuerlangen."</string>
<string name="screen_room_change_role_confirm_demote_self_title">"Möchtest Du Dich selbst herabstufen?"</string>
<string name="screen_room_encrypted_history_banner">"Der Nachrichtenverlauf ist derzeit in diesem Raum nicht verfügbar"</string>
<string name="screen_room_encrypted_history_banner_unverified">"Der Nachrichtenverlauf ist in diesem Raum nicht verfügbar. Verifiziere dieses Gerät, um deinen Nachrichtenverlauf zu sehen."</string>
<string name="screen_room_error_failed_processing_media">"Fehler beim Verarbeiten des hochgeladenen Mediums. Bitte versuche es erneut."</string>
<string name="screen_room_error_failed_retrieving_user_details">"Benutzerdetails konnten nicht abgerufen werden"</string>
<string name="screen_room_invite_again_alert_message">"Möchtest du sie wieder einladen?"</string>
<string name="screen_room_invite_again_alert_title">"Du bist allein in diesem Chat"</string>
<string name="screen_room_mentions_at_room_subtitle">"Den ganzen Raum benachrichtigen"</string>
<string name="screen_room_mentions_at_room_title">"Alle"</string>
<string name="screen_room_message_copied">"Nachricht wurde kopiert"</string>
<string name="screen_room_no_permission_to_post">"Du bist nicht berechtigt, in diesem Raum zu posten"</string>
<string name="screen_room_notification_settings_allow_custom">"Benutzerdefinierte Einstellungen verwenden"</string>
<string name="screen_room_notification_settings_allow_custom_footnote">"Wenn du diese Option aktivierst, wird deine Standardeinstellung außer Kraft gesetzt."</string>
<string name="screen_room_notification_settings_custom_settings_title">"Benachrichtige mich in diesem Chat bei"</string>
<string name="screen_room_notification_settings_default_setting_footnote">"Zum Anpassen der Standardeinstellungen gehe zu: %1$s"</string>
<string name="screen_room_notification_settings_default_setting_footnote_content_link">"Globale Einstellungen"</string>
<string name="screen_room_notification_settings_default_setting_title">"Standardeinstellung"</string>
<string name="screen_room_notification_settings_edit_remove_setting">"Benutzerdefinierte Einstellung entfernen"</string>
<string name="screen_room_notification_settings_error_loading_settings">"Beim Laden der Benachrichtigungseinstellungen ist ein Fehler aufgetreten."</string>
<string name="screen_room_notification_settings_error_restoring_default">"Fehler beim Wiederherstellen des Standardmodus. Bitte versuche es erneut."</string>
<string name="screen_room_notification_settings_error_setting_mode">"Fehler beim Einstellen des Modus. Bitte versuche es erneut."</string>
<string name="screen_room_notification_settings_mentions_only_disclaimer">"Dein Homeserver unterstützt diese Option in verschlüsselten Räumen nicht. Du wirst in diesem Raum nicht benachrichtigt."</string>
<string name="screen_room_notification_settings_mode_all_messages">"Alle Nachrichten"</string>
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"Nur Erwähnungen und Schlüsselwörter"</string>
<string name="screen_room_notification_settings_room_custom_settings_title">"Benachrichtige mich in diesem Raum bei"</string>
<string name="screen_room_reactions_show_less">"Weniger anzeigen"</string>
<string name="screen_room_reactions_show_more">"Mehr anzeigen"</string>
<string name="screen_room_retry_send_menu_send_again_action">"Erneut senden"</string>
<string name="screen_room_retry_send_menu_title">"Deine Nachricht konnte nicht gesendet werden"</string>
<string name="screen_room_roles_and_permissions_admins">"Administratoren"</string>
<string name="screen_room_roles_and_permissions_member_moderation">"Moderation der Mitglieder"</string>
<string name="screen_room_roles_and_permissions_messages_and_content">"Nachrichten und Inhalte"</string>
<string name="screen_room_roles_and_permissions_moderators">"Moderatoren"</string>
<string name="screen_room_roles_and_permissions_permissions_header">"Berechtigungen"</string>
<string name="screen_room_roles_and_permissions_reset">"Rollen und Berechtigungen zurücksetzen"</string>
<string name="screen_room_roles_and_permissions_roles_header">"Rollen"</string>
<string name="screen_room_roles_and_permissions_room_details">"Raumdetails"</string>
<string name="screen_room_roles_and_permissions_title">"Rollen und Berechtigungen"</string>
<string name="screen_room_timeline_add_reaction">"Emoji hinzufügen"</string>
<string name="screen_room_timeline_beginning_of_room">"Dies ist der Anfang von %1$s."</string>
<string name="screen_room_timeline_beginning_of_room_no_name">"Dies ist der Anfang dieses Gesprächs."</string>
<string name="screen_room_timeline_less_reactions">"Weniger anzeigen"</string>
<string name="screen_room_timeline_message_copied">"Nachricht wurde kopiert"</string>
<string name="screen_room_timeline_no_permission_to_post">"Du bist nicht berechtigt, in diesem Raum zu posten"</string>
<string name="screen_room_timeline_reactions_show_less">"Weniger anzeigen"</string>
<string name="screen_room_timeline_reactions_show_more">"Mehr anzeigen"</string>
<string name="screen_room_timeline_read_marker_title">"Neu"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="one">"%1$d Raumänderung"</item>
<item quantity="other">"%1$d Raumänderungen"</item>
</plurals>
<plurals name="screen_room_typing_many_members">
<item quantity="one">"%1$s, %2$s und %3$d weitere Person"</item>
<item quantity="other">"%1$s, %2$s und %3$d weitere Person"</item>
@@ -84,5 +50,4 @@
<item quantity="other">"%1$s schreiben…"</item>
</plurals>
<string name="screen_room_typing_two_members">"%1$s und %2$s"</string>
<string name="screen_room_voice_message_tooltip">"Zum Aufnehmen gedrückt halten"</string>
</resources>

View File

@@ -8,17 +8,10 @@
<string name="emoji_picker_category_people">"Emojis y personas"</string>
<string name="emoji_picker_category_places">"Viajes y lugares"</string>
<string name="emoji_picker_category_symbols">"Símbolos"</string>
<string name="report_content_explanation">"Este mensaje se notificará al administrador de su homeserver. No podrán leer ningún mensaje cifrado."</string>
<string name="report_content_hint">"Motivo para denunciar este contenido"</string>
<string name="room_timeline_beginning_of_room">"Este es el principio de %1$s."</string>
<string name="room_timeline_beginning_of_room_no_name">"Este es el principio de esta conversación."</string>
<string name="room_timeline_read_marker_title">"Nuevos"</string>
<plurals name="room_timeline_state_changes">
<item quantity="one">"%1$d cambio en la sala"</item>
<item quantity="other">"%1$d cambios en la sala"</item>
</plurals>
<string name="screen_report_content_block_user">"Bloquear usuario"</string>
<string name="screen_report_content_block_user_hint">"Marque si quieres ocultar todos los mensajes actuales y futuros de este usuario"</string>
<string name="screen_report_content_explanation">"Este mensaje se notificará al administrador de su homeserver. No podrán leer ningún mensaje cifrado."</string>
<string name="screen_report_content_hint">"Motivo para denunciar este contenido"</string>
<string name="screen_room_attachment_source_camera">"Cámara"</string>
<string name="screen_room_attachment_source_camera_photo">"Hacer foto"</string>
<string name="screen_room_attachment_source_camera_video">"Grabar video"</string>
@@ -27,36 +20,25 @@
<string name="screen_room_attachment_source_location">"Ubicación"</string>
<string name="screen_room_attachment_source_poll">"Encuesta"</string>
<string name="screen_room_attachment_text_formatting">"Formato de Texto"</string>
<string name="screen_room_change_permissions_everyone">"Todos"</string>
<string name="screen_room_encrypted_history_banner">"El historial de mensajes no está disponible en este momento."</string>
<string name="screen_room_encrypted_history_banner_unverified">"El historial de mensajes no está disponible en esta sala. Verifica este dispositivo para ver tu historial de mensajes."</string>
<string name="screen_room_error_failed_processing_media">"Error al procesar el contenido multimedia, por favor inténtalo de nuevo."</string>
<string name="screen_room_error_failed_retrieving_user_details">"No se pudieron recuperar los detalles del usuario"</string>
<string name="screen_room_invite_again_alert_message">"¿Quieres volver a invitarlos?"</string>
<string name="screen_room_invite_again_alert_title">"Estás solo en este chat"</string>
<string name="screen_room_mentions_at_room_subtitle">"Notificar a toda la sala"</string>
<string name="screen_room_mentions_at_room_title">"Todos"</string>
<string name="screen_room_message_copied">"Mensaje copiado"</string>
<string name="screen_room_no_permission_to_post">"No tienes permiso para publicar en esta sala"</string>
<string name="screen_room_notification_settings_allow_custom">"Permitir configuración personalizada"</string>
<string name="screen_room_notification_settings_allow_custom_footnote">"Si activas esta opción, anularás tu configuración por defecto"</string>
<string name="screen_room_notification_settings_custom_settings_title">"Notificarme en este chat para"</string>
<string name="screen_room_notification_settings_default_setting_footnote">"Puedes cambiarlo en tus %1$s."</string>
<string name="screen_room_notification_settings_default_setting_footnote_content_link">"ajustes globales"</string>
<string name="screen_room_notification_settings_default_setting_title">"Ajustes predeterminados"</string>
<string name="screen_room_notification_settings_edit_remove_setting">"Eliminar configuración personalizada"</string>
<string name="screen_room_notification_settings_error_loading_settings">"Se ha producido un error al cargar la configuración de las notificaciones."</string>
<string name="screen_room_notification_settings_error_restoring_default">"No se pudo restaurar el modo predeterminado, por favor vuelve a intentarlo de nuevo."</string>
<string name="screen_room_notification_settings_error_setting_mode">"No se pudo cambiar el modo, por favor inténtalo de nuevo."</string>
<string name="screen_room_notification_settings_mentions_only_disclaimer">"Tu servidor principal no admite esta opción en salas cifradas, no recibirás notificaciones en esta sala."</string>
<string name="screen_room_notification_settings_mode_all_messages">"Todos los mensajes"</string>
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"Únicamente Menciones y Palabras clave"</string>
<string name="screen_room_notification_settings_room_custom_settings_title">"En esta sala, notificarme por"</string>
<string name="screen_room_reactions_show_less">"Mostrar menos"</string>
<string name="screen_room_reactions_show_more">"Mostrar más"</string>
<string name="screen_room_retry_send_menu_send_again_action">"Enviar de nuevo"</string>
<string name="screen_room_retry_send_menu_title">"No se pudo enviar tu mensaje"</string>
<string name="screen_room_timeline_add_reaction">"Añadir emoji"</string>
<string name="screen_room_timeline_beginning_of_room">"Este es el principio de %1$s."</string>
<string name="screen_room_timeline_beginning_of_room_no_name">"Este es el principio de esta conversación."</string>
<string name="screen_room_timeline_less_reactions">"Mostrar menos"</string>
<string name="screen_room_voice_message_tooltip">"Mantén pulsado para grabar"</string>
<string name="screen_room_timeline_message_copied">"Mensaje copiado"</string>
<string name="screen_room_timeline_no_permission_to_post">"No tienes permiso para publicar en esta sala"</string>
<string name="screen_room_timeline_reactions_show_less">"Mostrar menos"</string>
<string name="screen_room_timeline_reactions_show_more">"Mostrar más"</string>
<string name="screen_room_timeline_read_marker_title">"Nuevos"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="one">"%1$d cambio en la sala"</item>
<item quantity="other">"%1$d cambios en la sala"</item>
</plurals>
</resources>

View File

@@ -8,17 +8,10 @@
<string name="emoji_picker_category_people">"Émoticônes et personnes"</string>
<string name="emoji_picker_category_places">"Voyages &amp; lieux"</string>
<string name="emoji_picker_category_symbols">"Symboles"</string>
<string name="report_content_explanation">"Ce message sera signalé à ladministrateur de votre serveur daccueil. Il ne pourra lire aucun message chiffré."</string>
<string name="report_content_hint">"Raison du signalement de ce contenu"</string>
<string name="room_timeline_beginning_of_room">"Ceci est le début de %1$s."</string>
<string name="room_timeline_beginning_of_room_no_name">"Ceci est le début de cette conversation."</string>
<string name="room_timeline_read_marker_title">"Nouveau"</string>
<plurals name="room_timeline_state_changes">
<item quantity="one">"%1$d changement dans le salon"</item>
<item quantity="other">"%1$d changements dans le salon"</item>
</plurals>
<string name="screen_report_content_block_user">"Bloquer lutilisateur"</string>
<string name="screen_report_content_block_user_hint">"Cochez si vous souhaitez masquer tous les messages actuels et futurs de cet utilisateur."</string>
<string name="screen_report_content_explanation">"Ce message sera signalé à ladministrateur de votre serveur daccueil. Il ne pourra lire aucun message chiffré."</string>
<string name="screen_report_content_hint">"Raison du signalement de ce contenu"</string>
<string name="screen_room_attachment_source_camera">"Appareil photo"</string>
<string name="screen_room_attachment_source_camera_photo">"Prendre une photo"</string>
<string name="screen_room_attachment_source_camera_video">"Enregistrer une vidéo"</string>
@@ -27,52 +20,27 @@
<string name="screen_room_attachment_source_location">"Position"</string>
<string name="screen_room_attachment_source_poll">"Sondage"</string>
<string name="screen_room_attachment_text_formatting">"Formatage du texte"</string>
<string name="screen_room_change_permissions_everyone">"Tout le monde"</string>
<string name="screen_room_change_permissions_room_avatar">"Changer lavatar du salon"</string>
<string name="screen_room_change_permissions_room_details">"Détails du salon"</string>
<string name="screen_room_change_permissions_room_name">"Changer le nom du salon"</string>
<string name="screen_room_change_permissions_room_topic">"Changer le sujet du salon"</string>
<string name="screen_room_change_role_confirm_add_admin_description">"Vous ne pourrez pas annuler cette action. Vous êtes en train de promouvoir lutilisateur pour quil ait le même niveau que vous."</string>
<string name="screen_room_change_role_confirm_add_admin_title">"Ajouter un administrateur ?"</string>
<string name="screen_room_change_role_confirm_demote_self_action">"Rétrograder"</string>
<string name="screen_room_change_role_confirm_demote_self_description">"Vous ne pourrez pas annuler ce changement car vous vous rétrogradez, si vous êtes le dernier utilisateur privilégié du salon il sera impossible de retrouver les privilèges."</string>
<string name="screen_room_change_role_confirm_demote_self_title">"Vous rétrograder ?"</string>
<string name="screen_room_encrypted_history_banner">"Lhistorique des messages nest actuellement pas disponible dans ce salon"</string>
<string name="screen_room_encrypted_history_banner_unverified">"Lhistorique de la discussion nest pas disponible. Vérifiez cette session pour accéder à lhistorique."</string>
<string name="screen_room_error_failed_processing_media">"Échec du traitement des médias à télécharger, veuillez réessayer."</string>
<string name="screen_room_error_failed_retrieving_user_details">"Impossible de récupérer les détails de lutilisateur"</string>
<string name="screen_room_invite_again_alert_message">"Souhaitez-vous inviter lancien membre à revenir ?"</string>
<string name="screen_room_invite_again_alert_title">"Vous êtes seul dans ce salon"</string>
<string name="screen_room_mentions_at_room_subtitle">"Notifier tout le salon"</string>
<string name="screen_room_mentions_at_room_title">"Tout le monde"</string>
<string name="screen_room_message_copied">"Message copié"</string>
<string name="screen_room_no_permission_to_post">"Vous nêtes pas autorisé à publier dans ce salon"</string>
<string name="screen_room_notification_settings_allow_custom">"Autoriser les paramètres personnalisés"</string>
<string name="screen_room_notification_settings_allow_custom_footnote">"Lactivation de cette option annulera votre paramètre par défaut"</string>
<string name="screen_room_notification_settings_custom_settings_title">"Prévenez-moi dans ce salon pour"</string>
<string name="screen_room_notification_settings_default_setting_footnote">"Vous pouvez le modifier dans votre %1$s."</string>
<string name="screen_room_notification_settings_default_setting_footnote_content_link">"paramètres globaux"</string>
<string name="screen_room_notification_settings_default_setting_title">"Paramètre par défaut"</string>
<string name="screen_room_notification_settings_edit_remove_setting">"Supprimer le paramètre personnalisé"</string>
<string name="screen_room_notification_settings_error_loading_settings">"Une erreur sest produite lors du chargement des paramètres de notification."</string>
<string name="screen_room_notification_settings_error_restoring_default">"Échec de la restauration du mode par défaut, veuillez réessayer."</string>
<string name="screen_room_notification_settings_error_setting_mode">"Échec de la configuration du mode, veuillez réessayer."</string>
<string name="screen_room_notification_settings_mentions_only_disclaimer">"Votre serveur daccueil ne supporte pas cette option pour les salons chiffrés, vous ne serez pas notifié(e) dans ce salon."</string>
<string name="screen_room_notification_settings_mode_all_messages">"Tous les messages"</string>
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"Mentions et mots clés uniquement"</string>
<string name="screen_room_notification_settings_room_custom_settings_title">"Dans ce salon, prévenez-moi pour"</string>
<string name="screen_room_reactions_show_less">"Afficher moins"</string>
<string name="screen_room_reactions_show_more">"Afficher plus"</string>
<string name="screen_room_retry_send_menu_send_again_action">"Envoyer à nouveau"</string>
<string name="screen_room_retry_send_menu_title">"Votre message na pas pu être envoyé"</string>
<string name="screen_room_roles_and_permissions_admins">"Administrateurs"</string>
<string name="screen_room_roles_and_permissions_moderators">"Modérateurs"</string>
<string name="screen_room_roles_and_permissions_permissions_header">"Autorisations"</string>
<string name="screen_room_roles_and_permissions_roles_header">"Rôles"</string>
<string name="screen_room_roles_and_permissions_room_details">"Détails du salon"</string>
<string name="screen_room_roles_and_permissions_title">"Rôles et autorisations"</string>
<string name="screen_room_timeline_add_reaction">"Ajouter un émoji"</string>
<string name="screen_room_timeline_beginning_of_room">"Ceci est le début de %1$s."</string>
<string name="screen_room_timeline_beginning_of_room_no_name">"Ceci est le début de cette conversation."</string>
<string name="screen_room_timeline_less_reactions">"Afficher moins"</string>
<string name="screen_room_timeline_message_copied">"Message copié"</string>
<string name="screen_room_timeline_no_permission_to_post">"Vous nêtes pas autorisé à publier dans ce salon"</string>
<string name="screen_room_timeline_reactions_show_less">"Afficher moins"</string>
<string name="screen_room_timeline_reactions_show_more">"Afficher plus"</string>
<string name="screen_room_timeline_read_marker_title">"Nouveau"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="one">"%1$d changement dans le salon"</item>
<item quantity="other">"%1$d changements dans le salon"</item>
</plurals>
<plurals name="screen_room_typing_many_members">
<item quantity="one">"%1$s, %2$s et %3$d autre"</item>
<item quantity="other">"%1$s, %2$s et %3$d autres"</item>
@@ -82,5 +50,4 @@
<item quantity="other">"%1$s écrivent"</item>
</plurals>
<string name="screen_room_typing_two_members">"%1$s et %2$s"</string>
<string name="screen_room_voice_message_tooltip">"Maintenir pour enregistrer"</string>
</resources>

View File

@@ -8,17 +8,10 @@
<string name="emoji_picker_category_people">"Mosolyok és emberek"</string>
<string name="emoji_picker_category_places">"Utazás és helyek"</string>
<string name="emoji_picker_category_symbols">"Szimbólumok"</string>
<string name="report_content_explanation">"Ez az üzenet jelentve lesz a Matrix-kiszolgáló rendszergazdájának. Nem fogja tudni elolvasni a titkosított üzeneteket."</string>
<string name="report_content_hint">"A tartalom jelentésének oka"</string>
<string name="room_timeline_beginning_of_room">"Ez a(z) %1$s kezdete."</string>
<string name="room_timeline_beginning_of_room_no_name">"Ez a beszélgetés kezdete."</string>
<string name="room_timeline_read_marker_title">"Új"</string>
<plurals name="room_timeline_state_changes">
<item quantity="one">"%1$d szobaváltozás"</item>
<item quantity="other">"%1$d szobaváltozás"</item>
</plurals>
<string name="screen_report_content_block_user">"Felhasználó letiltása"</string>
<string name="screen_report_content_block_user_hint">"Jelölje be, ha el akarja rejteni az összes jelenlegi és jövőbeli üzenetet ettől a felhasználótól"</string>
<string name="screen_report_content_explanation">"Ez az üzenet jelentve lesz a Matrix-kiszolgáló rendszergazdájának. Nem fogja tudni elolvasni a titkosított üzeneteket."</string>
<string name="screen_report_content_hint">"A tartalom jelentésének oka"</string>
<string name="screen_room_attachment_source_camera">"Kamera"</string>
<string name="screen_room_attachment_source_camera_photo">"Fénykép készítése"</string>
<string name="screen_room_attachment_source_camera_video">"Videó rögzítése"</string>
@@ -27,38 +20,27 @@
<string name="screen_room_attachment_source_location">"Hely"</string>
<string name="screen_room_attachment_source_poll">"Szavazás"</string>
<string name="screen_room_attachment_text_formatting">"Szövegformázás"</string>
<string name="screen_room_change_permissions_everyone">"Mindenki"</string>
<string name="screen_room_change_role_confirm_add_admin_title">"Adminisztrátor hozzáadása?"</string>
<string name="screen_room_encrypted_history_banner">"Az üzenetelőzmények jelenleg nem érhetők el."</string>
<string name="screen_room_encrypted_history_banner_unverified">"Az üzenetelőzmények nem érhetők el ebben a szobában. Ellenőrizze ezt az eszközt, hogy lássa az előzményeket."</string>
<string name="screen_room_error_failed_processing_media">"Nem sikerült feldolgozni a feltöltendő médiát, próbálja újra."</string>
<string name="screen_room_error_failed_retrieving_user_details">"Nem sikerült letölteni a felhasználói adatokat"</string>
<string name="screen_room_invite_again_alert_message">"Visszahívja?"</string>
<string name="screen_room_invite_again_alert_title">"Egyedül van ebben a csevegésben"</string>
<string name="screen_room_mentions_at_room_subtitle">"Az egész szoba értesítése"</string>
<string name="screen_room_mentions_at_room_title">"Mindenki"</string>
<string name="screen_room_message_copied">"Üzenet másolva"</string>
<string name="screen_room_no_permission_to_post">"Nincs jogosultsága arra, hogy bejegyzést tegyen közzé ebben a szobában"</string>
<string name="screen_room_notification_settings_allow_custom">"Egyéni beállítás engedélyezése"</string>
<string name="screen_room_notification_settings_allow_custom_footnote">"Ennek bekapcsolása felülírja az alapértelmezett beállítást"</string>
<string name="screen_room_notification_settings_custom_settings_title">"Értesítések kérése ebben a csevegésben ezekről:"</string>
<string name="screen_room_notification_settings_default_setting_footnote">"Megváltoztathatja a %1$s."</string>
<string name="screen_room_notification_settings_default_setting_footnote_content_link">"globális beállításokban"</string>
<string name="screen_room_notification_settings_default_setting_title">"Alapértelmezett beállítás"</string>
<string name="screen_room_notification_settings_edit_remove_setting">"Egyéni beállítás eltávolítása"</string>
<string name="screen_room_notification_settings_error_loading_settings">"Hiba történt az értesítési beállítások betöltésekor."</string>
<string name="screen_room_notification_settings_error_restoring_default">"Nem sikerült visszaállítani az alapértelmezett módot, próbálja újra."</string>
<string name="screen_room_notification_settings_error_setting_mode">"Nem sikerült a mód beállítása, próbálja újra."</string>
<string name="screen_room_notification_settings_mentions_only_disclaimer">"A Matrix-kiszolgálója nem támogatja ezt a beállítást a titkosított szobákban, egyes szobákban nem fog értesítéseket kapni."</string>
<string name="screen_room_notification_settings_mode_all_messages">"Összes üzenet"</string>
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"Csak említések és kulcsszavak"</string>
<string name="screen_room_notification_settings_room_custom_settings_title">"Ebben a szobában, értesítés ezekről:"</string>
<string name="screen_room_reactions_show_less">"Kevesebb megjelenítése"</string>
<string name="screen_room_reactions_show_more">"Több megjelenítése"</string>
<string name="screen_room_retry_send_menu_send_again_action">"Újraküldés"</string>
<string name="screen_room_retry_send_menu_title">"Az üzenet elküldése sikertelen"</string>
<string name="screen_room_timeline_add_reaction">"Emodzsi hozzáadása"</string>
<string name="screen_room_timeline_beginning_of_room">"Ez a(z) %1$s kezdete."</string>
<string name="screen_room_timeline_beginning_of_room_no_name">"Ez a beszélgetés kezdete."</string>
<string name="screen_room_timeline_less_reactions">"Kevesebb megjelenítése"</string>
<string name="screen_room_timeline_message_copied">"Üzenet másolva"</string>
<string name="screen_room_timeline_no_permission_to_post">"Nincs jogosultsága arra, hogy bejegyzést tegyen közzé ebben a szobában"</string>
<string name="screen_room_timeline_reactions_show_less">"Kevesebb megjelenítése"</string>
<string name="screen_room_timeline_reactions_show_more">"Több megjelenítése"</string>
<string name="screen_room_timeline_read_marker_title">"Új"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="one">"%1$d szobaváltozás"</item>
<item quantity="other">"%1$d szobaváltozás"</item>
</plurals>
<plurals name="screen_room_typing_many_members">
<item quantity="one">"%1$s, %2$s és %3$d további felhasználó"</item>
<item quantity="other">"%1$s, %2$s és %3$d további felhasználó"</item>
@@ -68,5 +50,4 @@
<item quantity="other">"%1$s éppen ír…"</item>
</plurals>
<string name="screen_room_typing_two_members">"%1$s és %2$s"</string>
<string name="screen_room_voice_message_tooltip">"Tartsa a rögzítéshez"</string>
</resources>

View File

@@ -8,16 +8,10 @@
<string name="emoji_picker_category_people">"Senyuman &amp; Orang"</string>
<string name="emoji_picker_category_places">"Wisata &amp; Tempat"</string>
<string name="emoji_picker_category_symbols">"Simbol"</string>
<string name="report_content_explanation">"Pesan ini akan dilaporkan ke administrator homeserver Anda. Mereka tidak akan dapat membaca pesan terenkripsi apa pun."</string>
<string name="report_content_hint">"Alasan melaporkan konten ini"</string>
<string name="room_timeline_beginning_of_room">"Ini adalah awal dari %1$s."</string>
<string name="room_timeline_beginning_of_room_no_name">"Ini adalah awal dari percakapan ini."</string>
<string name="room_timeline_read_marker_title">"Baru"</string>
<plurals name="room_timeline_state_changes">
<item quantity="other">"%1$d perubahan ruangan"</item>
</plurals>
<string name="screen_report_content_block_user">"Blokir pengguna"</string>
<string name="screen_report_content_block_user_hint">"Centang jika Anda ingin menyembunyikan semua pesan saat ini dan yang akan datang dari pengguna ini"</string>
<string name="screen_report_content_explanation">"Pesan ini akan dilaporkan ke administrator homeserver Anda. Mereka tidak akan dapat membaca pesan terenkripsi apa pun."</string>
<string name="screen_report_content_hint">"Alasan melaporkan konten ini"</string>
<string name="screen_room_attachment_source_camera">"Kamera"</string>
<string name="screen_room_attachment_source_camera_photo">"Ambil foto"</string>
<string name="screen_room_attachment_source_camera_video">"Rekam video"</string>
@@ -26,36 +20,24 @@
<string name="screen_room_attachment_source_location">"Lokasi"</string>
<string name="screen_room_attachment_source_poll">"Pemungutan suara"</string>
<string name="screen_room_attachment_text_formatting">"Pemformatan Teks"</string>
<string name="screen_room_change_permissions_everyone">"Semua orang"</string>
<string name="screen_room_encrypted_history_banner">"Riwayat pesan saat ini tidak tersedia di ruangan ini"</string>
<string name="screen_room_encrypted_history_banner_unverified">"Riwayat pesan tidak tersedia di ruangan ini. Verifikasi perangkat ini untuk melihat riwayat pesan."</string>
<string name="screen_room_error_failed_processing_media">"Gagal memproses media untuk diunggah, silakan coba lagi."</string>
<string name="screen_room_error_failed_retrieving_user_details">"Tidak dapat mengambil detail pengguna"</string>
<string name="screen_room_invite_again_alert_message">"Apakah Anda ingin mengundang mereka kembali?"</string>
<string name="screen_room_invite_again_alert_title">"Anda sendirian di obrolan ini"</string>
<string name="screen_room_mentions_at_room_subtitle">"Beri tahu seluruh ruangan"</string>
<string name="screen_room_mentions_at_room_title">"Semua orang"</string>
<string name="screen_room_message_copied">"Pesan disalin"</string>
<string name="screen_room_no_permission_to_post">"Anda tidak memiliki izin untuk mengirim di ruangan ini"</string>
<string name="screen_room_notification_settings_allow_custom">"Izinkan pengaturan khusus"</string>
<string name="screen_room_notification_settings_allow_custom_footnote">"Mengaktifkan ini akan mengganti pengaturan bawaan Anda"</string>
<string name="screen_room_notification_settings_custom_settings_title">"Beri tahu saya di obrolan ini tentang"</string>
<string name="screen_room_notification_settings_default_setting_footnote">"Anda dapat mengubahnya di %1$s Anda."</string>
<string name="screen_room_notification_settings_default_setting_footnote_content_link">"pengaturan global"</string>
<string name="screen_room_notification_settings_default_setting_title">"Pengaturan bawaan"</string>
<string name="screen_room_notification_settings_edit_remove_setting">"Hapus pengaturan khusus"</string>
<string name="screen_room_notification_settings_error_loading_settings">"Terjadi kesalahan saat memuat pengaturan pemberitahuan."</string>
<string name="screen_room_notification_settings_error_restoring_default">"Gagal memulihkan mode bawaan, silakan coba lagi."</string>
<string name="screen_room_notification_settings_error_setting_mode">"Gagal mengatur mode, silakan coba lagi."</string>
<string name="screen_room_notification_settings_mentions_only_disclaimer">"Homeserver Anda tidak mendukung opsi ini dalam ruangan terenkripsi, Anda tidak akan diberi tahu dalam ruangan ini."</string>
<string name="screen_room_notification_settings_mode_all_messages">"Semua pesan"</string>
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"Sebutan dan Kata Kunci saja"</string>
<string name="screen_room_notification_settings_room_custom_settings_title">"Di ruangan ini, beri tahu saya tentang"</string>
<string name="screen_room_reactions_show_less">"Tampilkan lebih sedikit"</string>
<string name="screen_room_reactions_show_more">"Tampilkan lebih banyak"</string>
<string name="screen_room_retry_send_menu_send_again_action">"Kirim ulang"</string>
<string name="screen_room_retry_send_menu_title">"Pesan Anda gagal dikirim"</string>
<string name="screen_room_timeline_add_reaction">"Tambahkan emoji"</string>
<string name="screen_room_timeline_beginning_of_room">"Ini adalah awal dari %1$s."</string>
<string name="screen_room_timeline_beginning_of_room_no_name">"Ini adalah awal dari percakapan ini."</string>
<string name="screen_room_timeline_less_reactions">"Tampilkan lebih sedikit"</string>
<string name="screen_room_voice_message_tooltip">"Tahan untuk merekam"</string>
<string name="screen_room_timeline_message_copied">"Pesan disalin"</string>
<string name="screen_room_timeline_no_permission_to_post">"Anda tidak memiliki izin untuk mengirim di ruangan ini"</string>
<string name="screen_room_timeline_reactions_show_less">"Tampilkan lebih sedikit"</string>
<string name="screen_room_timeline_reactions_show_more">"Tampilkan lebih banyak"</string>
<string name="screen_room_timeline_read_marker_title">"Baru"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="other">"%1$d perubahan ruangan"</item>
</plurals>
</resources>

View File

@@ -8,17 +8,10 @@
<string name="emoji_picker_category_people">"Faccine &amp; Persone"</string>
<string name="emoji_picker_category_places">"Viaggi &amp; Luoghi"</string>
<string name="emoji_picker_category_symbols">"Simboli"</string>
<string name="report_content_explanation">"Questo messaggio verrà segnalato all\'amministratore dell\'homeserver. Questi non sarà in grado di leggere i messaggi criptati."</string>
<string name="report_content_hint">"Motivo della segnalazione di questo contenuto"</string>
<string name="room_timeline_beginning_of_room">"Questo è l\'inizio di %1$s."</string>
<string name="room_timeline_beginning_of_room_no_name">"Questo è l\'inizio della conversazione."</string>
<string name="room_timeline_read_marker_title">"Nuovo"</string>
<plurals name="room_timeline_state_changes">
<item quantity="one">"%1$d modifica alla stanza"</item>
<item quantity="other">"%1$d modifiche alla stanza"</item>
</plurals>
<string name="screen_report_content_block_user">"Blocca utente"</string>
<string name="screen_report_content_block_user_hint">"Seleziona se vuoi nascondere tutti i messaggi attuali e futuri di questo utente"</string>
<string name="screen_report_content_explanation">"Questo messaggio verrà segnalato all\'amministratore dell\'homeserver. Questi non sarà in grado di leggere i messaggi cifrati."</string>
<string name="screen_report_content_hint">"Motivo della segnalazione di questo contenuto"</string>
<string name="screen_room_attachment_source_camera">"Fotocamera"</string>
<string name="screen_room_attachment_source_camera_photo">"Scatta foto"</string>
<string name="screen_room_attachment_source_camera_video">"Registra video"</string>
@@ -27,37 +20,27 @@
<string name="screen_room_attachment_source_location">"Posizione"</string>
<string name="screen_room_attachment_source_poll">"Sondaggio"</string>
<string name="screen_room_attachment_text_formatting">"Formattazione del testo"</string>
<string name="screen_room_change_permissions_everyone">"Tutti"</string>
<string name="screen_room_encrypted_history_banner">"La cronologia dei messaggi non è attualmente disponibile."</string>
<string name="screen_room_encrypted_history_banner_unverified">"La cronologia dei messaggi non è disponibile in questa stanza. Verifica questo dispositivo per vedere la cronologia dei messaggi."</string>
<string name="screen_room_error_failed_processing_media">"Elaborazione del file multimediale da caricare fallita, riprova."</string>
<string name="screen_room_error_failed_retrieving_user_details">"Impossibile recuperare i dettagli dell\'utente"</string>
<string name="screen_room_invite_again_alert_message">"Vorresti invitarli di nuovo?"</string>
<string name="screen_room_invite_again_alert_title">"Ci sei solo tu in questa chat"</string>
<string name="screen_room_mentions_at_room_subtitle">"Avvisa l\'intera stanza"</string>
<string name="screen_room_mentions_at_room_subtitle">"Notifica l\'intera stanza"</string>
<string name="screen_room_mentions_at_room_title">"Tutti"</string>
<string name="screen_room_message_copied">"Messaggio copiato"</string>
<string name="screen_room_no_permission_to_post">"Non sei autorizzato a postare in questa stanza"</string>
<string name="screen_room_notification_settings_allow_custom">"Consenti impostazione personalizzata"</string>
<string name="screen_room_notification_settings_allow_custom_footnote">"L\'attivazione di questa opzione sovrascriverà l\'impostazione predefinita"</string>
<string name="screen_room_notification_settings_custom_settings_title">"Avvisami in questa chat per"</string>
<string name="screen_room_notification_settings_default_setting_footnote">"Puoi cambiarlo nelle tue %1$s."</string>
<string name="screen_room_notification_settings_default_setting_footnote_content_link">"impostazioni globali"</string>
<string name="screen_room_notification_settings_default_setting_title">"Impostazione predefinita"</string>
<string name="screen_room_notification_settings_edit_remove_setting">"Rimuovi l\'impostazione personalizzata"</string>
<string name="screen_room_notification_settings_error_loading_settings">"Si è verificato un errore durante il caricamento delle impostazioni di notifica."</string>
<string name="screen_room_notification_settings_error_restoring_default">"Ripristino della modalità predefinita fallito, riprova."</string>
<string name="screen_room_notification_settings_error_setting_mode">"Impossibile impostare la modalità, riprova."</string>
<string name="screen_room_notification_settings_mentions_only_disclaimer">"Il tuo homeserver non supporta questa opzione nelle stanze criptate, quindi non riceverai notifiche in questa stanza."</string>
<string name="screen_room_notification_settings_mode_all_messages">"Tutti i messaggi"</string>
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"Solo menzioni e parole chiave"</string>
<string name="screen_room_notification_settings_room_custom_settings_title">"In questa stanza, avvisami per"</string>
<string name="screen_room_reactions_show_less">"Mostra meno"</string>
<string name="screen_room_reactions_show_more">"Mostra di più"</string>
<string name="screen_room_retry_send_menu_send_again_action">"Invia di nuovo"</string>
<string name="screen_room_retry_send_menu_title">"Il tuo messaggio non è stato inviato"</string>
<string name="screen_room_timeline_add_reaction">"Aggiungi emoji"</string>
<string name="screen_room_timeline_beginning_of_room">"Questo è l\'inizio di %1$s."</string>
<string name="screen_room_timeline_beginning_of_room_no_name">"Questo è l\'inizio della conversazione."</string>
<string name="screen_room_timeline_less_reactions">"Mostra meno"</string>
<string name="screen_room_timeline_message_copied">"Messaggio copiato"</string>
<string name="screen_room_timeline_no_permission_to_post">"Non sei autorizzato a postare in questa stanza"</string>
<string name="screen_room_timeline_reactions_show_less">"Mostra meno"</string>
<string name="screen_room_timeline_reactions_show_more">"Mostra di più"</string>
<string name="screen_room_timeline_read_marker_title">"Nuovo"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="one">"%1$d modifica alla stanza"</item>
<item quantity="other">"%1$d modifiche alla stanza"</item>
</plurals>
<plurals name="screen_room_typing_many_members">
<item quantity="one">"%1$s, %2$s e %3$d altro"</item>
<item quantity="other">"%1$s, %2$s e altri %3$d"</item>
@@ -67,5 +50,4 @@
<item quantity="other">"%1$s stanno scrivendo"</item>
</plurals>
<string name="screen_room_typing_two_members">"%1$s e %2$s"</string>
<string name="screen_room_voice_message_tooltip">"Tieni premuto per registrare"</string>
</resources>

View File

@@ -8,18 +8,10 @@
<string name="emoji_picker_category_people">"Fețe zâmbitoare &amp; Oameni"</string>
<string name="emoji_picker_category_places">"Călătorii &amp; Locuri"</string>
<string name="emoji_picker_category_symbols">"Simboluri"</string>
<string name="report_content_explanation">"Acest mesaj va fi raportat administratorilor homeserver-ului tau. Ei nu vor putea citi niciun mesaj criptat."</string>
<string name="report_content_hint">"Motivul raportării acestui conținut"</string>
<string name="room_timeline_beginning_of_room">"Acesta este începutul conversației %1$s."</string>
<string name="room_timeline_beginning_of_room_no_name">"Acesta este începutul acestei conversații."</string>
<string name="room_timeline_read_marker_title">"Nou"</string>
<plurals name="room_timeline_state_changes">
<item quantity="one">"%1$d schimbare a camerii"</item>
<item quantity="few">"%1$d schimbări ale camerei"</item>
<item quantity="other">"%1$d schimbări ale camerei"</item>
</plurals>
<string name="screen_report_content_block_user">"Blocați utilizatorul"</string>
<string name="screen_report_content_block_user_hint">"Confirmați că doriți să ascundeți toate mesajele curente și viitoare de la acest utilizator"</string>
<string name="screen_report_content_explanation">"Acest mesaj va fi raportat administratorilor homeserver-ului tau. Ei nu vor putea citi niciun mesaj criptat."</string>
<string name="screen_report_content_hint">"Motivul raportării acestui conținut"</string>
<string name="screen_room_attachment_source_camera">"Cameră foto"</string>
<string name="screen_room_attachment_source_camera_photo">"Faceți o fotografie"</string>
<string name="screen_room_attachment_source_camera_video">"Înregistrați un videoclip"</string>
@@ -28,37 +20,28 @@
<string name="screen_room_attachment_source_location">"Locație"</string>
<string name="screen_room_attachment_source_poll">"Sondaj"</string>
<string name="screen_room_attachment_text_formatting">"Formatarea textului"</string>
<string name="screen_room_change_permissions_everyone">"Toți"</string>
<string name="screen_room_encrypted_history_banner">"Istoricul mesajelor este momentan indisponibil în această cameră"</string>
<string name="screen_room_encrypted_history_banner_unverified">"Istoricul mesajelor nu este disponibil în această cameră. Verificați acest dispozitiv pentru a vedea istoricul mesajelor."</string>
<string name="screen_room_error_failed_processing_media">"Procesarea datelor media a eșuat, vă rugăm să încercați din nou."</string>
<string name="screen_room_error_failed_retrieving_user_details">"Nu am putut găsi detaliile utilizatorului"</string>
<string name="screen_room_invite_again_alert_message">"Doriți să îi invitați înapoi?"</string>
<string name="screen_room_invite_again_alert_title">"Sunteți singur în această cameră"</string>
<string name="screen_room_mentions_at_room_subtitle">"Notificați întreaga cameră"</string>
<string name="screen_room_mentions_at_room_title">"Toți"</string>
<string name="screen_room_message_copied">"Mesaj copiat"</string>
<string name="screen_room_no_permission_to_post">"Nu aveți permisiunea de a posta în această cameră"</string>
<string name="screen_room_notification_settings_allow_custom">"Permiteți setări personalizate"</string>
<string name="screen_room_notification_settings_allow_custom_footnote">"Activarea acestei opțiuni va anula setările implicite."</string>
<string name="screen_room_notification_settings_custom_settings_title">"Anunțați-mă în acestă cameră pentru"</string>
<string name="screen_room_notification_settings_default_setting_footnote">"Îl puteți schimba în %1$s."</string>
<string name="screen_room_notification_settings_default_setting_footnote_content_link">"Setări generale"</string>
<string name="screen_room_notification_settings_default_setting_title">"Setare implicită"</string>
<string name="screen_room_notification_settings_edit_remove_setting">"Stergeți setarea personalizată"</string>
<string name="screen_room_notification_settings_error_loading_settings">"A apărut o eroare la încărcarea setărilor pentry notificari."</string>
<string name="screen_room_notification_settings_error_restoring_default">"Nu s-a reușit restaurarea modului implicit, vă rugăm să încercați din nou."</string>
<string name="screen_room_notification_settings_error_setting_mode">"Nu s-a reușit setarea modului, vă rugăm să încercați din nou."</string>
<string name="screen_room_notification_settings_mentions_only_disclaimer">"Serverul dumneavoastră nu acceptă această opțiune în camerele criptate, nu veți primi notificări în această cameră."</string>
<string name="screen_room_notification_settings_mode_all_messages">"Toate mesajele"</string>
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"Numai mențiuni și cuvinte cheie"</string>
<string name="screen_room_notification_settings_room_custom_settings_title">"În această cameră, anunțați-mă pentru"</string>
<string name="screen_room_reactions_show_less">"Afișați mai puțin"</string>
<string name="screen_room_reactions_show_more">"Afișați mai mult"</string>
<string name="screen_room_retry_send_menu_send_again_action">"Trimiteți din nou"</string>
<string name="screen_room_retry_send_menu_title">"Mesajul dvs. nu a putut fi trimis"</string>
<string name="screen_room_timeline_add_reaction">"Adăugați emoji"</string>
<string name="screen_room_timeline_beginning_of_room">"Acesta este începutul conversației %1$s."</string>
<string name="screen_room_timeline_beginning_of_room_no_name">"Acesta este începutul acestei conversații."</string>
<string name="screen_room_timeline_less_reactions">"Afișați mai puțin"</string>
<string name="screen_room_timeline_message_copied">"Mesaj copiat"</string>
<string name="screen_room_timeline_no_permission_to_post">"Nu aveți permisiunea de a posta în această cameră"</string>
<string name="screen_room_timeline_reactions_show_less">"Afișați mai puțin"</string>
<string name="screen_room_timeline_reactions_show_more">"Afișați mai mult"</string>
<string name="screen_room_timeline_read_marker_title">"Nou"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="one">"%1$d schimbare a camerii"</item>
<item quantity="few">"%1$d schimbări ale camerei"</item>
<item quantity="other">"%1$d schimbări ale camerei"</item>
</plurals>
<plurals name="screen_room_typing_many_members">
<item quantity="one">"%1$s, %2$s și încă %3$d"</item>
<item quantity="few">"%1$s, %2$s și încă %3$d"</item>
@@ -70,5 +53,4 @@
<item quantity="other">"%1$s scriu"</item>
</plurals>
<string name="screen_room_typing_two_members">"%1$s și %2$s"</string>
<string name="screen_room_voice_message_tooltip">"Țineți apăsat pentru a înregistra"</string>
</resources>

View File

@@ -8,18 +8,10 @@
<string name="emoji_picker_category_people">"Улыбки и люди"</string>
<string name="emoji_picker_category_places">"Путешествия и места"</string>
<string name="emoji_picker_category_symbols">"Символы"</string>
<string name="report_content_explanation">"Это сообщение будет передано администратору вашего домашнего сервера. Они не смогут прочитать зашифрованные сообщения."</string>
<string name="report_content_hint">"Причина, по которой вы пожаловались на этот контент"</string>
<string name="room_timeline_beginning_of_room">"Это начало %1$s."</string>
<string name="room_timeline_beginning_of_room_no_name">"Это начало разговора."</string>
<string name="room_timeline_read_marker_title">"Новый"</string>
<plurals name="room_timeline_state_changes">
<item quantity="one">"%1$d изменение в комнате"</item>
<item quantity="few">"%1$d изменения в комнате"</item>
<item quantity="many">"%1$d изменений в комнате"</item>
</plurals>
<string name="screen_report_content_block_user">"Заблокировать пользователя"</string>
<string name="screen_report_content_block_user_hint">"Отметьте, хотите ли вы скрыть все текущие и будущие сообщения от этого пользователя"</string>
<string name="screen_report_content_explanation">"Это сообщение будет передано администратору вашего домашнего сервера. Они не смогут прочитать зашифрованные сообщения."</string>
<string name="screen_report_content_hint">"Причина, по которой вы пожаловались на этот контент"</string>
<string name="screen_room_attachment_source_camera">"Камера"</string>
<string name="screen_room_attachment_source_camera_photo">"Сделать фото"</string>
<string name="screen_room_attachment_source_camera_video">"Записать видео"</string>
@@ -28,73 +20,28 @@
<string name="screen_room_attachment_source_location">"Местоположение"</string>
<string name="screen_room_attachment_source_poll">"Опрос"</string>
<string name="screen_room_attachment_text_formatting">"Форматирование текста"</string>
<string name="screen_room_change_permissions_administrators">"Только для администраторов"</string>
<string name="screen_room_change_permissions_ban_people">"Заблокировать людей"</string>
<string name="screen_room_change_permissions_delete_messages">"Удалить сообщения"</string>
<string name="screen_room_change_permissions_everyone">"Для всех"</string>
<string name="screen_room_change_permissions_invite_people">"Пригласить людей"</string>
<string name="screen_room_change_permissions_member_moderation">"Модерация участников"</string>
<string name="screen_room_change_permissions_messages_and_content">"Сообщения и содержание"</string>
<string name="screen_room_change_permissions_moderators">"Администраторы и модераторы"</string>
<string name="screen_room_change_permissions_remove_people">"Удалить людей"</string>
<string name="screen_room_change_permissions_room_avatar">"Изменить изображение комнаты"</string>
<string name="screen_room_change_permissions_room_details">"Информация о комнате"</string>
<string name="screen_room_change_permissions_room_name">"Изменить название комнаты"</string>
<string name="screen_room_change_permissions_room_topic">"Сменить тему комнаты"</string>
<string name="screen_room_change_permissions_send_messages">"Отправить сообщение"</string>
<string name="screen_room_change_role_administrators_title">"Редактировать роль администраторов"</string>
<string name="screen_room_change_role_confirm_add_admin_description">"Вы не сможете отменить это действие. Вы устанавливаете уровень пользователю соответствующий вашему."</string>
<string name="screen_room_change_role_confirm_add_admin_title">"Добавить администратора?"</string>
<string name="screen_room_change_role_confirm_demote_self_action">"Понизить уровень"</string>
<string name="screen_room_change_role_confirm_demote_self_description">"Вы не сможете отменить это изменение, так как понижаете себя статус. Если вы являетесь последним привилегированным пользователем в комнате, восстановить привилегии будет невозможно."</string>
<string name="screen_room_change_role_confirm_demote_self_title">"Понизить свой уровень?"</string>
<string name="screen_room_change_role_moderators_title">"Редактировать роль модераторов"</string>
<string name="screen_room_change_role_unsaved_changes_description">"У вас есть несохраненные изменения."</string>
<string name="screen_room_change_role_unsaved_changes_title">"Сохранить изменения?"</string>
<string name="screen_room_encrypted_history_banner">"В настоящее время история сообщений недоступна в этой комнате."</string>
<string name="screen_room_encrypted_history_banner_unverified">"История сообщений в этой комнате недоступна. Проверьте это устройство, чтобы увидеть историю сообщений."</string>
<string name="screen_room_error_failed_processing_media">"Не удалось обработать медиафайл для загрузки, попробуйте еще раз."</string>
<string name="screen_room_error_failed_retrieving_user_details">"Не удалось получить данные о пользователе"</string>
<string name="screen_room_invite_again_alert_message">"Хотите пригласить их снова?"</string>
<string name="screen_room_invite_again_alert_title">"Вы одни в этой комнате"</string>
<string name="screen_room_mentions_at_room_subtitle">"Уведомить всю комнату"</string>
<string name="screen_room_mentions_at_room_title">"Для всех"</string>
<string name="screen_room_message_copied">"Сообщение скопировано"</string>
<string name="screen_room_no_permission_to_post">"У вас нет разрешения публиковать сообщения в этой комнате"</string>
<string name="screen_room_notification_settings_allow_custom">"Разрешить пользовательские настройки"</string>
<string name="screen_room_notification_settings_allow_custom_footnote">"Включение этого параметра отменяет настройки по умолчанию"</string>
<string name="screen_room_notification_settings_custom_settings_title">"Уведомить меня в этом чате"</string>
<string name="screen_room_notification_settings_default_setting_footnote">"Вы можете изменить его в своем %1$s."</string>
<string name="screen_room_notification_settings_default_setting_footnote_content_link">"основные настройки"</string>
<string name="screen_room_notification_settings_default_setting_title">"Настройка по умолчанию"</string>
<string name="screen_room_notification_settings_edit_remove_setting">"Удалить пользовательскую настройку"</string>
<string name="screen_room_notification_settings_error_loading_settings">"Произошла ошибка при загрузке настроек уведомлений."</string>
<string name="screen_room_notification_settings_error_restoring_default">"Не удалось восстановить режим по умолчанию, попробуйте еще раз."</string>
<string name="screen_room_notification_settings_error_setting_mode">"Не удалось настроить режим, попробуйте еще раз."</string>
<string name="screen_room_notification_settings_mentions_only_disclaimer">"Ваш домашний сервер не поддерживает эту опцию в зашифрованных комнатах, вы не будете получать уведомления в этой комнате."</string>
<string name="screen_room_notification_settings_mode_all_messages">"Все сообщения"</string>
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"Только упоминания и ключевые слова"</string>
<string name="screen_room_notification_settings_room_custom_settings_title">"В этой комнате уведомить меня о"</string>
<string name="screen_room_reactions_show_less">"Показать меньше"</string>
<string name="screen_room_reactions_show_more">"Показать больше"</string>
<string name="screen_room_retry_send_menu_send_again_action">"Отправить снова"</string>
<string name="screen_room_retry_send_menu_title">"Не удалось отправить ваше сообщение"</string>
<string name="screen_room_roles_and_permissions_admins">"Администраторы"</string>
<string name="screen_room_roles_and_permissions_change_my_role">"Измените мою роль"</string>
<string name="screen_room_roles_and_permissions_change_role_demote_to_member">"Понижение до участника"</string>
<string name="screen_room_roles_and_permissions_change_role_demote_to_moderator">"Понизить до модератора"</string>
<string name="screen_room_roles_and_permissions_member_moderation">"Модерация участников"</string>
<string name="screen_room_roles_and_permissions_messages_and_content">"Сообщения и содержание"</string>
<string name="screen_room_roles_and_permissions_moderators">"Модераторы"</string>
<string name="screen_room_roles_and_permissions_permissions_header">"Разрешения"</string>
<string name="screen_room_roles_and_permissions_reset">"Сбросить разрешения"</string>
<string name="screen_room_roles_and_permissions_reset_confirm_description">"Как только вы сбросите разрешения, вы потеряете текущие настройки."</string>
<string name="screen_room_roles_and_permissions_reset_confirm_title">"Сбросить разрешения?"</string>
<string name="screen_room_roles_and_permissions_roles_header">"Роли"</string>
<string name="screen_room_roles_and_permissions_room_details">"Информация о комнате"</string>
<string name="screen_room_roles_and_permissions_title">"Роли и разрешения"</string>
<string name="screen_room_timeline_add_reaction">"Добавить эмодзи"</string>
<string name="screen_room_timeline_beginning_of_room">"Это начало %1$s."</string>
<string name="screen_room_timeline_beginning_of_room_no_name">"Это начало разговора."</string>
<string name="screen_room_timeline_less_reactions">"Показать меньше"</string>
<string name="screen_room_timeline_message_copied">"Сообщение скопировано"</string>
<string name="screen_room_timeline_no_permission_to_post">"У вас нет разрешения публиковать сообщения в этой комнате"</string>
<string name="screen_room_timeline_reactions_show_less">"Показать меньше"</string>
<string name="screen_room_timeline_reactions_show_more">"Показать больше"</string>
<string name="screen_room_timeline_read_marker_title">"Новый"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="one">"%1$d изменение в комнате"</item>
<item quantity="few">"%1$d изменения в комнате"</item>
<item quantity="many">"%1$d изменений в комнате"</item>
</plurals>
<plurals name="screen_room_typing_many_members">
<item quantity="one">"%1$s, %2$s и %3$d"</item>
<item quantity="few">"%1$s, %2$s и другие %3$d"</item>
@@ -106,5 +53,4 @@
<item quantity="many">"%1$s набирают сообщения"</item>
</plurals>
<string name="screen_room_typing_two_members">"%1$s и %2$s"</string>
<string name="screen_room_voice_message_tooltip">"Удерживайте для записи"</string>
</resources>

View File

@@ -8,18 +8,10 @@
<string name="emoji_picker_category_people">"Smajlíky a ľudia"</string>
<string name="emoji_picker_category_places">"Cestovanie a miesta"</string>
<string name="emoji_picker_category_symbols">"Symboly"</string>
<string name="report_content_explanation">"Táto správa bude nahlásená správcovi vášho domovského servera. Nebude môcť prečítať žiadne šifrované správy."</string>
<string name="report_content_hint">"Dôvod nahlásenia tohto obsahu"</string>
<string name="room_timeline_beginning_of_room">"Toto je začiatok %1$s."</string>
<string name="room_timeline_beginning_of_room_no_name">"Toto je začiatok tejto konverzácie."</string>
<string name="room_timeline_read_marker_title">"Nové"</string>
<plurals name="room_timeline_state_changes">
<item quantity="one">"%1$d zmena miestnosti"</item>
<item quantity="few">"%1$d zmeny miestnosti"</item>
<item quantity="other">"%1$d zmien miestnosti"</item>
</plurals>
<string name="screen_report_content_block_user">"Zablokovať používateľa"</string>
<string name="screen_report_content_block_user_hint">"Označte, či chcete skryť všetky aktuálne a budúce správy od tohto používateľa"</string>
<string name="screen_report_content_explanation">"Táto správa bude nahlásená správcovi vášho domovského servera. Nebude môcť prečítať žiadne šifrované správy."</string>
<string name="screen_report_content_hint">"Dôvod nahlásenia tohto obsahu"</string>
<string name="screen_room_attachment_source_camera">"Kamera"</string>
<string name="screen_room_attachment_source_camera_photo">"Urobiť fotku"</string>
<string name="screen_room_attachment_source_camera_video">"Nahrať video"</string>
@@ -28,73 +20,28 @@
<string name="screen_room_attachment_source_location">"Poloha"</string>
<string name="screen_room_attachment_source_poll">"Anketa"</string>
<string name="screen_room_attachment_text_formatting">"Formátovanie textu"</string>
<string name="screen_room_change_permissions_administrators">"Iba správcovia"</string>
<string name="screen_room_change_permissions_ban_people">"Zakázať ľudí"</string>
<string name="screen_room_change_permissions_delete_messages">"Odstrániť správy"</string>
<string name="screen_room_change_permissions_everyone">"Všetci"</string>
<string name="screen_room_change_permissions_invite_people">"Pozvať ľudí"</string>
<string name="screen_room_change_permissions_member_moderation">"Moderovanie členov"</string>
<string name="screen_room_change_permissions_messages_and_content">"Správy a obsah"</string>
<string name="screen_room_change_permissions_moderators">"Správcovia a moderátori"</string>
<string name="screen_room_change_permissions_remove_people">"Odstrániť ľudí"</string>
<string name="screen_room_change_permissions_room_avatar">"Zmeniť obrázok miestnosti"</string>
<string name="screen_room_change_permissions_room_details">"Podrobnosti o miestnosti"</string>
<string name="screen_room_change_permissions_room_name">"Zmeniť názov miestnosti"</string>
<string name="screen_room_change_permissions_room_topic">"Zmeniť tému miestnosti"</string>
<string name="screen_room_change_permissions_send_messages">"Odoslať správy"</string>
<string name="screen_room_change_role_administrators_title">"Upraviť správcov"</string>
<string name="screen_room_change_role_confirm_add_admin_description">"Túto akciu nebudete môcť vrátiť späť. Zvyšujete úroveň používateľa na rovnakú úroveň výkonu ako máte vy."</string>
<string name="screen_room_change_role_confirm_add_admin_title">"Pridať správcu?"</string>
<string name="screen_room_change_role_confirm_demote_self_action">"Znížiť"</string>
<string name="screen_room_change_role_confirm_demote_self_description">"Túto zmenu nebudete môcť vrátiť späť, pretože znižujete svoju úroveň. Ak ste posledným privilegovaným používateľom v miestnosti, nebude možné získať znova oprávnenia."</string>
<string name="screen_room_change_role_confirm_demote_self_title">"Znížiť svoju úroveň?"</string>
<string name="screen_room_change_role_moderators_title">"Upraviť moderátorov"</string>
<string name="screen_room_change_role_unsaved_changes_description">"Máte neuložené zmeny."</string>
<string name="screen_room_change_role_unsaved_changes_title">"Uložiť zmeny?"</string>
<string name="screen_room_encrypted_history_banner">"História správ v tejto miestnosti nie je momentálne k dispozícii"</string>
<string name="screen_room_encrypted_history_banner_unverified">"História správ nie je v tejto miestnosti k dispozícii. Ak chcete zobraziť históriu správ, overte toto zariadenie."</string>
<string name="screen_room_error_failed_processing_media">"Nepodarilo sa spracovať médiá na odoslanie, skúste to prosím znova."</string>
<string name="screen_room_error_failed_retrieving_user_details">"Nepodarilo sa získať údaje o používateľovi"</string>
<string name="screen_room_invite_again_alert_message">"Chceli by ste ich pozvať späť?"</string>
<string name="screen_room_invite_again_alert_title">"V tomto rozhovore ste sami"</string>
<string name="screen_room_mentions_at_room_subtitle">"Informovať celú miestnosť"</string>
<string name="screen_room_mentions_at_room_title">"Všetci"</string>
<string name="screen_room_message_copied">"Správa skopírovaná"</string>
<string name="screen_room_no_permission_to_post">"Nemáte povolenie uverejňovať príspevky v tejto miestnosti"</string>
<string name="screen_room_notification_settings_allow_custom">"Povoliť vlastné nastavenie"</string>
<string name="screen_room_notification_settings_allow_custom_footnote">"Zapnutím tohto nastavenia sa prepíše vaše predvolené nastavenie"</string>
<string name="screen_room_notification_settings_custom_settings_title">"Upozorniť ma v tejto konverzácii na"</string>
<string name="screen_room_notification_settings_default_setting_footnote">"Môžete to zmeniť vo svojich %1$s."</string>
<string name="screen_room_notification_settings_default_setting_footnote_content_link">"všeobecných nastaveniach"</string>
<string name="screen_room_notification_settings_default_setting_title">"Predvolené nastavenie"</string>
<string name="screen_room_notification_settings_edit_remove_setting">"Odstrániť vlastné nastavenie"</string>
<string name="screen_room_notification_settings_error_loading_settings">"Pri načítavaní nastavení oznámení došlo k chybe."</string>
<string name="screen_room_notification_settings_error_restoring_default">"Nepodarilo sa obnoviť predvolený režim, skúste to prosím znova."</string>
<string name="screen_room_notification_settings_error_setting_mode">"Nepodarilo sa nastaviť režim, skúste to prosím znova."</string>
<string name="screen_room_notification_settings_mentions_only_disclaimer">"Váš domovský server nepodporuje túto možnosť v šifrovaných miestnostiach, v tejto miestnosti nedostanete upozornenie."</string>
<string name="screen_room_notification_settings_mode_all_messages">"Všetky správy"</string>
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"Iba zmienky a kľúčové slová"</string>
<string name="screen_room_notification_settings_room_custom_settings_title">"V tejto miestnosti ma upozorniť na"</string>
<string name="screen_room_reactions_show_less">"Zobraziť menej"</string>
<string name="screen_room_reactions_show_more">"Zobraziť viac"</string>
<string name="screen_room_retry_send_menu_send_again_action">"Odoslať znova"</string>
<string name="screen_room_retry_send_menu_title">"Vašu správu sa nepodarilo odoslať"</string>
<string name="screen_room_roles_and_permissions_admins">"Správcovia"</string>
<string name="screen_room_roles_and_permissions_change_my_role">"Zmeniť moje oprávnenia"</string>
<string name="screen_room_roles_and_permissions_change_role_demote_to_member">"Znížiť úroveň na člena"</string>
<string name="screen_room_roles_and_permissions_change_role_demote_to_moderator">"Znížiť úroveň na moderátora"</string>
<string name="screen_room_roles_and_permissions_member_moderation">"Moderovanie členov"</string>
<string name="screen_room_roles_and_permissions_messages_and_content">"Správy a obsah"</string>
<string name="screen_room_roles_and_permissions_moderators">"Moderátori"</string>
<string name="screen_room_roles_and_permissions_permissions_header">"Oprávnenia"</string>
<string name="screen_room_roles_and_permissions_reset">"Obnoviť povolenia"</string>
<string name="screen_room_roles_and_permissions_reset_confirm_description">"Po obnovení oprávnení prídete o aktuálne nastavenia."</string>
<string name="screen_room_roles_and_permissions_reset_confirm_title">"Obnoviť oprávnenia?"</string>
<string name="screen_room_roles_and_permissions_roles_header">"Roly"</string>
<string name="screen_room_roles_and_permissions_room_details">"Podrobnosti o miestnosti"</string>
<string name="screen_room_roles_and_permissions_title">"Roly a povolenia"</string>
<string name="screen_room_timeline_add_reaction">"Pridať emoji"</string>
<string name="screen_room_timeline_beginning_of_room">"Toto je začiatok %1$s."</string>
<string name="screen_room_timeline_beginning_of_room_no_name">"Toto je začiatok tejto konverzácie."</string>
<string name="screen_room_timeline_less_reactions">"Zobraziť menej"</string>
<string name="screen_room_timeline_message_copied">"Správa skopírovaná"</string>
<string name="screen_room_timeline_no_permission_to_post">"Nemáte povolenie uverejňovať príspevky v tejto miestnosti"</string>
<string name="screen_room_timeline_reactions_show_less">"Zobraziť menej"</string>
<string name="screen_room_timeline_reactions_show_more">"Zobraziť viac"</string>
<string name="screen_room_timeline_read_marker_title">"Nové"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="one">"%1$d zmena miestnosti"</item>
<item quantity="few">"%1$d zmeny miestnosti"</item>
<item quantity="other">"%1$d zmien miestnosti"</item>
</plurals>
<plurals name="screen_room_typing_many_members">
<item quantity="one">"%1$s, %2$s a %3$d ďalší"</item>
<item quantity="few">"%1$s, %2$s a %3$d ďalší"</item>
@@ -106,5 +53,4 @@
<item quantity="other">"%1$s píšu"</item>
</plurals>
<string name="screen_room_typing_two_members">"%1$s a %2$s"</string>
<string name="screen_room_voice_message_tooltip">"Podržaním nahrajte"</string>
</resources>

View File

@@ -8,17 +8,10 @@
<string name="emoji_picker_category_people">"Smileys &amp; personer"</string>
<string name="emoji_picker_category_places">"Resor &amp; platser"</string>
<string name="emoji_picker_category_symbols">"Symboler"</string>
<string name="report_content_explanation">"Det här meddelandet kommer att rapporteras till din hemservers administratör. Denne kommer inte att kunna läsa några krypterade meddelanden."</string>
<string name="report_content_hint">"Anledning till att rapportera detta innehåll"</string>
<string name="room_timeline_beginning_of_room">"Det här är början på %1$s."</string>
<string name="room_timeline_beginning_of_room_no_name">"Detta är början på det här samtalet."</string>
<string name="room_timeline_read_marker_title">"Nytt"</string>
<plurals name="room_timeline_state_changes">
<item quantity="one">"%1$d rumsändring"</item>
<item quantity="other">"%1$d rumsändringar"</item>
</plurals>
<string name="screen_report_content_block_user">"Blockera användare"</string>
<string name="screen_report_content_block_user_hint">"Markera om du vill dölja alla nuvarande och framtida meddelanden från denna användare"</string>
<string name="screen_report_content_explanation">"Det här meddelandet kommer att rapporteras till din hemservers administratör. Denne kommer inte att kunna läsa några krypterade meddelanden."</string>
<string name="screen_report_content_hint">"Anledning till att rapportera detta innehåll"</string>
<string name="screen_room_attachment_source_camera">"Kamera"</string>
<string name="screen_room_attachment_source_camera_photo">"Ta ett foto"</string>
<string name="screen_room_attachment_source_camera_video">"Spela in video"</string>
@@ -27,33 +20,23 @@
<string name="screen_room_attachment_source_location">"Plats"</string>
<string name="screen_room_attachment_source_poll">"Omröstning"</string>
<string name="screen_room_attachment_text_formatting">"Textformatering"</string>
<string name="screen_room_change_permissions_everyone">"Alla"</string>
<string name="screen_room_encrypted_history_banner">"Meddelandehistoriken är för närvarande otillgänglig."</string>
<string name="screen_room_error_failed_processing_media">"Misslyckades att bearbeta media för uppladdning, vänligen pröva igen."</string>
<string name="screen_room_error_failed_retrieving_user_details">"Kunde inte hämta användarinformation"</string>
<string name="screen_room_invite_again_alert_message">"Vill du bjuda tillbaka dem?"</string>
<string name="screen_room_invite_again_alert_title">"Du är ensam i den här chatten"</string>
<string name="screen_room_mentions_at_room_title">"Alla"</string>
<string name="screen_room_message_copied">"Meddelande kopierat"</string>
<string name="screen_room_no_permission_to_post">"Du är inte behörig att göra inlägg i det här rummet"</string>
<string name="screen_room_notification_settings_allow_custom">"Tillåt anpassad inställning"</string>
<string name="screen_room_notification_settings_allow_custom_footnote">"Om du aktiverar detta åsidosätts din standardinställning"</string>
<string name="screen_room_notification_settings_custom_settings_title">"Meddela mig i den här chatten för"</string>
<string name="screen_room_notification_settings_default_setting_footnote">"Du kan ändra det i dina %1$s ."</string>
<string name="screen_room_notification_settings_default_setting_footnote_content_link">"globala inställningar"</string>
<string name="screen_room_notification_settings_default_setting_title">"Standardinställning"</string>
<string name="screen_room_notification_settings_edit_remove_setting">"Ta bort anpassad inställning"</string>
<string name="screen_room_notification_settings_error_loading_settings">"Ett fel uppstod vid laddning av aviseringsinställningarna."</string>
<string name="screen_room_notification_settings_error_restoring_default">"Misslyckades att återställa standardläget, vänligen försök igen."</string>
<string name="screen_room_notification_settings_error_setting_mode">"Misslyckades att ställa in läget, vänligen pröva igen."</string>
<string name="screen_room_notification_settings_mode_all_messages">"Alla meddelanden"</string>
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"Endast omnämnanden och nyckelord"</string>
<string name="screen_room_notification_settings_room_custom_settings_title">"I det här rummet, meddela mig för"</string>
<string name="screen_room_reactions_show_less">"Visa mindre"</string>
<string name="screen_room_reactions_show_more">"Visa mer"</string>
<string name="screen_room_retry_send_menu_send_again_action">"Skicka igen"</string>
<string name="screen_room_retry_send_menu_title">"Ditt meddelande kunde inte skickas"</string>
<string name="screen_room_timeline_add_reaction">"Lägg till emoji"</string>
<string name="screen_room_timeline_beginning_of_room">"Det här är början på %1$s."</string>
<string name="screen_room_timeline_beginning_of_room_no_name">"Detta är början på det här samtalet."</string>
<string name="screen_room_timeline_less_reactions">"Visa mindre"</string>
<string name="screen_room_voice_message_tooltip">"Håll för att spela in"</string>
<string name="screen_room_timeline_message_copied">"Meddelande kopierat"</string>
<string name="screen_room_timeline_no_permission_to_post">"Du är inte behörig att göra inlägg i det här rummet"</string>
<string name="screen_room_timeline_reactions_show_less">"Visa mindre"</string>
<string name="screen_room_timeline_reactions_show_more">"Visa mer"</string>
<string name="screen_room_timeline_read_marker_title">"Nytt"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="one">"%1$d rumsändring"</item>
<item quantity="other">"%1$d rumsändringar"</item>
</plurals>
</resources>

View File

@@ -8,18 +8,10 @@
<string name="emoji_picker_category_people">"Смайлики та люди"</string>
<string name="emoji_picker_category_places">"Подорожі та місця"</string>
<string name="emoji_picker_category_symbols">"Символи"</string>
<string name="report_content_explanation">"Це повідомлення буде надіслано адміністратору вашого домашнього сервера. Він (вона) не зможе прочитати жодні зашифровані повідомлення."</string>
<string name="report_content_hint">"Причина скарги на цей вміст"</string>
<string name="room_timeline_beginning_of_room">"Це початок %1$s"</string>
<string name="room_timeline_beginning_of_room_no_name">"Це початок цієї розмови."</string>
<string name="room_timeline_read_marker_title">"Нове"</string>
<plurals name="room_timeline_state_changes">
<item quantity="one">"%1$d зміна в кімнаті"</item>
<item quantity="few">"%1$d зміни в кімнаті"</item>
<item quantity="many">"%1$d змін у кімнаті"</item>
</plurals>
<string name="screen_report_content_block_user">"Заблокувати користувача"</string>
<string name="screen_report_content_block_user_hint">"Перевірте, чи хочете Ви приховати всі поточні та майбутні повідомлення від цього користувача"</string>
<string name="screen_report_content_explanation">"Це повідомлення буде надіслано адміністратору вашого домашнього сервера. Він (вона) не зможе прочитати жодні зашифровані повідомлення."</string>
<string name="screen_report_content_hint">"Причина скарги на цей вміст"</string>
<string name="screen_room_attachment_source_camera">"Камера"</string>
<string name="screen_room_attachment_source_camera_photo">"Зробити фото"</string>
<string name="screen_room_attachment_source_camera_video">"Записати відео"</string>
@@ -28,66 +20,28 @@
<string name="screen_room_attachment_source_location">"Розташування"</string>
<string name="screen_room_attachment_source_poll">"Опитування"</string>
<string name="screen_room_attachment_text_formatting">"Форматування тексту"</string>
<string name="screen_room_change_permissions_administrators">"Тільки для адміністраторів"</string>
<string name="screen_room_change_permissions_ban_people">"Заблоковувати людей"</string>
<string name="screen_room_change_permissions_delete_messages">"Видалити повідомлення"</string>
<string name="screen_room_change_permissions_everyone">"Усі"</string>
<string name="screen_room_change_permissions_invite_people">"Запросити людей"</string>
<string name="screen_room_change_permissions_member_moderation">"Модерація учасників"</string>
<string name="screen_room_change_permissions_messages_and_content">"Повідомлення та зміст"</string>
<string name="screen_room_change_permissions_moderators">"Адміністратори та модератори"</string>
<string name="screen_room_change_permissions_remove_people">"Видалити людей"</string>
<string name="screen_room_change_permissions_room_avatar">"Змінити аватар кімнати"</string>
<string name="screen_room_change_permissions_room_details">"Деталі кімнати"</string>
<string name="screen_room_change_permissions_room_name">"Змінити назву кімнати"</string>
<string name="screen_room_change_permissions_room_topic">"Змінити тему кімнати"</string>
<string name="screen_room_change_permissions_send_messages">"Надіслати повідомлення"</string>
<string name="screen_room_change_role_administrators_title">"Керувати адмінами"</string>
<string name="screen_room_change_role_confirm_add_admin_description">"Ви не зможете скасувати цю дію. Ви просуваєте користувача, щоб він мав такий же рівень прав, як і ви."</string>
<string name="screen_room_change_role_confirm_add_admin_title">"Додати адміністратора?"</string>
<string name="screen_room_change_role_confirm_demote_self_action">"Понизити"</string>
<string name="screen_room_change_role_confirm_demote_self_description">"Ви не зможете скасувати цю зміну, оскільки ви знижуєте себе, якщо ви останній привілейований користувач у кімнаті, відновити привілеї буде неможливо."</string>
<string name="screen_room_change_role_confirm_demote_self_title">"Понизити себе?"</string>
<string name="screen_room_change_role_moderators_title">"Керувати модераторами"</string>
<string name="screen_room_encrypted_history_banner">"Історія повідомлень наразі недоступна."</string>
<string name="screen_room_encrypted_history_banner_unverified">"Історія повідомлень недоступна в цій кімнаті. Перевірте цей пристрій, щоб побачити історію повідомлень."</string>
<string name="screen_room_error_failed_processing_media">"Не вдалося обробити медіафайл для завантаження, спробуйте ще раз."</string>
<string name="screen_room_error_failed_retrieving_user_details">"Не вдалося отримати дані користувача"</string>
<string name="screen_room_invite_again_alert_message">"Чи хотіли б Ви запросити їх знову?"</string>
<string name="screen_room_invite_again_alert_title">"Ви одні в цьому чаті"</string>
<string name="screen_room_mentions_at_room_subtitle">"Сповістіть усю кімнату"</string>
<string name="screen_room_mentions_at_room_title">"Усі"</string>
<string name="screen_room_message_copied">"Повідомлення скопійовано"</string>
<string name="screen_room_no_permission_to_post">"У Вас немає дозволу на публікацію в цій кімнаті"</string>
<string name="screen_room_notification_settings_allow_custom">"Дозволити користувальницькі налаштування"</string>
<string name="screen_room_notification_settings_allow_custom_footnote">"Увімкнення цього параметра змінить налаштування за замовчуванням"</string>
<string name="screen_room_notification_settings_custom_settings_title">"Повідомте мене в цьому чаті для"</string>
<string name="screen_room_notification_settings_default_setting_footnote">"Ви можете змінити це у своїх %1$s."</string>
<string name="screen_room_notification_settings_default_setting_footnote_content_link">"глобальних налаштуваннях"</string>
<string name="screen_room_notification_settings_default_setting_title">"Налаштування за замовчуванням"</string>
<string name="screen_room_notification_settings_edit_remove_setting">"Вилучити користувальницькі налаштування"</string>
<string name="screen_room_notification_settings_error_loading_settings">"Під час завантаження налаштувань сповіщень сталася помилка."</string>
<string name="screen_room_notification_settings_error_restoring_default">"Не вдалося відновити режим за замовчуванням, спробуйте ще раз."</string>
<string name="screen_room_notification_settings_error_setting_mode">"Не вдалося встановити режим, спробуйте ще раз."</string>
<string name="screen_room_notification_settings_mentions_only_disclaimer">"Ваш домашній сервер не підтримує цю опцію в зашифрованих кімнатах, ви не отримаєте сповіщення в цій кімнаті."</string>
<string name="screen_room_notification_settings_mode_all_messages">"Всі повідомлення"</string>
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"Тільки згадки та ключові слова"</string>
<string name="screen_room_notification_settings_room_custom_settings_title">"У цій кімнаті повідомляти мене про"</string>
<string name="screen_room_reactions_show_less">"Показувати менше"</string>
<string name="screen_room_reactions_show_more">"Показати більше"</string>
<string name="screen_room_retry_send_menu_send_again_action">"Надіслати знову"</string>
<string name="screen_room_retry_send_menu_title">"Ваше повідомлення не вдалося надіслати"</string>
<string name="screen_room_roles_and_permissions_admins">"Адміністратори"</string>
<string name="screen_room_roles_and_permissions_member_moderation">"Модерація учасників"</string>
<string name="screen_room_roles_and_permissions_messages_and_content">"Повідомлення та зміст"</string>
<string name="screen_room_roles_and_permissions_moderators">"Модератори"</string>
<string name="screen_room_roles_and_permissions_permissions_header">"Дозволи"</string>
<string name="screen_room_roles_and_permissions_reset">"Скинути дозволи"</string>
<string name="screen_room_roles_and_permissions_roles_header">"Ролі"</string>
<string name="screen_room_roles_and_permissions_room_details">"Деталі кімнати"</string>
<string name="screen_room_roles_and_permissions_title">"Ролі та дозволи"</string>
<string name="screen_room_timeline_add_reaction">"Додати смайлики"</string>
<string name="screen_room_timeline_beginning_of_room">"Це початок %1$s"</string>
<string name="screen_room_timeline_beginning_of_room_no_name">"Це початок цієї розмови."</string>
<string name="screen_room_timeline_less_reactions">"Показувати менше"</string>
<string name="screen_room_timeline_message_copied">"Повідомлення скопійовано"</string>
<string name="screen_room_timeline_no_permission_to_post">"У Вас немає дозволу на публікацію в цій кімнаті"</string>
<string name="screen_room_timeline_reactions_show_less">"Показувати менше"</string>
<string name="screen_room_timeline_reactions_show_more">"Показати більше"</string>
<string name="screen_room_timeline_read_marker_title">"Нове"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="one">"%1$d зміна в кімнаті"</item>
<item quantity="few">"%1$d зміни в кімнаті"</item>
<item quantity="many">"%1$d змін у кімнаті"</item>
</plurals>
<plurals name="screen_room_typing_many_members">
<item quantity="one">"%1$s%2$s та %3$d інший"</item>
<item quantity="few">"%1$s%2$s та %3$d інші"</item>
@@ -99,5 +53,4 @@
<item quantity="many">"%1$s пишуть"</item>
</plurals>
<string name="screen_room_typing_two_members">"%1$s та %2$s"</string>
<string name="screen_room_voice_message_tooltip">"Тримати, щоб записати"</string>
</resources>

View File

@@ -8,12 +8,8 @@
<string name="emoji_picker_category_people">"表情與人物"</string>
<string name="emoji_picker_category_places">"旅行與景點"</string>
<string name="emoji_picker_category_symbols">"標誌"</string>
<string name="report_content_hint">"檢舉這個內容的原因"</string>
<string name="room_timeline_read_marker_title">"新訊息"</string>
<plurals name="room_timeline_state_changes">
<item quantity="other">"%1$d 個聊天室變更"</item>
</plurals>
<string name="screen_report_content_block_user">"封鎖使用者"</string>
<string name="screen_report_content_hint">"檢舉這個內容的原因"</string>
<string name="screen_room_attachment_source_camera">"照相機"</string>
<string name="screen_room_attachment_source_camera_photo">"拍照"</string>
<string name="screen_room_attachment_source_camera_video">"錄影"</string>
@@ -22,24 +18,21 @@
<string name="screen_room_attachment_source_location">"位置"</string>
<string name="screen_room_attachment_source_poll">"投票"</string>
<string name="screen_room_attachment_text_formatting">"格式化文字"</string>
<string name="screen_room_change_permissions_everyone">"所有人"</string>
<string name="screen_room_invite_again_alert_message">"您想要邀請他們回來嗎?"</string>
<string name="screen_room_invite_again_alert_title">"此聊天室只有您一個人"</string>
<string name="screen_room_mentions_at_room_title">"所有人"</string>
<string name="screen_room_message_copied">"訊息已複製"</string>
<string name="screen_room_no_permission_to_post">"您沒有權限在此聊天室傳送訊息"</string>
<string name="screen_room_notification_settings_default_setting_footnote_content_link">"全域設定"</string>
<string name="screen_room_notification_settings_default_setting_title">"預設"</string>
<string name="screen_room_notification_settings_error_restoring_default">"無法重設為預設模式,請再試一次。"</string>
<string name="screen_room_notification_settings_error_setting_mode">"無法設定模式,請再試一次。"</string>
<string name="screen_room_notification_settings_mode_all_messages">"所有訊息"</string>
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"僅限提及與關鍵字"</string>
<string name="screen_room_reactions_show_less">"較少"</string>
<string name="screen_room_reactions_show_more">"更多"</string>
<string name="screen_room_retry_send_menu_send_again_action">"重傳"</string>
<string name="screen_room_retry_send_menu_title">"無法傳送您的訊息"</string>
<string name="screen_room_timeline_add_reaction">"新增表情符號"</string>
<string name="screen_room_timeline_less_reactions">"較少"</string>
<string name="screen_room_timeline_message_copied">"訊息已複製"</string>
<string name="screen_room_timeline_no_permission_to_post">"您沒有權限在此聊天室傳送訊息"</string>
<string name="screen_room_timeline_reactions_show_less">"較少"</string>
<string name="screen_room_timeline_reactions_show_more">"更多"</string>
<string name="screen_room_timeline_read_marker_title">"新訊息"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="other">"%1$d 個聊天室變更"</item>
</plurals>
<plurals name="screen_room_typing_many_members">
<item quantity="other">"%1$s、%2$s 和其他 %3$d 個人"</item>
</plurals>

View File

@@ -8,17 +8,10 @@
<string name="emoji_picker_category_people">"Smileys &amp; People"</string>
<string name="emoji_picker_category_places">"Travel &amp; Places"</string>
<string name="emoji_picker_category_symbols">"Symbols"</string>
<string name="report_content_explanation">"This message will be reported to your homeservers administrator. They will not be able to read any encrypted messages."</string>
<string name="report_content_hint">"Reason for reporting this content"</string>
<string name="room_timeline_beginning_of_room">"This is the beginning of %1$s."</string>
<string name="room_timeline_beginning_of_room_no_name">"This is the beginning of this conversation."</string>
<string name="room_timeline_read_marker_title">"New"</string>
<plurals name="room_timeline_state_changes">
<item quantity="one">"%1$d room change"</item>
<item quantity="other">"%1$d room changes"</item>
</plurals>
<string name="screen_report_content_block_user">"Block user"</string>
<string name="screen_report_content_block_user_hint">"Check if you want to hide all current and future messages from this user"</string>
<string name="screen_report_content_explanation">"This message will be reported to your homeservers administrator. They will not be able to read any encrypted messages."</string>
<string name="screen_report_content_hint">"Reason for reporting this content"</string>
<string name="screen_room_attachment_source_camera">"Camera"</string>
<string name="screen_room_attachment_source_camera_photo">"Take photo"</string>
<string name="screen_room_attachment_source_camera_video">"Record video"</string>
@@ -27,73 +20,27 @@
<string name="screen_room_attachment_source_location">"Location"</string>
<string name="screen_room_attachment_source_poll">"Poll"</string>
<string name="screen_room_attachment_text_formatting">"Text Formatting"</string>
<string name="screen_room_change_permissions_administrators">"Admins only"</string>
<string name="screen_room_change_permissions_ban_people">"Ban people"</string>
<string name="screen_room_change_permissions_delete_messages">"Delete messages"</string>
<string name="screen_room_change_permissions_everyone">"Everyone"</string>
<string name="screen_room_change_permissions_invite_people">"Invite people"</string>
<string name="screen_room_change_permissions_member_moderation">"Member moderation"</string>
<string name="screen_room_change_permissions_messages_and_content">"Messages and content"</string>
<string name="screen_room_change_permissions_moderators">"Admins and moderators"</string>
<string name="screen_room_change_permissions_remove_people">"Remove people"</string>
<string name="screen_room_change_permissions_room_avatar">"Change room avatar"</string>
<string name="screen_room_change_permissions_room_details">"Room details"</string>
<string name="screen_room_change_permissions_room_name">"Change room name"</string>
<string name="screen_room_change_permissions_room_topic">"Change room topic"</string>
<string name="screen_room_change_permissions_send_messages">"Send messages"</string>
<string name="screen_room_change_role_administrators_title">"Edit Admins"</string>
<string name="screen_room_change_role_confirm_add_admin_description">"You will not be able to undo this action. You are promoting the user to have the same power level as you."</string>
<string name="screen_room_change_role_confirm_add_admin_title">"Add Admin?"</string>
<string name="screen_room_change_role_confirm_demote_self_action">"Demote"</string>
<string name="screen_room_change_role_confirm_demote_self_description">"You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges."</string>
<string name="screen_room_change_role_confirm_demote_self_title">"Demote yourself?"</string>
<string name="screen_room_change_role_moderators_title">"Edit Moderators"</string>
<string name="screen_room_change_role_unsaved_changes_description">"You have unsaved changes."</string>
<string name="screen_room_change_role_unsaved_changes_title">"Save changes?"</string>
<string name="screen_room_encrypted_history_banner">"Message history is currently unavailable."</string>
<string name="screen_room_encrypted_history_banner_unverified">"Message history is unavailable in this room. Verify this device to see your message history."</string>
<string name="screen_room_error_failed_processing_media">"Failed processing media to upload, please try again."</string>
<string name="screen_room_error_failed_retrieving_user_details">"Could not retrieve user details"</string>
<string name="screen_room_invite_again_alert_message">"Would you like to invite them back?"</string>
<string name="screen_room_invite_again_alert_title">"You are alone in this chat"</string>
<string name="screen_room_mentions_at_room_subtitle">"Notify the whole room"</string>
<string name="screen_room_mentions_at_room_title">"Everyone"</string>
<string name="screen_room_message_copied">"Message copied"</string>
<string name="screen_room_no_permission_to_post">"You do not have permission to post to this room"</string>
<string name="screen_room_notification_settings_allow_custom">"Allow custom setting"</string>
<string name="screen_room_notification_settings_allow_custom_footnote">"Turning this on will override your default setting"</string>
<string name="screen_room_notification_settings_custom_settings_title">"Notify me in this chat for"</string>
<string name="screen_room_notification_settings_default_setting_footnote">"You can change it in your %1$s."</string>
<string name="screen_room_notification_settings_default_setting_footnote_content_link">"global settings"</string>
<string name="screen_room_notification_settings_default_setting_title">"Default setting"</string>
<string name="screen_room_notification_settings_edit_remove_setting">"Remove custom setting"</string>
<string name="screen_room_notification_settings_error_loading_settings">"An error occurred while loading notification settings."</string>
<string name="screen_room_notification_settings_error_restoring_default">"Failed restoring the default mode, please try again."</string>
<string name="screen_room_notification_settings_error_setting_mode">"Failed setting the mode, please try again."</string>
<string name="screen_room_notification_settings_mentions_only_disclaimer">"Your homeserver does not support this option in encrypted rooms, you won\'t get notified in this room."</string>
<string name="screen_room_notification_settings_mode_all_messages">"All messages"</string>
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"Mentions and Keywords only"</string>
<string name="screen_room_notification_settings_room_custom_settings_title">"In this room, notify me for"</string>
<string name="screen_room_reactions_show_less">"Show less"</string>
<string name="screen_room_reactions_show_more">"Show more"</string>
<string name="screen_room_retry_send_menu_send_again_action">"Send again"</string>
<string name="screen_room_retry_send_menu_title">"Your message failed to send"</string>
<string name="screen_room_roles_and_permissions_admins">"Admins"</string>
<string name="screen_room_roles_and_permissions_change_my_role">"Change my role"</string>
<string name="screen_room_roles_and_permissions_change_role_demote_to_member">"Demote to member"</string>
<string name="screen_room_roles_and_permissions_change_role_demote_to_moderator">"Demote to moderator"</string>
<string name="screen_room_roles_and_permissions_member_moderation">"Member moderation"</string>
<string name="screen_room_roles_and_permissions_messages_and_content">"Messages and content"</string>
<string name="screen_room_roles_and_permissions_moderators">"Moderators"</string>
<string name="screen_room_roles_and_permissions_permissions_header">"Permissions"</string>
<string name="screen_room_roles_and_permissions_reset">"Reset permissions"</string>
<string name="screen_room_roles_and_permissions_reset_confirm_description">"Once you reset permissions, you will lose the current settings."</string>
<string name="screen_room_roles_and_permissions_reset_confirm_title">"Reset permissions?"</string>
<string name="screen_room_roles_and_permissions_roles_header">"Roles"</string>
<string name="screen_room_roles_and_permissions_room_details">"Room details"</string>
<string name="screen_room_roles_and_permissions_title">"Roles and permissions"</string>
<string name="screen_room_timeline_add_reaction">"Add emoji"</string>
<string name="screen_room_timeline_beginning_of_room">"This is the beginning of %1$s."</string>
<string name="screen_room_timeline_beginning_of_room_no_name">"This is the beginning of this conversation."</string>
<string name="screen_room_timeline_less_reactions">"Show less"</string>
<string name="screen_room_timeline_message_copied">"Message copied"</string>
<string name="screen_room_timeline_no_permission_to_post">"You do not have permission to post to this room"</string>
<string name="screen_room_timeline_reactions_show_less">"Show less"</string>
<string name="screen_room_timeline_reactions_show_more">"Show more"</string>
<string name="screen_room_timeline_read_marker_title">"New"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="one">"%1$d room change"</item>
<item quantity="other">"%1$d room changes"</item>
</plurals>
<plurals name="screen_room_typing_many_members">
<item quantity="one">"%1$s, %2$s and %3$d other"</item>
<item quantity="other">"%1$s, %2$s and %3$d others"</item>
@@ -103,5 +50,4 @@
<item quantity="other">"%1$s are typing"</item>
</plurals>
<string name="screen_room_typing_two_members">"%1$s and %2$s"</string>
<string name="screen_room_voice_message_tooltip">"Hold to record"</string>
</resources>

View File

@@ -4,4 +4,6 @@
<string name="screen_onboarding_sign_in_with_qr_code">"Увайдзіце з QR-кодам"</string>
<string name="screen_onboarding_sign_up">"Стварыць уліковы запіс"</string>
<string name="screen_onboarding_welcome_message">"Сардэчна запрашаем у самы хуткі Element. Перавага ў хуткасці і прастаце."</string>
<string name="screen_onboarding_welcome_subtitle">"Сардэчна запрашаем у %1$s. Зараджаны, для хуткасці і прастаты."</string>
<string name="screen_onboarding_welcome_title">" Адчуйце сябе ў сваім element"</string>
</resources>

View File

@@ -39,6 +39,7 @@ import androidx.compose.runtime.LaunchedEffect
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.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
@@ -195,7 +196,8 @@ private fun PollHistoryList(
text = emptyStringResource,
style = ElementTheme.typography.fontBodyLgRegular,
color = ElementTheme.colors.textSecondary,
modifier = Modifier.padding(vertical = 24.dp, horizontal = 16.dp)
modifier = Modifier.padding(vertical = 24.dp, horizontal = 16.dp),
textAlign = TextAlign.Center,
)
}
}

View File

@@ -6,10 +6,16 @@
<string name="screen_advanced_settings_element_call_base_url_description">"Задайце свой сервер Element Call."</string>
<string name="screen_advanced_settings_element_call_base_url_validation_error">"Адрас пазначаны няправільна, пераканайцеся, што вы ўказалі пратакол (http/https) і правільны адрас."</string>
<string name="screen_advanced_settings_rich_text_editor_description">"Адключыць рэдактар фарматаванага тэксту і ўключыць Markdown."</string>
<string name="screen_advanced_settings_send_read_receipts">"Апавяшчэнні аб чытанні"</string>
<string name="screen_advanced_settings_send_read_receipts_description">"Калі выключыць, вашы пасведчанні аб прачытанні нікому не будуць адпраўляцца. Вы па-ранейшаму будзеце атрымліваць пасведчанні аб прачытанні ад іншых карыстальнікаў."</string>
<string name="screen_advanced_settings_share_presence">"Падзяліцеся прысутнасцю"</string>
<string name="screen_advanced_settings_share_presence_description">"Калі гэта выключана, вы не зможаце адпраўляць або атрымліваць апавяшчэнні аб прачытанні або апавяшчэнні аб наборы тэксту"</string>
<string name="screen_advanced_settings_view_source_description">"Уключыце опцыю для прагляду крыніцы паведамлення на часовай шкале."</string>
<string name="screen_blocked_users_empty">"У вас няма заблакіраваных карыстальнікаў"</string>
<string name="screen_blocked_users_unblock_alert_action">"Разблакіраваць"</string>
<string name="screen_blocked_users_unblock_alert_description">"Вы зноў зможаце ўбачыць усе паведамленні."</string>
<string name="screen_blocked_users_unblock_alert_title">"Разблакіраваць карыстальніка"</string>
<string name="screen_blocked_users_unblocking">"Разблакіроўка…"</string>
<string name="screen_edit_profile_display_name">"Бачнае імя"</string>
<string name="screen_edit_profile_display_name_placeholder">"Ваша бачнае імя"</string>
<string name="screen_edit_profile_error">"Узнікла невядомая памылка, і інфармацыю не ўдалося змяніць."</string>

View File

@@ -11,6 +11,7 @@
<string name="screen_advanced_settings_share_presence">"Partager la présence"</string>
<string name="screen_advanced_settings_share_presence_description">"Si cette option est désactivée, vous ne pourrez ni envoyer ni recevoir de confirmations de lecture ni de notifications de saisie"</string>
<string name="screen_advanced_settings_view_source_description">"Activer cette option pour pouvoir voir la source des messages dans la discussion."</string>
<string name="screen_blocked_users_empty">"Vous navez bloqué personne"</string>
<string name="screen_blocked_users_unblock_alert_action">"Débloquer"</string>
<string name="screen_blocked_users_unblock_alert_description">"Vous pourrez à nouveau voir tous ses messages."</string>
<string name="screen_blocked_users_unblock_alert_title">"Débloquer lutilisateur"</string>

View File

@@ -1,48 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_advanced_settings_developer_mode">"Modalità sviluppatore"</string>
<string name="screen_advanced_settings_developer_mode_description">"Attiva per avere accesso a caratteristiche e funzionalità per sviluppatori."</string>
<string name="screen_advanced_settings_developer_mode_description">"Attiva per avere accesso alle funzionalità per sviluppatori."</string>
<string name="screen_advanced_settings_element_call_base_url">"URL base di Element Call personalizzato"</string>
<string name="screen_advanced_settings_element_call_base_url_description">"Imposta un URL di base personalizzato per Element Call."</string>
<string name="screen_advanced_settings_element_call_base_url_validation_error">"URL non valido, assicurati di includere il protocollo (http/https) e l\'indirizzo corretto."</string>
<string name="screen_advanced_settings_rich_text_editor_description">"Disattiva l\'editor in rich text per digitare Markdown manualmente."</string>
<string name="screen_advanced_settings_send_read_receipts">"Conferme di lettura"</string>
<string name="screen_advanced_settings_send_read_receipts_description">"Se disattivato, le tue conferme di lettura non verranno inviate a nessuno. Riceverai comunque conferme di lettura da altri utenti."</string>
<string name="screen_advanced_settings_rich_text_editor_description">"Disattiva l\'editor di testo avanzato per scrivere manualmente in Markdown"</string>
<string name="screen_advanced_settings_send_read_receipts">"Ricevute di visualizzazione"</string>
<string name="screen_advanced_settings_send_read_receipts_description">"Se disattivato, le tue ricevute di visualizzazione non verranno inviate a nessuno. Riceverai comunque ricevute di visualizzazione da altri utenti."</string>
<string name="screen_advanced_settings_share_presence">"Condividi presenza online"</string>
<string name="screen_advanced_settings_share_presence_description">"Se disattivato, non potrai inviare o ricevere ricevute di lettura o notifiche di digitazione."</string>
<string name="screen_advanced_settings_view_source_description">"Attiva l\'opzione per visualizzare il sorgente del messaggio nella linea temporale."</string>
<string name="screen_advanced_settings_share_presence_description">"Se disattivato, non potrai inviare o ricevere ricevute di visualizzazione o notifiche di scrittura."</string>
<string name="screen_advanced_settings_view_source_description">"Attiva l\'opzione per visualizzare il codice sorgente del messaggio nella conversazione."</string>
<string name="screen_blocked_users_empty">"Non hai utenti bloccati"</string>
<string name="screen_blocked_users_unblock_alert_action">"Sblocca"</string>
<string name="screen_blocked_users_unblock_alert_description">"Potrai vedere di nuovo tutti i suoi messaggi."</string>
<string name="screen_blocked_users_unblock_alert_title">"Sblocca utente"</string>
<string name="screen_edit_profile_display_name">"Nome da mostrare"</string>
<string name="screen_edit_profile_display_name_placeholder">"Il tuo nome da mostrare"</string>
<string name="screen_blocked_users_unblocking">"Sblocco in corso…"</string>
<string name="screen_edit_profile_display_name">"Nome visualizzato"</string>
<string name="screen_edit_profile_display_name_placeholder">"Il tuo nome visualizzato"</string>
<string name="screen_edit_profile_error">"Si è verificato un errore sconosciuto e non è stato possibile modificare le informazioni."</string>
<string name="screen_edit_profile_error_title">"Impossibile aggiornare il profilo"</string>
<string name="screen_edit_profile_title">"Modifica profilo"</string>
<string name="screen_edit_profile_updating_details">"Aggiornamento del profilo…"</string>
<string name="screen_notification_settings_additional_settings_section_title">"Impostazioni aggiuntive"</string>
<string name="screen_notification_settings_calls_label">"Chiamate audio e video"</string>
<string name="screen_notification_settings_configuration_mismatch">"Mancata corrispondenza della configurazione"</string>
<string name="screen_notification_settings_configuration_mismatch">"Mancata corrispondenza di configurazione"</string>
<string name="screen_notification_settings_configuration_mismatch_description">"Abbiamo semplificato le impostazioni di notifica per rendere le opzioni più facili da trovare. Alcune impostazioni personalizzate che hai scelto in passato non sono mostrate qui, ma sono ancora attive.
Se procedi, alcune delle tue impostazioni potrebbero cambiare."</string>
<string name="screen_notification_settings_direct_chats">"Chat dirette"</string>
<string name="screen_notification_settings_edit_custom_settings_section_title">"Impostazione personalizzata per chat"</string>
<string name="screen_notification_settings_direct_chats">"Conversazioni dirette"</string>
<string name="screen_notification_settings_edit_custom_settings_section_title">"Impostazione personalizzata per conversazione"</string>
<string name="screen_notification_settings_edit_failed_updating_default_mode">"Si è verificato un errore durante l\'aggiornamento delle impostazioni di notifica."</string>
<string name="screen_notification_settings_edit_mode_all_messages">"Tutti i messaggi"</string>
<string name="screen_notification_settings_edit_mode_mentions_and_keywords">"Solo menzioni e parole chiave"</string>
<string name="screen_notification_settings_edit_screen_direct_section_header">"Nelle chat dirette, avvisami per"</string>
<string name="screen_notification_settings_edit_screen_group_section_header">"Nelle chat di gruppo, avvisami per"</string>
<string name="screen_notification_settings_edit_screen_direct_section_header">"Nelle conversazioni dirette, avvisami per"</string>
<string name="screen_notification_settings_edit_screen_group_section_header">"Nelle conversazioni di gruppo, avvisami per"</string>
<string name="screen_notification_settings_enable_notifications">"Attiva le notifiche su questo dispositivo"</string>
<string name="screen_notification_settings_failed_fixing_configuration">"La configurazione non è stata corretta, riprova."</string>
<string name="screen_notification_settings_group_chats">"Chat di gruppo"</string>
<string name="screen_notification_settings_invite_for_me_label">"Inviti"</string>
<string name="screen_notification_settings_mentions_only_disclaimer">"Il tuo homeserver non supporta questa opzione nelle stanze criptate, quindi potresti non ricevere notifiche in alcune stanze."</string>
<string name="screen_notification_settings_mentions_only_disclaimer">"Il tuo homeserver non supporta questa opzione nelle stanze crifrate, quindi potresti non ricevere notifiche in alcune stanze."</string>
<string name="screen_notification_settings_mentions_section_title">"Menzioni"</string>
<string name="screen_notification_settings_mode_all">"Tutto"</string>
<string name="screen_notification_settings_mode_mentions">"Menzioni"</string>
<string name="screen_notification_settings_notification_section_title">"Avvisami per"</string>
<string name="screen_notification_settings_room_mention_label">"Avvisami su @room"</string>
<string name="screen_notification_settings_room_mention_label">"Avvisami con @room"</string>
<string name="screen_notification_settings_system_notifications_action_required">"Per ricevere notifiche, modifica le tue %1$s."</string>
<string name="screen_notification_settings_system_notifications_action_required_content_link">"impostazioni di sistema"</string>
<string name="screen_notification_settings_system_notifications_turned_off">"Notifiche di sistema disattivate"</string>

View File

@@ -7,9 +7,11 @@
<string name="screen_bug_report_editor_description">"Калі ласка, апішыце памылку. Што вы зрабілі? Якія паводзіны вы чакалі? Што адбылося насамрэч. Калі ласка, апішыце ўсё як магчыма падрабязней."</string>
<string name="screen_bug_report_editor_placeholder">"Апішыце праблему…"</string>
<string name="screen_bug_report_editor_supporting">"Калі магчыма, калі ласка, напішыце апісанне на англійскай мове."</string>
<string name="screen_bug_report_error_description_too_short">"Апісанне занадта кароткае. Дайце больш падрабязную інфармацыю аб тым, што адбылося. Дзякуй!"</string>
<string name="screen_bug_report_include_crash_logs">"Адправіць часопісы збояў"</string>
<string name="screen_bug_report_include_logs">"Дазволіць часопісы"</string>
<string name="screen_bug_report_include_screenshot">"Адправіць здымак экрана"</string>
<string name="screen_bug_report_logs_description">"Каб пераканацца, што ўсё працуе правільна, у паведамленне будуць уключаны часопісы. Каб адправіць паведамленне без часопісаў, адключыце гэтую наладу."</string>
<string name="screen_bug_report_rash_logs_alert_title">"Пры апошнім выкарыстанні %1$s адбыўся збой. Жадаеце падзяліцца справаздачай аб збоі?"</string>
<string name="screen_bug_report_view_logs">"Прагляд часопісаў"</string>
</resources>

View File

@@ -3,7 +3,7 @@
<string name="screen_bug_report_attach_screenshot">"Allega istantanea schermo"</string>
<string name="screen_bug_report_contact_me">"Potete contattarmi per qualsiasi altra domanda."</string>
<string name="screen_bug_report_contact_me_title">"Contattami"</string>
<string name="screen_bug_report_edit_screenshot">"Modifica istantanea schermo"</string>
<string name="screen_bug_report_edit_screenshot">"Cambia istantanea schermo"</string>
<string name="screen_bug_report_editor_description">"Descrivi il problema. Che cosa hai fatto? Cosa ti aspettavi che accadesse? Cosa è effettivamente accaduto. Si prega di inserire il maggior numero di dettagli possibile."</string>
<string name="screen_bug_report_editor_placeholder">"Descrivi il problema…"</string>
<string name="screen_bug_report_editor_supporting">"Se possibile, scrivere la descrizione in inglese."</string>

View File

@@ -21,5 +21,6 @@ import io.element.android.libraries.matrix.api.room.RoomMember
sealed interface RolesAndPermissionsEvents {
data object ChangeOwnRole : RolesAndPermissionsEvents
data class DemoteSelfTo(val role: RoomMember.Role) : RolesAndPermissionsEvents
data object ResetPermissions : RolesAndPermissionsEvents
data object CancelPendingAction : RolesAndPermissionsEvents
}

View File

@@ -28,6 +28,8 @@ import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import io.element.android.anvilannotations.ContributesNode
import io.element.android.features.roomdetails.impl.rolesandpermissions.changeroles.ChangeRolesNode
import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsNode
import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsSection
import io.element.android.libraries.architecture.BackstackView
import io.element.android.libraries.architecture.BaseFlowNode
import io.element.android.libraries.architecture.createNode
@@ -55,6 +57,9 @@ class RolesAndPermissionsFlowNode @AssistedInject constructor(
@Parcelize
data object ModeratorList : NavTarget
@Parcelize
data class ChangeRoomPermissions(val section: ChangeRoomPermissionsSection) : NavTarget
}
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
@@ -68,6 +73,18 @@ class RolesAndPermissionsFlowNode @AssistedInject constructor(
override fun openModeratorList() {
backstack.push(NavTarget.ModeratorList)
}
override fun openEditRoomDetailsPermissions() {
backstack.push(NavTarget.ChangeRoomPermissions(ChangeRoomPermissionsSection.RoomDetails))
}
override fun openMessagesAndContentPermissions() {
backstack.push(NavTarget.ChangeRoomPermissions(ChangeRoomPermissionsSection.MessagesAndContent))
}
override fun openModerationPermissions() {
backstack.push(NavTarget.ChangeRoomPermissions(ChangeRoomPermissionsSection.MembershipModeration))
}
}
createNode<RolesAndPermissionsNode>(
buildContext = buildContext,
@@ -88,6 +105,13 @@ class RolesAndPermissionsFlowNode @AssistedInject constructor(
plugins = listOf(inputs),
)
}
is NavTarget.ChangeRoomPermissions -> {
val inputs = ChangeRoomPermissionsNode.Inputs(navTarget.section)
createNode<ChangeRoomPermissionsNode>(
buildContext = buildContext,
plugins = listOf(inputs),
)
}
}
}

View File

@@ -17,6 +17,7 @@
package io.element.android.features.roomdetails.impl.rolesandpermissions
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable
import androidx.compose.ui.Modifier
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
@@ -46,17 +47,24 @@ class RolesAndPermissionsNode @AssistedInject constructor(
@Assisted plugins: List<Plugin>,
private val presenter: RolesAndPermissionsPresenter,
private val room: MatrixRoom,
) : Node(buildContext, plugins = plugins), RoomDetailsAdminSettingsNavigator {
interface Callback : Plugin {
fun openAdminList()
fun openModeratorList()
) : Node(buildContext, plugins = plugins), RolesAndPermissionsNavigator {
interface Callback : Plugin, RolesAndPermissionsNavigator {
override fun openAdminList()
override fun openModeratorList()
override fun openEditRoomDetailsPermissions()
override fun openMessagesAndContentPermissions()
override fun openModerationPermissions()
override fun onBackPressed() {}
}
private val callback = plugins<Callback>().first()
override fun onBackPressed() = navigateUp()
override fun openAdminList() = callback.openAdminList()
override fun openModeratorList() = callback.openModeratorList()
@Stable
private val navigator = object : RolesAndPermissionsNavigator by callback {
override fun onBackPressed() {
navigateUp()
}
}
override fun onBuilt() {
super.onBuilt()
@@ -88,14 +96,17 @@ class RolesAndPermissionsNode @AssistedInject constructor(
val state = presenter.present()
RolesAndPermissionsView(
state = state,
roomDetailsAdminSettingsNavigator = this,
rolesAndPermissionsNavigator = navigator,
modifier = modifier,
)
}
}
interface RoomDetailsAdminSettingsNavigator {
interface RolesAndPermissionsNavigator {
fun onBackPressed() {}
fun openAdminList() {}
fun openModeratorList() {}
fun openEditRoomDetailsPermissions() {}
fun openMessagesAndContentPermissions() {}
fun openModerationPermissions() {}
}

View File

@@ -55,6 +55,7 @@ class RolesAndPermissionsPresenter @Inject constructor(
}
}
val changeOwnRoleAction = remember { mutableStateOf<AsyncAction<Unit>>(AsyncAction.Uninitialized) }
val resetPermissionsAction = remember { mutableStateOf<AsyncAction<Unit>>(AsyncAction.Uninitialized) }
fun handleEvent(event: RolesAndPermissionsEvents) {
when (event) {
@@ -63,11 +64,17 @@ class RolesAndPermissionsPresenter @Inject constructor(
}
is RolesAndPermissionsEvents.CancelPendingAction -> {
changeOwnRoleAction.value = AsyncAction.Uninitialized
resetPermissionsAction.value = AsyncAction.Uninitialized
}
is RolesAndPermissionsEvents.DemoteSelfTo -> coroutineScope.demoteSelfTo(
role = event.role,
changeOwnRoleAction = changeOwnRoleAction,
)
is RolesAndPermissionsEvents.ResetPermissions -> if (resetPermissionsAction.value.isConfirming()) {
coroutineScope.resetPermissions(resetPermissionsAction)
} else {
resetPermissionsAction.value = AsyncAction.Confirming
}
}
}
@@ -75,6 +82,7 @@ class RolesAndPermissionsPresenter @Inject constructor(
adminCount = adminCount,
moderatorCount = moderatorCount,
changeOwnRoleAction = changeOwnRoleAction.value,
resetPermissionsAction = resetPermissionsAction.value,
eventSink = { handleEvent(it) },
)
}
@@ -88,6 +96,14 @@ class RolesAndPermissionsPresenter @Inject constructor(
}
}
private fun CoroutineScope.resetPermissions(
resetPermissionsAction: MutableState<AsyncAction<Unit>>,
) = launch(dispatchers.io) {
runUpdatingState(resetPermissionsAction) {
room.resetPowerLevels().map {}
}
}
private fun MatrixRoomInfo?.userCountWithRole(role: RoomMember.Role): Int {
return if (this != null) {
userPowerLevels.count { (_, level) -> RoomMember.Role.forPowerLevel(level) == role }

View File

@@ -22,5 +22,6 @@ data class RolesAndPermissionsState(
val adminCount: Int,
val moderatorCount: Int,
val changeOwnRoleAction: AsyncAction<Unit>,
val resetPermissionsAction: AsyncAction<Unit>,
val eventSink: (RolesAndPermissionsEvents) -> Unit,
)

View File

@@ -39,6 +39,21 @@ class RolesAndPermissionsStateProvider : PreviewParameterProvider<RolesAndPermis
moderatorCount = 2,
changeOwnRoleAction = AsyncAction.Failure(IllegalStateException("Failed to change role")),
),
aRolesAndPermissionsState(
adminCount = 1,
moderatorCount = 2,
resetPermissionsAction = AsyncAction.Confirming,
),
aRolesAndPermissionsState(
adminCount = 1,
moderatorCount = 2,
resetPermissionsAction = AsyncAction.Loading,
),
aRolesAndPermissionsState(
adminCount = 1,
moderatorCount = 2,
resetPermissionsAction = AsyncAction.Failure(IllegalStateException("Failed to reset permissions")),
),
)
}
@@ -46,10 +61,12 @@ internal fun aRolesAndPermissionsState(
adminCount: Int = 0,
moderatorCount: Int = 0,
changeOwnRoleAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
resetPermissionsAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
eventSink: (RolesAndPermissionsEvents) -> Unit = {},
) = RolesAndPermissionsState(
adminCount = adminCount,
moderatorCount = moderatorCount,
changeOwnRoleAction = changeOwnRoleAction,
resetPermissionsAction = resetPermissionsAction,
eventSink = eventSink,
)

View File

@@ -33,6 +33,8 @@ import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.features.roomdetails.impl.R
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.designsystem.components.ProgressDialog
import io.element.android.libraries.designsystem.components.async.AsyncActionView
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog
import io.element.android.libraries.designsystem.components.list.ListItemContent
import io.element.android.libraries.designsystem.components.preferences.PreferencePage
@@ -53,35 +55,72 @@ import io.element.android.libraries.ui.strings.CommonStrings
@Composable
fun RolesAndPermissionsView(
state: RolesAndPermissionsState,
roomDetailsAdminSettingsNavigator: RoomDetailsAdminSettingsNavigator,
rolesAndPermissionsNavigator: RolesAndPermissionsNavigator,
modifier: Modifier = Modifier,
) {
PreferencePage(
modifier = modifier,
title = stringResource(R.string.screen_room_roles_and_permissions_title),
onBackPressed = roomDetailsAdminSettingsNavigator::onBackPressed,
onBackPressed = rolesAndPermissionsNavigator::onBackPressed,
) {
ListSectionHeader(title = stringResource(R.string.screen_room_roles_and_permissions_roles_header), hasDivider = false)
ListItem(
headlineContent = { Text(stringResource(R.string.screen_room_roles_and_permissions_admins)) },
leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Admin())),
trailingContent = ListItemContent.Text("${state.adminCount}"),
onClick = { roomDetailsAdminSettingsNavigator.openAdminList() },
onClick = { rolesAndPermissionsNavigator.openAdminList() },
)
ListItem(
headlineContent = { Text(stringResource(R.string.screen_room_roles_and_permissions_moderators)) },
leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.ChatProblem())),
trailingContent = ListItemContent.Text("${state.moderatorCount}"),
onClick = { roomDetailsAdminSettingsNavigator.openModeratorList() },
onClick = { rolesAndPermissionsNavigator.openModeratorList() },
)
ListItem(
headlineContent = { Text(stringResource(R.string.screen_room_roles_and_permissions_change_my_role)) },
onClick = { state.eventSink(RolesAndPermissionsEvents.ChangeOwnRole) },
leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Edit()))
)
ListSectionHeader(title = stringResource(R.string.screen_room_roles_and_permissions_permissions_header), hasDivider = true)
ListItem(
headlineContent = { Text(stringResource(R.string.screen_room_roles_and_permissions_room_details)) },
leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Info())),
onClick = { rolesAndPermissionsNavigator.openEditRoomDetailsPermissions() },
)
ListItem(
headlineContent = { Text(stringResource(R.string.screen_room_roles_and_permissions_messages_and_content)) },
leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Chat())),
onClick = { rolesAndPermissionsNavigator.openMessagesAndContentPermissions() },
)
ListItem(
headlineContent = { Text(stringResource(R.string.screen_room_roles_and_permissions_member_moderation)) },
leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.User())),
onClick = { rolesAndPermissionsNavigator.openModerationPermissions() },
)
HorizontalDivider()
ListItem(
headlineContent = { Text(stringResource(R.string.screen_room_roles_and_permissions_reset)) },
onClick = { state.eventSink(RolesAndPermissionsEvents.ResetPermissions) },
style = ListItemStyle.Destructive,
)
}
AsyncActionView(
async = state.resetPermissionsAction,
confirmationDialog = {
ConfirmationDialog(
title = stringResource(R.string.screen_room_roles_and_permissions_reset_confirm_title),
content = stringResource(R.string.screen_room_roles_and_permissions_reset_confirm_description),
submitText = stringResource(CommonStrings.action_reset),
destructiveSubmit = true,
onSubmitClicked = { state.eventSink(RolesAndPermissionsEvents.ResetPermissions) },
onDismiss = { state.eventSink(RolesAndPermissionsEvents.CancelPendingAction) },
)
},
onSuccess = { state.eventSink(RolesAndPermissionsEvents.CancelPendingAction) },
onErrorDismiss = { state.eventSink(RolesAndPermissionsEvents.CancelPendingAction) }
)
when (state.changeOwnRoleAction) {
is AsyncAction.Confirming -> {
ChangeOwnRoleBottomSheet(
@@ -156,11 +195,7 @@ private fun ChangeOwnRoleBottomSheet(
)
ListItem(
headlineContent = { Text(stringResource(CommonStrings.action_cancel)) },
onClick = {
sheetState.hide(coroutineScope) {
eventSink(RolesAndPermissionsEvents.CancelPendingAction)
}
},
onClick = ::dismiss,
style = ListItemStyle.Primary,
)
}
@@ -168,11 +203,11 @@ private fun ChangeOwnRoleBottomSheet(
@PreviewsDayNight
@Composable
internal fun RoomDetailsAdminSettingsViewPreview(@PreviewParameter(RolesAndPermissionsStateProvider::class) state: RolesAndPermissionsState) {
internal fun RolesAndPermissionViewPreview(@PreviewParameter(RolesAndPermissionsStateProvider::class) state: RolesAndPermissionsState) {
ElementPreview {
RolesAndPermissionsView(
state = state,
roomDetailsAdminSettingsNavigator = object : RoomDetailsAdminSettingsNavigator {},
rolesAndPermissionsNavigator = object : RolesAndPermissionsNavigator {},
)
}
}

View File

@@ -0,0 +1,26 @@
/*
* Copyright (c) 2024 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.element.android.features.roomdetails.impl.rolesandpermissions.permissions
import io.element.android.libraries.matrix.api.room.RoomMember
interface ChangeRoomPermissionsEvent {
data class ChangeMinimumRoleForAction(val action: RoomPermissionType, val role: RoomMember.Role) : ChangeRoomPermissionsEvent
data object Save : ChangeRoomPermissionsEvent
data object Exit : ChangeRoomPermissionsEvent
data object ResetPendingActions : ChangeRoomPermissionsEvent
}

View File

@@ -0,0 +1,66 @@
/*
* Copyright (c) 2024 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.element.android.features.roomdetails.impl.rolesandpermissions.permissions
import android.os.Parcelable
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node
import com.bumble.appyx.core.plugin.Plugin
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import io.element.android.anvilannotations.ContributesNode
import io.element.android.libraries.architecture.NodeInputs
import io.element.android.libraries.architecture.inputs
import io.element.android.libraries.di.RoomScope
import kotlinx.parcelize.Parcelize
@ContributesNode(RoomScope::class)
class ChangeRoomPermissionsNode @AssistedInject constructor(
@Assisted buildContext: BuildContext,
@Assisted plugins: List<Plugin>,
presenterFactory: ChangeRoomPermissionsPresenter.Factory,
) : Node(buildContext, plugins = plugins) {
@Parcelize
data class Inputs(
val section: ChangeRoomPermissionsSection,
) : NodeInputs, Parcelable
private val inputs: Inputs = inputs()
private val presenter = presenterFactory.run {
create(inputs.section)
}
@Composable
override fun View(modifier: Modifier) {
val state = presenter.present()
ChangeRoomPermissionsView(
modifier = modifier,
state = state,
onBackPressed = this::navigateUp,
)
}
}
@Parcelize
enum class ChangeRoomPermissionsSection : Parcelable {
RoomDetails,
MessagesAndContent,
MembershipModeration,
}

View File

@@ -0,0 +1,145 @@
/*
* Copyright (c) 2024 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.element.android.features.roomdetails.impl.rolesandpermissions.permissions
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.derivedStateOf
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 dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.matrix.api.room.MatrixRoom
import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
class ChangeRoomPermissionsPresenter @AssistedInject constructor(
@Assisted private val section: ChangeRoomPermissionsSection,
private val room: MatrixRoom,
) : Presenter<ChangeRoomPermissionsState> {
companion object {
internal fun itemsForSection(section: ChangeRoomPermissionsSection) = when (section) {
ChangeRoomPermissionsSection.RoomDetails -> persistentListOf(
RoomPermissionType.ROOM_NAME,
RoomPermissionType.ROOM_AVATAR,
RoomPermissionType.ROOM_TOPIC,
)
ChangeRoomPermissionsSection.MessagesAndContent -> persistentListOf(
RoomPermissionType.SEND_EVENTS,
RoomPermissionType.REDACT_EVENTS,
)
ChangeRoomPermissionsSection.MembershipModeration -> persistentListOf(
RoomPermissionType.INVITE,
RoomPermissionType.KICK,
RoomPermissionType.BAN,
)
}
}
@AssistedFactory
interface Factory {
fun create(section: ChangeRoomPermissionsSection): ChangeRoomPermissionsPresenter
}
private val items: ImmutableList<RoomPermissionType> = itemsForSection(section)
private var initialPermissions by mutableStateOf<MatrixRoomPowerLevels?>(null)
private var currentPermissions by mutableStateOf<MatrixRoomPowerLevels?>(null)
private var saveAction by mutableStateOf<AsyncAction<Unit>>(AsyncAction.Uninitialized)
private var confirmExitAction by mutableStateOf<AsyncAction<Unit>>(AsyncAction.Uninitialized)
@Composable
override fun present(): ChangeRoomPermissionsState {
val coroutineScope = rememberCoroutineScope()
LaunchedEffect(Unit) {
updatePermissions()
}
val hasChanges by remember {
derivedStateOf { initialPermissions != currentPermissions }
}
fun handleEvent(event: ChangeRoomPermissionsEvent) {
when (event) {
is ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction -> {
currentPermissions = when (event.action) {
RoomPermissionType.BAN -> currentPermissions?.copy(ban = event.role.powerLevel)
RoomPermissionType.INVITE -> currentPermissions?.copy(invite = event.role.powerLevel)
RoomPermissionType.KICK -> currentPermissions?.copy(kick = event.role.powerLevel)
RoomPermissionType.SEND_EVENTS -> currentPermissions?.copy(sendEvents = event.role.powerLevel)
RoomPermissionType.REDACT_EVENTS -> currentPermissions?.copy(redactEvents = event.role.powerLevel)
RoomPermissionType.ROOM_NAME -> currentPermissions?.copy(roomName = event.role.powerLevel)
RoomPermissionType.ROOM_AVATAR -> currentPermissions?.copy(roomAvatar = event.role.powerLevel)
RoomPermissionType.ROOM_TOPIC -> currentPermissions?.copy(roomTopic = event.role.powerLevel)
}
}
is ChangeRoomPermissionsEvent.Save -> coroutineScope.save()
is ChangeRoomPermissionsEvent.Exit -> {
confirmExitAction = if (!hasChanges || confirmExitAction.isConfirming()) {
AsyncAction.Success(Unit)
} else {
AsyncAction.Confirming
}
}
is ChangeRoomPermissionsEvent.ResetPendingActions -> {
saveAction = AsyncAction.Uninitialized
confirmExitAction = AsyncAction.Uninitialized
}
}
}
return ChangeRoomPermissionsState(
section = section,
currentPermissions = currentPermissions,
items = items,
hasChanges = hasChanges,
saveAction = saveAction,
confirmExitAction = confirmExitAction,
eventSink = { handleEvent(it) }
)
}
private suspend fun updatePermissions() {
val powerLevels = room.powerLevels().getOrNull() ?: return
initialPermissions = powerLevels
currentPermissions = initialPermissions
}
private fun CoroutineScope.save() = launch {
saveAction = AsyncAction.Loading
val updatedRoomPowerLevels = currentPermissions ?: run {
saveAction = AsyncAction.Failure(IllegalStateException("Failed to set room power levels"))
return@launch
}
room.updatePowerLevels(updatedRoomPowerLevels)
.onSuccess {
initialPermissions = currentPermissions
saveAction = AsyncAction.Success(Unit)
}
.onFailure {
saveAction = AsyncAction.Failure(it)
}
}
}

View File

@@ -0,0 +1,42 @@
/*
* Copyright (c) 2024 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.element.android.features.roomdetails.impl.rolesandpermissions.permissions
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels
import kotlinx.collections.immutable.ImmutableList
data class ChangeRoomPermissionsState(
val section: ChangeRoomPermissionsSection,
val currentPermissions: MatrixRoomPowerLevels?,
val items: ImmutableList<RoomPermissionType>,
val hasChanges: Boolean,
val saveAction: AsyncAction<Unit>,
val confirmExitAction: AsyncAction<Unit>,
val eventSink: (ChangeRoomPermissionsEvent) -> Unit,
)
enum class RoomPermissionType {
BAN,
INVITE,
KICK,
SEND_EVENTS,
REDACT_EVENTS,
ROOM_NAME,
ROOM_AVATAR,
ROOM_TOPIC
}

View File

@@ -0,0 +1,74 @@
/*
* Copyright (c) 2024 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.element.android.features.roomdetails.impl.rolesandpermissions.permissions
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels
import kotlinx.collections.immutable.toPersistentList
class ChangeRoomPermissionsStatePreviewProvider : PreviewParameterProvider<ChangeRoomPermissionsState> {
override val values: Sequence<ChangeRoomPermissionsState>
get() = sequenceOf(
aChangeRoomPermissionsState(section = ChangeRoomPermissionsSection.RoomDetails),
aChangeRoomPermissionsState(section = ChangeRoomPermissionsSection.MessagesAndContent),
aChangeRoomPermissionsState(section = ChangeRoomPermissionsSection.MembershipModeration),
aChangeRoomPermissionsState(section = ChangeRoomPermissionsSection.RoomDetails, hasChanges = true),
aChangeRoomPermissionsState(section = ChangeRoomPermissionsSection.RoomDetails, hasChanges = true, saveAction = AsyncAction.Loading),
aChangeRoomPermissionsState(
section = ChangeRoomPermissionsSection.RoomDetails,
hasChanges = true,
saveAction = AsyncAction.Failure(IllegalStateException("Failed to save changes"))
),
aChangeRoomPermissionsState(section = ChangeRoomPermissionsSection.RoomDetails, hasChanges = true, confirmExitAction = AsyncAction.Confirming),
)
}
internal fun aChangeRoomPermissionsState(
section: ChangeRoomPermissionsSection,
currentPermissions: MatrixRoomPowerLevels = previewPermissions(),
items: List<RoomPermissionType> = ChangeRoomPermissionsPresenter.itemsForSection(section),
hasChanges: Boolean = false,
saveAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
confirmExitAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
eventSink: (ChangeRoomPermissionsEvent) -> Unit = {},
) = ChangeRoomPermissionsState(
section = section,
currentPermissions = currentPermissions,
items = items.toPersistentList(),
hasChanges = hasChanges,
saveAction = saveAction,
confirmExitAction = confirmExitAction,
eventSink = eventSink,
)
private fun previewPermissions(): MatrixRoomPowerLevels {
return MatrixRoomPowerLevels(
// MembershipModeration section
invite = RoomMember.Role.ADMIN.powerLevel,
kick = RoomMember.Role.MODERATOR.powerLevel,
ban = RoomMember.Role.USER.powerLevel,
// MessagesAndContent section
redactEvents = RoomMember.Role.MODERATOR.powerLevel,
sendEvents = RoomMember.Role.ADMIN.powerLevel,
// RoomDetails section
roomName = RoomMember.Role.ADMIN.powerLevel,
roomAvatar = RoomMember.Role.MODERATOR.powerLevel,
roomTopic = RoomMember.Role.USER.powerLevel,
)
}

View File

@@ -0,0 +1,192 @@
/*
* Copyright (c) 2024 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.element.android.features.roomdetails.impl.rolesandpermissions.permissions
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter
import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.features.roomdetails.impl.R
import io.element.android.libraries.core.bool.orFalse
import io.element.android.libraries.designsystem.components.async.AsyncActionView
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
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.aliasScreenTitle
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.ListSectionHeader
import io.element.android.libraries.designsystem.theme.components.Scaffold
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.components.TextButton
import io.element.android.libraries.designsystem.theme.components.TopAppBar
import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels
import io.element.android.libraries.ui.strings.CommonStrings
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ChangeRoomPermissionsView(
state: ChangeRoomPermissionsState,
onBackPressed: () -> Unit,
modifier: Modifier = Modifier,
) {
BackHandler {
state.eventSink(ChangeRoomPermissionsEvent.Exit)
}
Scaffold(
modifier = modifier,
topBar = {
val title = when (state.section) {
ChangeRoomPermissionsSection.RoomDetails -> stringResource(R.string.screen_room_change_permissions_room_details)
ChangeRoomPermissionsSection.MessagesAndContent -> stringResource(R.string.screen_room_change_permissions_messages_and_content)
ChangeRoomPermissionsSection.MembershipModeration -> stringResource(R.string.screen_room_change_permissions_member_moderation)
}
TopAppBar(
title = { Text(text = title, style = ElementTheme.typography.aliasScreenTitle) },
navigationIcon = {
BackButton(onClick = { state.eventSink(ChangeRoomPermissionsEvent.Exit) })
},
actions = {
TextButton(
text = stringResource(CommonStrings.action_save),
onClick = { state.eventSink(ChangeRoomPermissionsEvent.Save) },
enabled = state.hasChanges,
)
}
)
}
) { padding ->
Column(modifier = Modifier.padding(padding)) {
for ((index, permissionItem) in state.items.withIndex()) {
ListSectionHeader(titleForSection(item = permissionItem), hasDivider = index > 0)
SelectRoleItem(
permissionsItem = permissionItem,
role = RoomMember.Role.ADMIN,
currentPermissions = state.currentPermissions
) { item, role ->
state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(item, role))
}
SelectRoleItem(
permissionsItem = permissionItem,
role = RoomMember.Role.MODERATOR,
currentPermissions = state.currentPermissions
) { item, role ->
state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(item, role))
}
SelectRoleItem(
permissionsItem = permissionItem,
role = RoomMember.Role.USER,
currentPermissions = state.currentPermissions
) { item, role ->
state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(item, role))
}
}
}
}
AsyncActionView(
async = state.saveAction,
onSuccess = { onBackPressed() },
onErrorDismiss = { state.eventSink(ChangeRoomPermissionsEvent.ResetPendingActions) }
)
AsyncActionView(
async = state.confirmExitAction,
onSuccess = { onBackPressed() },
confirmationDialog = {
ConfirmationDialog(
title = stringResource(R.string.screen_room_change_role_unsaved_changes_title),
content = stringResource(R.string.screen_room_change_role_unsaved_changes_description),
submitText = stringResource(CommonStrings.action_save),
cancelText = stringResource(CommonStrings.action_discard),
onSubmitClicked = { state.eventSink(ChangeRoomPermissionsEvent.Save) },
onDismiss = { state.eventSink(ChangeRoomPermissionsEvent.Exit) }
)
},
onErrorDismiss = {},
)
}
@Composable
private fun SelectRoleItem(
permissionsItem: RoomPermissionType,
role: RoomMember.Role,
currentPermissions: MatrixRoomPowerLevels?,
onClick: (RoomPermissionType, RoomMember.Role) -> Unit
) {
val title = when (role) {
RoomMember.Role.ADMIN -> stringResource(R.string.screen_room_change_permissions_administrators)
RoomMember.Role.MODERATOR -> stringResource(R.string.screen_room_change_permissions_moderators)
RoomMember.Role.USER -> stringResource(R.string.screen_room_change_permissions_everyone)
}
ListItem(
headlineContent = { Text(text = title) },
trailingContent = if (currentPermissions?.isSelected(permissionsItem, role).orFalse()) {
ListItemContent.Icon(IconSource.Vector(CompoundIcons.Check()))
} else {
null
},
style = ListItemStyle.Primary,
onClick = { onClick(permissionsItem, role) },
)
}
private fun MatrixRoomPowerLevels.isSelected(item: RoomPermissionType, role: RoomMember.Role): Boolean {
return when (item) {
RoomPermissionType.BAN -> RoomMember.Role.forPowerLevel(ban) == role
RoomPermissionType.INVITE -> RoomMember.Role.forPowerLevel(invite) == role
RoomPermissionType.KICK -> RoomMember.Role.forPowerLevel(kick) == role
RoomPermissionType.SEND_EVENTS -> RoomMember.Role.forPowerLevel(sendEvents) == role
RoomPermissionType.REDACT_EVENTS -> RoomMember.Role.forPowerLevel(redactEvents) == role
RoomPermissionType.ROOM_NAME -> RoomMember.Role.forPowerLevel(roomName) == role
RoomPermissionType.ROOM_AVATAR -> RoomMember.Role.forPowerLevel(roomAvatar) == role
RoomPermissionType.ROOM_TOPIC -> RoomMember.Role.forPowerLevel(roomTopic) == role
}
}
@Composable
private fun titleForSection(item: RoomPermissionType): String = when (item) {
RoomPermissionType.INVITE -> stringResource(R.string.screen_room_change_permissions_invite_people)
RoomPermissionType.KICK -> stringResource(R.string.screen_room_change_permissions_remove_people)
RoomPermissionType.BAN -> stringResource(R.string.screen_room_change_permissions_ban_people)
RoomPermissionType.SEND_EVENTS -> stringResource(R.string.screen_room_change_permissions_send_messages)
RoomPermissionType.REDACT_EVENTS -> stringResource(R.string.screen_room_change_permissions_delete_messages)
RoomPermissionType.ROOM_NAME -> stringResource(R.string.screen_room_change_permissions_room_name)
RoomPermissionType.ROOM_AVATAR -> stringResource(R.string.screen_room_change_permissions_room_avatar)
RoomPermissionType.ROOM_TOPIC -> stringResource(R.string.screen_room_change_permissions_room_topic)
}
@PreviewsDayNight
@Composable
internal fun ChangeRoomPermissionsViewPreview(@PreviewParameter(ChangeRoomPermissionsStatePreviewProvider::class) state: ChangeRoomPermissionsState) {
ElementPreview {
ChangeRoomPermissionsView(
state = state,
onBackPressed = {},
)
}
}

View File

@@ -9,7 +9,27 @@
<string name="screen_notification_settings_edit_failed_updating_default_mode">"Пры абнаўленні налад апавяшчэнняў адбылася памылка."</string>
<string name="screen_notification_settings_mentions_only_disclaimer">"Ваш хатні сервер не падтрымлівае гэтую опцыю ў зашыфраваных пакоях, вы можаце не атрымаць апавяшчэнне ў некаторых пакоях."</string>
<string name="screen_polls_history_title">"Апытанні"</string>
<string name="screen_room_change_permissions_administrators">"Толькі для адміністратараў"</string>
<string name="screen_room_change_permissions_ban_people">"Заблакіраваць людзей"</string>
<string name="screen_room_change_permissions_delete_messages">"Выдаліць паведамленні"</string>
<string name="screen_room_change_permissions_everyone">"Усе"</string>
<string name="screen_room_change_permissions_invite_people">"Запрасіць людзей"</string>
<string name="screen_room_change_permissions_member_moderation">"Мадэрацыя ўдзельнікаў"</string>
<string name="screen_room_change_permissions_messages_and_content">"Паведамленні і змест"</string>
<string name="screen_room_change_permissions_moderators">"Адміністратары і мадэратары"</string>
<string name="screen_room_change_permissions_remove_people">"Выдаліць людзей"</string>
<string name="screen_room_change_permissions_room_avatar">"Змяніць аватар пакоя"</string>
<string name="screen_room_change_permissions_room_details">"Дэталі пакоя"</string>
<string name="screen_room_change_permissions_room_name">"Змяніць назву пакоя"</string>
<string name="screen_room_change_permissions_room_topic">"Змяніць тэму пакоя"</string>
<string name="screen_room_change_permissions_send_messages">"Адправіць паведамленні"</string>
<string name="screen_room_change_role_administrators_title">"Рэдагаваць адміністратараў"</string>
<string name="screen_room_change_role_confirm_add_admin_description">"Вы не зможаце адмяніць гэта дзеянне. Вы прасоўваеце карыстальніка да таго ж узроўню магутнасці, што і вы."</string>
<string name="screen_room_change_role_confirm_add_admin_title">"Дадаць адміністратара?"</string>
<string name="screen_room_change_role_confirm_demote_self_action">"Паніжэнне ўзроўню"</string>
<string name="screen_room_change_role_confirm_demote_self_description">"Вы не зможаце адмяніць гэтае змяненне, бо паніжаеце сябе. Калі вы апошні адміністратар у пакоі, вярнуць права будзе немагчыма."</string>
<string name="screen_room_change_role_confirm_demote_self_title">"Панізіць сябе?"</string>
<string name="screen_room_change_role_moderators_title">"Рэдагаваць мадэратараў"</string>
<string name="screen_room_details_add_topic_title">"Дадаць тэму"</string>
<string name="screen_room_details_already_a_member">"Ужо ўдзельнік"</string>
<string name="screen_room_details_already_invited">"Ужо запрасілі"</string>
@@ -27,18 +47,37 @@
<string name="screen_room_details_notification_mode_custom">"Карыстальніцкі"</string>
<string name="screen_room_details_notification_mode_default">"Па змаўчанні"</string>
<string name="screen_room_details_notification_title">"Апавяшчэнні"</string>
<string name="screen_room_details_roles_and_permissions">"Ролі і дазволы"</string>
<string name="screen_room_details_room_name_label">"Назва пакоя"</string>
<string name="screen_room_details_security_title">"Бяспека"</string>
<string name="screen_room_details_share_room_title">"Падзяліцца пакоем"</string>
<string name="screen_room_details_topic_title">"Тэма"</string>
<string name="screen_room_details_updating_room">"Ідзе абнаўленне пакоя…"</string>
<string name="screen_room_member_list_ban_member_confirmation_action">"Заблакіраваць"</string>
<string name="screen_room_member_list_ban_member_confirmation_description">"Яны не змогуць зноў далучыцца да гэтага пакоя, калі іх запросяць."</string>
<string name="screen_room_member_list_ban_member_confirmation_title">"Вы ўпэўнены, што хочаце заблакіраваць гэтага карыстальніка?"</string>
<string name="screen_room_member_list_banning_user">"Блакіроўка %1$s"</string>
<plurals name="screen_room_member_list_header_title">
<item quantity="one">"%1$d карыстальнік"</item>
<item quantity="few">"%1$d карыстальнікаў"</item>
<item quantity="many">"%1$d карыстальнікаў"</item>
</plurals>
<string name="screen_room_member_list_manage_member_remove">"Выдаліць удзельніка"</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_remove_confirmation_title">"Выдаліць удзельніка і забараніць далучацца ў будучыні?"</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_manage_member_user_info">"Інфармацыю пра карыстальніка"</string>
<string name="screen_room_member_list_mode_banned">"Заблакіраваны"</string>
<string name="screen_room_member_list_mode_members">"Удзельнікі"</string>
<string name="screen_room_member_list_pending_header_title">"У чаканні"</string>
<string name="screen_room_member_list_removing_user">"Выдаленне %1$s …"</string>
<string name="screen_room_member_list_role_administrator">"Адміністратар"</string>
<string name="screen_room_member_list_role_moderator">"Мадэратар"</string>
<string name="screen_room_member_list_room_members_header_title">"Карыстальнікі пакоя"</string>
<string name="screen_room_member_list_unbanning_user">"Разблакіроўка %1$s"</string>
<string name="screen_room_notification_settings_allow_custom">"Дазволіць карыстальніцкую наладу"</string>
<string name="screen_room_notification_settings_allow_custom_footnote">"Калі гэта ўключыць, ваша налада па змаўчанні будзе адменена"</string>
<string name="screen_room_notification_settings_custom_settings_title">"Апавяшчаць мяне ў гэтым чаце для"</string>
@@ -53,5 +92,14 @@
<string name="screen_room_notification_settings_mode_all_messages">"Усе паведамленні"</string>
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"Толькі згадванні і ключавыя словы"</string>
<string name="screen_room_notification_settings_room_custom_settings_title">"У гэтым пакоі паведаміце мяне пра"</string>
<string name="screen_room_roles_and_permissions_admins">"Адміністратары"</string>
<string name="screen_room_roles_and_permissions_member_moderation">"Мадэрацыя ўдзельнікаў"</string>
<string name="screen_room_roles_and_permissions_messages_and_content">"Паведамленні і змест"</string>
<string name="screen_room_roles_and_permissions_moderators">"Мадэратары"</string>
<string name="screen_room_roles_and_permissions_permissions_header">"Дазволы"</string>
<string name="screen_room_roles_and_permissions_reset">"Скінуць дазволы"</string>
<string name="screen_room_roles_and_permissions_roles_header">"Ролі"</string>
<string name="screen_room_roles_and_permissions_room_details">"Дэталі пакоя"</string>
<string name="screen_room_roles_and_permissions_title">"Ролі і дазволы"</string>
<string name="screen_start_chat_error_starting_chat">"Пры спробе пачаць чат адбылася памылка"</string>
</resources>

View File

@@ -9,15 +9,29 @@
<string name="screen_notification_settings_edit_failed_updating_default_mode">"Beim Aktualisieren der Benachrichtigungseinstellungen ist ein Fehler aufgetreten."</string>
<string name="screen_notification_settings_mentions_only_disclaimer">"Dein Homeserver unterstützt diese Option in verschlüsselten Räumen nicht. In einigen Räumen wirst du möglicherweise nicht benachrichtigt."</string>
<string name="screen_polls_history_title">"Umfragen"</string>
<string name="screen_room_change_permissions_administrators">"Nur Administratoren"</string>
<string name="screen_room_change_permissions_ban_people">"Mitglieder sperren"</string>
<string name="screen_room_change_permissions_delete_messages">"Nachrichten löschen"</string>
<string name="screen_room_change_permissions_everyone">"Alle"</string>
<string name="screen_room_change_permissions_invite_people">"Personen einladen"</string>
<string name="screen_room_change_permissions_member_moderation">"Moderation der Mitglieder"</string>
<string name="screen_room_change_permissions_messages_and_content">"Nachrichten und Inhalte"</string>
<string name="screen_room_change_permissions_moderators">"Administratoren und Moderatoren"</string>
<string name="screen_room_change_permissions_remove_people">"Personen entfernen"</string>
<string name="screen_room_change_permissions_room_avatar">"Raum-Avatar ändern"</string>
<string name="screen_room_change_permissions_room_details">"Raumdetails"</string>
<string name="screen_room_change_permissions_room_name">"Raumname ändern"</string>
<string name="screen_room_change_permissions_room_topic">"Raumthema ändern"</string>
<string name="screen_room_change_permissions_send_messages">"Nachrichten senden"</string>
<string name="screen_room_change_role_administrators_title">"Admins bearbeiten"</string>
<string name="screen_room_change_role_confirm_add_admin_description">"Du vergibst das selbe Rolle, die auch Du hast. Diese Aktion kann daher nicht mehr rückgängig gemacht werden."</string>
<string name="screen_room_change_role_confirm_add_admin_title">"Als Administrator hinzufügen?"</string>
<string name="screen_room_change_role_confirm_demote_self_action">"Zurückstufen"</string>
<string name="screen_room_change_role_confirm_demote_self_description">"Du stufst dich selbst herab. Diese Änderung kann nicht rückgängig gemacht werden. Wenn du der letzte Benutzer mit dieser Rolle bist, ist es nicht möglich, diese Rolle wiederzuerlangen."</string>
<string name="screen_room_change_role_confirm_demote_self_title">"Möchtest Du Dich selbst herabstufen?"</string>
<string name="screen_room_change_role_moderators_title">"Moderatoren bearbeiten"</string>
<string name="screen_room_change_role_unsaved_changes_description">"Du hast nicht gespeicherte Änderungen."</string>
<string name="screen_room_change_role_unsaved_changes_title">"Änderungen speichern?"</string>
<string name="screen_room_details_add_topic_title">"Thema hinzufügen"</string>
<string name="screen_room_details_already_a_member">"Bereits Mitglied"</string>
<string name="screen_room_details_already_invited">"Bereits eingeladen"</string>
@@ -41,11 +55,16 @@
<string name="screen_room_details_share_room_title">"Raum teilen"</string>
<string name="screen_room_details_topic_title">"Thema"</string>
<string name="screen_room_details_updating_room">"Raum wird aktualisiert…"</string>
<string name="screen_room_member_list_ban_member_confirmation_action">"Sperren"</string>
<string name="screen_room_member_list_ban_member_confirmation_description">"Sie können dem Raum nicht mehr beitreten, selbst wenn sie eingeladen werden."</string>
<string name="screen_room_member_list_ban_member_confirmation_title">"Bist du sicher, dass du dieses Mitglied sperren möchtest?"</string>
<string name="screen_room_member_list_banned_empty">"In diesem Raum gibt es keine gesperrten Benutzer."</string>
<string name="screen_room_member_list_banning_user">"%1$s wird gesperrt."</string>
<plurals name="screen_room_member_list_header_title">
<item quantity="one">"%1$d Person"</item>
<item quantity="other">"%1$d Personen"</item>
</plurals>
<string name="screen_room_member_list_manage_member_ban">"Mitglied entfernen und sperren"</string>
<string name="screen_room_member_list_manage_member_remove">"Mitglied entfernen"</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>
@@ -77,11 +96,16 @@
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"Nur Erwähnungen und Schlüsselwörter"</string>
<string name="screen_room_notification_settings_room_custom_settings_title">"Benachrichtige mich in diesem Raum bei"</string>
<string name="screen_room_roles_and_permissions_admins">"Administratoren"</string>
<string name="screen_room_roles_and_permissions_change_my_role">"Ändere meine Rolle"</string>
<string name="screen_room_roles_and_permissions_change_role_demote_to_member">"Zum Mitglied herabstufen"</string>
<string name="screen_room_roles_and_permissions_change_role_demote_to_moderator">"Zum Moderator herabstufen"</string>
<string name="screen_room_roles_and_permissions_member_moderation">"Moderation der Mitglieder"</string>
<string name="screen_room_roles_and_permissions_messages_and_content">"Nachrichten und Inhalte"</string>
<string name="screen_room_roles_and_permissions_moderators">"Moderatoren"</string>
<string name="screen_room_roles_and_permissions_permissions_header">"Berechtigungen"</string>
<string name="screen_room_roles_and_permissions_reset">"Rollen und Berechtigungen zurücksetzen"</string>
<string name="screen_room_roles_and_permissions_reset_confirm_description">"Sobald Sie die Berechtigungen zurücksetzen, verlieren Sie die aktuellen Einstellungen."</string>
<string name="screen_room_roles_and_permissions_reset_confirm_title">"Berechtigungen zurücksetzen?"</string>
<string name="screen_room_roles_and_permissions_roles_header">"Rollen"</string>
<string name="screen_room_roles_and_permissions_room_details">"Raumdetails"</string>
<string name="screen_room_roles_and_permissions_title">"Rollen und Berechtigungen"</string>

View File

@@ -9,16 +9,29 @@
<string name="screen_notification_settings_edit_failed_updating_default_mode">"Une erreur sest produite lors de la mise à jour du paramètre de notification."</string>
<string name="screen_notification_settings_mentions_only_disclaimer">"Votre serveur daccueil ne supporte pas cette option pour les salons chiffrés, vous pourriez ne pas être notifié(e) dans certains salons."</string>
<string name="screen_polls_history_title">"Sondages"</string>
<string name="screen_room_change_permissions_administrators">"Administrateurs seulement"</string>
<string name="screen_room_change_permissions_ban_people">"Bannir les membres"</string>
<string name="screen_room_change_permissions_delete_messages">"Supprimer les messages"</string>
<string name="screen_room_change_permissions_everyone">"Tout le monde"</string>
<string name="screen_room_change_permissions_invite_people">"Inviter des membres"</string>
<string name="screen_room_change_permissions_member_moderation">"Administration des membres"</string>
<string name="screen_room_change_permissions_messages_and_content">"Messages et contenus"</string>
<string name="screen_room_change_permissions_moderators">"Administrateurs et modérateurs"</string>
<string name="screen_room_change_permissions_remove_people">"Retirer des membres"</string>
<string name="screen_room_change_permissions_room_avatar">"Changer lavatar du salon"</string>
<string name="screen_room_change_permissions_room_details">"Détails du salon"</string>
<string name="screen_room_change_permissions_room_name">"Changer le nom du salon"</string>
<string name="screen_room_change_permissions_room_topic">"Changer le sujet du salon"</string>
<string name="screen_room_change_permissions_send_messages">"Envoyer des messages"</string>
<string name="screen_room_change_role_administrators_title">"Modifier les administrateurs"</string>
<string name="screen_room_change_role_confirm_add_admin_description">"Vous ne pourrez pas annuler cette action. Vous êtes en train de promouvoir lutilisateur pour quil ait le même niveau que vous."</string>
<string name="screen_room_change_role_confirm_add_admin_title">"Ajouter un administrateur ?"</string>
<string name="screen_room_change_role_confirm_demote_self_action">"Rétrograder"</string>
<string name="screen_room_change_role_confirm_demote_self_description">"Vous ne pourrez pas annuler ce changement car vous vous rétrogradez, si vous êtes le dernier utilisateur privilégié du salon il sera impossible de retrouver les privilèges."</string>
<string name="screen_room_change_role_confirm_demote_self_title">"Vous rétrograder ?"</string>
<string name="screen_room_change_role_moderators_title">"Modifier les modérateurs"</string>
<string name="screen_room_change_role_unsaved_changes_description">"Vous avez des modifications non-enregistrées."</string>
<string name="screen_room_change_role_unsaved_changes_title">"Enregistrer les modifications?"</string>
<string name="screen_room_details_add_topic_title">"Ajouter un sujet"</string>
<string name="screen_room_details_already_a_member">"Déjà membre"</string>
<string name="screen_room_details_already_invited">"Déjà invité(e)"</string>
@@ -42,17 +55,24 @@
<string name="screen_room_details_share_room_title">"Partager le salon"</string>
<string name="screen_room_details_topic_title">"Sujet"</string>
<string name="screen_room_details_updating_room">"Mise à jour du salon…"</string>
<string name="screen_room_member_list_ban_member_confirmation_action">"Bannir"</string>
<string name="screen_room_member_list_ban_member_confirmation_description">"Lutilisateur ne pourra pas rejoindre le salon à nouveau, même si il est invité."</string>
<string name="screen_room_member_list_ban_member_confirmation_title">"Êtes-vous certain de vouloir bannir ce membre?"</string>
<string name="screen_room_member_list_banned_empty">"Il ny a pas dutilisateur banni dans ce salon."</string>
<string name="screen_room_member_list_banning_user">"Bannissement de %1$s"</string>
<plurals name="screen_room_member_list_header_title">
<item quantity="one">"%1$d personne"</item>
<item quantity="other">"%1$d personnes"</item>
</plurals>
<string name="screen_room_member_list_manage_member_remove">"Retirer le membre"</string>
<string name="screen_room_member_list_manage_member_ban">"Retirer et bannir ce membre"</string>
<string name="screen_room_member_list_manage_member_remove">"Retirer le membre du salon"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Retirer et bannir le 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_remove_confirmation_title">"Retirer le membre et interdire ladhésion à lavenir ?"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Débannir"</string>
<string name="screen_room_member_list_manage_member_user_info">"Voir profil"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Cet utilisateur 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_manage_member_user_info">"Voir le profil"</string>
<string name="screen_room_member_list_mode_banned">"Bannis"</string>
<string name="screen_room_member_list_mode_members">"Membres"</string>
<string name="screen_room_member_list_pending_header_title">"En attente"</string>
@@ -76,8 +96,16 @@
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"Mentions et mots clés uniquement"</string>
<string name="screen_room_notification_settings_room_custom_settings_title">"Dans ce salon, prévenez-moi pour"</string>
<string name="screen_room_roles_and_permissions_admins">"Administrateurs"</string>
<string name="screen_room_roles_and_permissions_change_my_role">"Changer mon rôle"</string>
<string name="screen_room_roles_and_permissions_change_role_demote_to_member">"Devenir simple membre"</string>
<string name="screen_room_roles_and_permissions_change_role_demote_to_moderator">"Devenir simple modérateur"</string>
<string name="screen_room_roles_and_permissions_member_moderation">"Administration des membres"</string>
<string name="screen_room_roles_and_permissions_messages_and_content">"Messages et contenus"</string>
<string name="screen_room_roles_and_permissions_moderators">"Modérateurs"</string>
<string name="screen_room_roles_and_permissions_permissions_header">"Autorisations"</string>
<string name="screen_room_roles_and_permissions_reset">"Réinitialisation des permissions"</string>
<string name="screen_room_roles_and_permissions_reset_confirm_description">"La réinitialisation des permissions entraîne la perte des réglages actuels."</string>
<string name="screen_room_roles_and_permissions_reset_confirm_title">"Réinitialisation des permissions?"</string>
<string name="screen_room_roles_and_permissions_roles_header">"Rôles"</string>
<string name="screen_room_roles_and_permissions_room_details">"Détails du salon"</string>
<string name="screen_room_roles_and_permissions_title">"Rôles et autorisations"</string>

View File

@@ -7,9 +7,31 @@
<string name="screen_dm_details_unblock_alert_description">"Potrai vedere di nuovo tutti i suoi messaggi."</string>
<string name="screen_dm_details_unblock_user">"Sblocca utente"</string>
<string name="screen_notification_settings_edit_failed_updating_default_mode">"Si è verificato un errore durante l\'aggiornamento delle impostazioni di notifica."</string>
<string name="screen_notification_settings_mentions_only_disclaimer">"Il tuo homeserver non supporta questa opzione nelle stanze criptate, quindi potresti non ricevere notifiche in alcune stanze."</string>
<string name="screen_notification_settings_mentions_only_disclaimer">"Il tuo homeserver non supporta questa opzione nelle stanze crifrate, quindi potresti non ricevere notifiche in alcune stanze."</string>
<string name="screen_polls_history_title">"Sondaggi"</string>
<string name="screen_room_change_permissions_administrators">"Solo amministratori"</string>
<string name="screen_room_change_permissions_ban_people">"Escludi membri"</string>
<string name="screen_room_change_permissions_delete_messages">"Eliminare messaggi"</string>
<string name="screen_room_change_permissions_everyone">"Tutti"</string>
<string name="screen_room_change_permissions_invite_people">"Invitare persone"</string>
<string name="screen_room_change_permissions_member_moderation">"Moderazione dei membri"</string>
<string name="screen_room_change_permissions_messages_and_content">"Messaggi e contenuti"</string>
<string name="screen_room_change_permissions_moderators">"Amministratori e moderatori"</string>
<string name="screen_room_change_permissions_remove_people">"Rimuovi persone"</string>
<string name="screen_room_change_permissions_room_avatar">"Cambia avatar della stanza"</string>
<string name="screen_room_change_permissions_room_details">"Dettagli della stanza"</string>
<string name="screen_room_change_permissions_room_name">"Cambia il nome della stanza"</string>
<string name="screen_room_change_permissions_room_topic">"Cambiare l\'argomento della stanza"</string>
<string name="screen_room_change_permissions_send_messages">"Inviare messaggi"</string>
<string name="screen_room_change_role_administrators_title">"Modifica amministratori"</string>
<string name="screen_room_change_role_confirm_add_admin_description">"Non potrai annullare questa azione. Stai promuovendo l\'utente al tuo stesso livello di potere."</string>
<string name="screen_room_change_role_confirm_add_admin_title">"Aggiungi amministratore?"</string>
<string name="screen_room_change_role_confirm_demote_self_action">"Declassa"</string>
<string name="screen_room_change_role_confirm_demote_self_description">"Non potrai annullare questa modifica perché ti stai declassando, se sei l\'ultimo utente privilegiato nella stanza, sarà impossibile riottenere i privilegi."</string>
<string name="screen_room_change_role_confirm_demote_self_title">"Declassare te stesso?"</string>
<string name="screen_room_change_role_moderators_title">"Modifica moderatori"</string>
<string name="screen_room_change_role_unsaved_changes_description">"Hai delle modifiche non salvate."</string>
<string name="screen_room_change_role_unsaved_changes_title">"Salvare le modifiche?"</string>
<string name="screen_room_details_add_topic_title">"Aggiungi argomento"</string>
<string name="screen_room_details_already_a_member">"Già membro"</string>
<string name="screen_room_details_already_invited">"Già invitato"</string>
@@ -27,19 +49,38 @@
<string name="screen_room_details_notification_mode_custom">"Personalizzato"</string>
<string name="screen_room_details_notification_mode_default">"Predefinito"</string>
<string name="screen_room_details_notification_title">"Notifiche"</string>
<string name="screen_room_details_roles_and_permissions">"Ruoli e autorizzazioni"</string>
<string name="screen_room_details_room_name_label">"Nome stanza"</string>
<string name="screen_room_details_security_title">"Sicurezza"</string>
<string name="screen_room_details_share_room_title">"Condividi stanza"</string>
<string name="screen_room_details_topic_title">"Oggetto"</string>
<string name="screen_room_details_topic_title">"Argomento"</string>
<string name="screen_room_details_updating_room">"Aggiornamento della stanza…"</string>
<string name="screen_room_member_list_ban_member_confirmation_action">"Escludi"</string>
<string name="screen_room_member_list_ban_member_confirmation_description">"Non potrà entrare nuovamente in questa stanza se invitato."</string>
<string name="screen_room_member_list_ban_member_confirmation_title">"Vuoi davvero escludere questo membro?"</string>
<string name="screen_room_member_list_banned_empty">"Non ci sono utenti esclusi in questa stanza."</string>
<string name="screen_room_member_list_banning_user">"Esclusione di %1$s"</string>
<plurals name="screen_room_member_list_header_title">
<item quantity="one">"1 persona"</item>
<item quantity="other">"%1$d persone"</item>
</plurals>
<string name="screen_room_member_list_manage_member_ban">"Rimuovi ed escludi"</string>
<string name="screen_room_member_list_manage_member_remove">"Rimuovi dalla stanza"</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_remove_confirmation_title">"Rimuovere e vietare l\'accesso in futuro?"</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_manage_member_user_info">"Visualizza profilo"</string>
<string name="screen_room_member_list_mode_banned">"Esclusi"</string>
<string name="screen_room_member_list_mode_members">"Membri"</string>
<string name="screen_room_member_list_pending_header_title">"In attesa"</string>
<string name="screen_room_member_list_removing_user">"Rimozione di %1$s…"</string>
<string name="screen_room_member_list_role_administrator">"Amministratore"</string>
<string name="screen_room_member_list_role_moderator">"Moderatore"</string>
<string name="screen_room_member_list_room_members_header_title">"Membri della stanza"</string>
<string name="screen_room_member_list_unbanning_user">"Riammissione di %1$s"</string>
<string name="screen_room_notification_settings_allow_custom">"Consenti impostazione personalizzata"</string>
<string name="screen_room_notification_settings_allow_custom_footnote">"L\'attivazione di questa opzione sovrascriverà l\'impostazione predefinita"</string>
<string name="screen_room_notification_settings_custom_settings_title">"Avvisami in questa chat per"</string>
@@ -50,9 +91,23 @@
<string name="screen_room_notification_settings_error_loading_settings">"Si è verificato un errore durante il caricamento delle impostazioni di notifica."</string>
<string name="screen_room_notification_settings_error_restoring_default">"Ripristino della modalità predefinita fallito, riprova."</string>
<string name="screen_room_notification_settings_error_setting_mode">"Impossibile impostare la modalità, riprova."</string>
<string name="screen_room_notification_settings_mentions_only_disclaimer">"Il tuo homeserver non supporta questa opzione nelle stanze criptate, quindi non riceverai notifiche in questa stanza."</string>
<string name="screen_room_notification_settings_mentions_only_disclaimer">"Il tuo homeserver non supporta questa opzione nelle stanze cifrate, quindi non riceverai notifiche in questa stanza."</string>
<string name="screen_room_notification_settings_mode_all_messages">"Tutti i messaggi"</string>
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"Solo menzioni e parole chiave"</string>
<string name="screen_room_notification_settings_room_custom_settings_title">"In questa stanza, avvisami per"</string>
<string name="screen_room_roles_and_permissions_admins">"Amministratori"</string>
<string name="screen_room_roles_and_permissions_change_my_role">"Cambia il mio ruolo"</string>
<string name="screen_room_roles_and_permissions_change_role_demote_to_member">"Declassa a membro"</string>
<string name="screen_room_roles_and_permissions_change_role_demote_to_moderator">"Declassa a moderatore"</string>
<string name="screen_room_roles_and_permissions_member_moderation">"Moderazione dei membri"</string>
<string name="screen_room_roles_and_permissions_messages_and_content">"Messaggi e contenuti"</string>
<string name="screen_room_roles_and_permissions_moderators">"Moderatori"</string>
<string name="screen_room_roles_and_permissions_permissions_header">"Autorizzazioni"</string>
<string name="screen_room_roles_and_permissions_reset">"Reimpostare le autorizzazioni"</string>
<string name="screen_room_roles_and_permissions_reset_confirm_description">"Una volta reimpostate le autorizzazioni, perderai le impostazioni correnti."</string>
<string name="screen_room_roles_and_permissions_reset_confirm_title">"Reimpostare autorizzazioni?"</string>
<string name="screen_room_roles_and_permissions_roles_header">"Ruoli"</string>
<string name="screen_room_roles_and_permissions_room_details">"Dettagli della stanza"</string>
<string name="screen_room_roles_and_permissions_title">"Ruoli e autorizzazioni"</string>
<string name="screen_start_chat_error_starting_chat">"Si è verificato un errore durante il tentativo di avviare una chat"</string>
</resources>

View File

@@ -30,6 +30,8 @@
<string name="screen_room_change_role_confirm_demote_self_description">"Ви не зможете скасувати цю зміну, оскільки ви знижуєте себе, якщо ви останній привілейований користувач у кімнаті, відновити привілеї буде неможливо."</string>
<string name="screen_room_change_role_confirm_demote_self_title">"Понизити себе?"</string>
<string name="screen_room_change_role_moderators_title">"Керувати модераторами"</string>
<string name="screen_room_change_role_unsaved_changes_description">"У вас є не збережені зміни."</string>
<string name="screen_room_change_role_unsaved_changes_title">"Зберегти зміни?"</string>
<string name="screen_room_details_add_topic_title">"Додати тему"</string>
<string name="screen_room_details_already_a_member">"Уже учасник"</string>
<string name="screen_room_details_already_invited">"Уже запрошені"</string>
@@ -56,20 +58,22 @@
<string name="screen_room_member_list_ban_member_confirmation_action">"Заблокувати"</string>
<string name="screen_room_member_list_ban_member_confirmation_description">"Він не зможе приєднатися до цієї кімнати знову, якщо його запросять."</string>
<string name="screen_room_member_list_ban_member_confirmation_title">"Ви точно хочете заблокувати цього користувача?"</string>
<string name="screen_room_member_list_banned_empty">"У цій кімнаті немає заблокованих користувачів."</string>
<string name="screen_room_member_list_banning_user">"Блокування %1$s"</string>
<plurals name="screen_room_member_list_header_title">
<item quantity="one">"%1$d особа"</item>
<item quantity="few">"%1$d особи"</item>
<item quantity="many">"%1$d осіб"</item>
</plurals>
<string name="screen_room_member_list_manage_member_remove">"Вилучити учасника"</string>
<string name="screen_room_member_list_manage_member_ban">"Вилучити й заблокувати учасника"</string>
<string name="screen_room_member_list_manage_member_remove">"Вилучити з кімнати"</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_remove_confirmation_title">"Видалити учасника та заборонити приєднання в майбутньому?"</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_manage_member_user_info">"Переглянути інформацію про користувача"</string>
<string name="screen_room_member_list_manage_member_user_info">"Переглянути профіль"</string>
<string name="screen_room_member_list_mode_banned">"Заблоковані"</string>
<string name="screen_room_member_list_mode_members">"Учасники"</string>
<string name="screen_room_member_list_pending_header_title">"На розгляді"</string>
@@ -93,11 +97,16 @@
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"Тільки згадки та ключові слова"</string>
<string name="screen_room_notification_settings_room_custom_settings_title">"У цій кімнаті повідомляти мене про"</string>
<string name="screen_room_roles_and_permissions_admins">"Адміністратори"</string>
<string name="screen_room_roles_and_permissions_change_my_role">"Змінити мою роль"</string>
<string name="screen_room_roles_and_permissions_change_role_demote_to_member">"Понизити до учасника"</string>
<string name="screen_room_roles_and_permissions_change_role_demote_to_moderator">"Понизити до модератора"</string>
<string name="screen_room_roles_and_permissions_member_moderation">"Модерація учасників"</string>
<string name="screen_room_roles_and_permissions_messages_and_content">"Повідомлення та зміст"</string>
<string name="screen_room_roles_and_permissions_moderators">"Модератори"</string>
<string name="screen_room_roles_and_permissions_permissions_header">"Дозволи"</string>
<string name="screen_room_roles_and_permissions_reset">"Скинути дозволи"</string>
<string name="screen_room_roles_and_permissions_reset_confirm_description">"Після скидання дозволів ви втратите поточні налаштування."</string>
<string name="screen_room_roles_and_permissions_reset_confirm_title">"Скинути дозволи?"</string>
<string name="screen_room_roles_and_permissions_roles_header">"Ролі"</string>
<string name="screen_room_roles_and_permissions_room_details">"Деталі кімнати"</string>
<string name="screen_room_roles_and_permissions_title">"Ролі та дозволи"</string>

View File

@@ -118,6 +118,36 @@ class RolesAndPermissionPresenterTests {
}
}
@Test
fun `present - ResetPermissions needs confirmation, then resets permissions`() = runTest {
val presenter = createRolesAndPermissionsPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val initialState = awaitItem()
initialState.eventSink(RolesAndPermissionsEvents.ResetPermissions)
// Confirmation
awaitItem().eventSink(RolesAndPermissionsEvents.ResetPermissions)
assertThat(awaitItem().resetPermissionsAction).isEqualTo(AsyncAction.Loading)
assertThat(awaitItem().resetPermissionsAction).isEqualTo(AsyncAction.Success(Unit))
}
}
@Test
fun `present - ResetPermissions confirmation can be cancelled`() = runTest {
val presenter = createRolesAndPermissionsPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val initialState = awaitItem()
initialState.eventSink(RolesAndPermissionsEvents.ResetPermissions)
awaitItem().eventSink(RolesAndPermissionsEvents.CancelPendingAction)
assertThat(awaitItem().resetPermissionsAction).isEqualTo(AsyncAction.Uninitialized)
}
}
private fun TestScope.createRolesAndPermissionsPresenter(
room: FakeMatrixRoom = FakeMatrixRoom(),
dispatchers: CoroutineDispatchers = testCoroutineDispatchers(),

View File

@@ -21,19 +21,26 @@ import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.element.android.features.roomdetails.impl.R
import io.element.android.features.roomdetails.impl.rolesandpermissions.RolesAndPermissionsEvents
import io.element.android.features.roomdetails.impl.rolesandpermissions.RolesAndPermissionsNavigator
import io.element.android.features.roomdetails.impl.rolesandpermissions.RolesAndPermissionsState
import io.element.android.features.roomdetails.impl.rolesandpermissions.RolesAndPermissionsView
import io.element.android.features.roomdetails.impl.rolesandpermissions.RoomDetailsAdminSettingsNavigator
import io.element.android.features.roomdetails.impl.rolesandpermissions.aRolesAndPermissionsState
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.tests.testutils.EnsureNeverCalled
import io.element.android.tests.testutils.EventsRecorder
import io.element.android.tests.testutils.clickOn
import io.element.android.tests.testutils.ensureCalledOnce
import io.element.android.tests.testutils.ensureCalledTimes
import io.element.android.tests.testutils.pressBack
import kotlinx.coroutines.test.runTest
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
import org.junit.runner.RunWith
import org.robolectric.annotation.Config
@RunWith(AndroidJUnit4::class)
class RolesAndPermissionsViewTests {
@@ -68,6 +75,100 @@ class RolesAndPermissionsViewTests {
rule.clickOn(R.string.screen_room_roles_and_permissions_moderators)
}
}
@Test
@Config(qualifiers = "h640dp")
fun `tapping on any of the permission items open the change permissions screen`() {
ensureCalledTimes(3) { callback ->
rule.setRolesAndPermissionsView(
openPermissionScreens = callback,
)
rule.clickOn(R.string.screen_room_roles_and_permissions_room_details)
rule.clickOn(R.string.screen_room_roles_and_permissions_messages_and_content)
rule.clickOn(R.string.screen_room_roles_and_permissions_member_moderation)
}
}
@Test
@Config(qualifiers = "h640dp")
fun `tapping on reset permissions triggers ResetPermissions event`() {
val recorder = EventsRecorder<RolesAndPermissionsEvents>()
rule.setRolesAndPermissionsView(
state = aRolesAndPermissionsState(
eventSink = recorder,
),
)
rule.clickOn(R.string.screen_room_roles_and_permissions_reset)
recorder.assertSingle(RolesAndPermissionsEvents.ResetPermissions)
}
@Test
fun `tapping on Reset in the reset permissions confirmation dialog triggers ResetPermissions event`() {
val recorder = EventsRecorder<RolesAndPermissionsEvents>()
rule.setRolesAndPermissionsView(
state = aRolesAndPermissionsState(
resetPermissionsAction = AsyncAction.Confirming,
eventSink = recorder,
),
)
rule.clickOn(CommonStrings.action_reset)
recorder.assertSingle(RolesAndPermissionsEvents.ResetPermissions)
}
@Test
fun `tapping on Cancel in the reset permissions confirmation dialog triggers CancelPendingAction event`() {
val recorder = EventsRecorder<RolesAndPermissionsEvents>()
rule.setRolesAndPermissionsView(
state = aRolesAndPermissionsState(
resetPermissionsAction = AsyncAction.Confirming,
eventSink = recorder,
),
)
rule.clickOn(CommonStrings.action_cancel)
recorder.assertSingle(RolesAndPermissionsEvents.CancelPendingAction)
}
@Test
fun `tapping on 'Demote to moderator' in the demote self bottom sheet triggers the right event`() {
val recorder = EventsRecorder<RolesAndPermissionsEvents>()
rule.setRolesAndPermissionsView(
state = aRolesAndPermissionsState(
changeOwnRoleAction = AsyncAction.Confirming,
eventSink = recorder,
),
)
rule.clickOn(R.string.screen_room_roles_and_permissions_change_role_demote_to_moderator)
rule.mainClock.advanceTimeBy(1_000L)
recorder.assertSingle(RolesAndPermissionsEvents.DemoteSelfTo(RoomMember.Role.MODERATOR))
}
@Test
fun `tapping on 'Demote to member' in the demote self bottom sheet triggers the right event`() = runTest {
val recorder = EventsRecorder<RolesAndPermissionsEvents>()
rule.setRolesAndPermissionsView(
state = aRolesAndPermissionsState(
changeOwnRoleAction = AsyncAction.Confirming,
eventSink = recorder,
),
)
rule.clickOn(R.string.screen_room_roles_and_permissions_change_role_demote_to_member)
rule.mainClock.advanceTimeBy(1_000L)
recorder.assertSingle(RolesAndPermissionsEvents.DemoteSelfTo(RoomMember.Role.USER))
}
@Test
fun `tapping on 'Cancel' in the demote self bottom sheet triggers the right event`() {
val recorder = EventsRecorder<RolesAndPermissionsEvents>()
rule.setRolesAndPermissionsView(
state = aRolesAndPermissionsState(
changeOwnRoleAction = AsyncAction.Confirming,
eventSink = recorder,
),
)
rule.clickOn(CommonStrings.action_cancel)
rule.mainClock.advanceTimeBy(1_000L)
recorder.assertSingle(RolesAndPermissionsEvents.CancelPendingAction)
}
}
private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setRolesAndPermissionsView(
@@ -77,14 +178,18 @@ private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setRoles
goBack: () -> Unit = EnsureNeverCalled(),
openAdminList: () -> Unit = EnsureNeverCalled(),
openModeratorList: () -> Unit = EnsureNeverCalled(),
openPermissionScreens: () -> Unit = EnsureNeverCalled(),
) {
setContent {
RolesAndPermissionsView(
state = state,
roomDetailsAdminSettingsNavigator = object : RoomDetailsAdminSettingsNavigator {
rolesAndPermissionsNavigator = object : RolesAndPermissionsNavigator {
override fun onBackPressed() = goBack()
override fun openAdminList() = openAdminList()
override fun openModeratorList() = openModeratorList()
override fun openEditRoomDetailsPermissions() = openPermissionScreens()
override fun openModerationPermissions() = openPermissionScreens()
override fun openMessagesAndContentPermissions() = openPermissionScreens()
}
)
}

View File

@@ -0,0 +1,294 @@
/*
* Copyright (c) 2024 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.element.android.features.roomdetails.rolesandpermissions.permissions
import app.cash.molecule.RecompositionMode
import app.cash.molecule.moleculeFlow
import app.cash.turbine.Event
import app.cash.turbine.TurbineTestContext
import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat
import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsEvent
import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsPresenter
import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsSection
import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsState
import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.RoomPermissionType
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.room.RoomMember.Role.ADMIN
import io.element.android.libraries.matrix.api.room.RoomMember.Role.MODERATOR
import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels
import io.element.android.libraries.matrix.test.room.FakeMatrixRoom
import io.element.android.libraries.matrix.test.room.defaultRoomPowerLevels
import kotlinx.coroutines.test.runTest
import org.junit.Test
class ChangeRoomPermissionsPresenterTests {
@Test
fun `present - initial state`() = runTest {
val section = ChangeRoomPermissionsSection.RoomDetails
val presenter = createChangeRoomPermissionsPresenter(section = section)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
// Initial state, no permissions loaded
awaitItem().run {
assertThat(this.section).isEqualTo(section)
assertThat(this.currentPermissions).isNull()
assertThat(this.items).isNotEmpty()
assertThat(this.hasChanges).isFalse()
assertThat(this.saveAction).isEqualTo(AsyncAction.Uninitialized)
assertThat(this.confirmExitAction).isEqualTo(AsyncAction.Uninitialized)
}
// Updated state, permissions loaded
assertThat(awaitItem().currentPermissions).isEqualTo(defaultPermissions())
}
}
@Test
fun `present - RoomDetails section contains the right items`() = runTest {
val section = ChangeRoomPermissionsSection.RoomDetails
val presenter = createChangeRoomPermissionsPresenter(section = section)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
assertThat(awaitUpdatedItem().items).containsExactly(
RoomPermissionType.ROOM_NAME,
RoomPermissionType.ROOM_AVATAR,
RoomPermissionType.ROOM_TOPIC,
)
}
}
@Test
fun `present - MessagesAndContent section contains the right items`() = runTest {
val section = ChangeRoomPermissionsSection.MessagesAndContent
val presenter = createChangeRoomPermissionsPresenter(section = section)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
assertThat(awaitUpdatedItem().items).containsExactly(
RoomPermissionType.SEND_EVENTS,
RoomPermissionType.REDACT_EVENTS,
)
}
}
@Test
fun `present - MembershipModeration section contains the right items`() = runTest {
val section = ChangeRoomPermissionsSection.MembershipModeration
val presenter = createChangeRoomPermissionsPresenter(section = section)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
assertThat(awaitUpdatedItem().items).containsExactly(
RoomPermissionType.INVITE,
RoomPermissionType.KICK,
RoomPermissionType.BAN,
)
}
}
@Test
fun `present - ChangeMinimumRoleForAction updates the current permissions and hasChanges`() = runTest {
val presenter = createChangeRoomPermissionsPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val state = awaitUpdatedItem()
assertThat(state.currentPermissions?.roomName).isEqualTo(ADMIN.powerLevel)
assertThat(state.hasChanges).isFalse()
state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.ROOM_NAME, MODERATOR))
awaitItem().run {
assertThat(currentPermissions?.roomName).isEqualTo(MODERATOR.powerLevel)
assertThat(hasChanges).isTrue()
}
}
}
@Test
fun `present - ChangeMinimumRoleForAction works for all actions`() = runTest {
val presenter = createChangeRoomPermissionsPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val state = awaitUpdatedItem()
state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.INVITE, MODERATOR))
state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.KICK, MODERATOR))
state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.BAN, MODERATOR))
state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.SEND_EVENTS, MODERATOR))
state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.REDACT_EVENTS, MODERATOR))
state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.ROOM_NAME, MODERATOR))
state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.ROOM_AVATAR, MODERATOR))
state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.ROOM_TOPIC, MODERATOR))
val items = cancelAndConsumeRemainingEvents()
(items.last() as? Event.Item<ChangeRoomPermissionsState>)?.value?.run {
assertThat(currentPermissions).isEqualTo(
MatrixRoomPowerLevels(
invite = MODERATOR.powerLevel,
kick = MODERATOR.powerLevel,
ban = MODERATOR.powerLevel,
redactEvents = MODERATOR.powerLevel,
sendEvents = MODERATOR.powerLevel,
roomName = MODERATOR.powerLevel,
roomAvatar = MODERATOR.powerLevel,
roomTopic = MODERATOR.powerLevel,
)
)
}
}
}
@Test
fun `present - Save updates the current permissions and resets hasChanges`() = runTest {
val presenter = createChangeRoomPermissionsPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val state = awaitUpdatedItem()
assertThat(state.currentPermissions?.roomName).isEqualTo(ADMIN.powerLevel)
assertThat(state.hasChanges).isFalse()
state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.ROOM_NAME, MODERATOR))
assertThat(awaitItem().hasChanges).isTrue()
state.eventSink(ChangeRoomPermissionsEvent.Save)
assertThat(awaitItem().saveAction).isEqualTo(AsyncAction.Loading)
assertThat(awaitItem().hasChanges).isFalse()
awaitItem().run {
assertThat(currentPermissions?.roomName).isEqualTo(MODERATOR.powerLevel)
assertThat(saveAction).isEqualTo(AsyncAction.Success(Unit))
}
}
}
@Test
fun `present - Save will fail if there are not current permissions`() = runTest {
val room = FakeMatrixRoom().apply {
givenPowerLevelsResult(Result.failure(IllegalStateException("Failed to load power levels")))
}
val presenter = createChangeRoomPermissionsPresenter(room = room)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val state = awaitItem()
assertThat(state.currentPermissions).isNull()
state.eventSink(ChangeRoomPermissionsEvent.Save)
assertThat(awaitItem().saveAction).isInstanceOf(AsyncAction.Failure::class.java)
}
}
@Test
fun `present - Save can handle failures and they can be cleared`() = runTest {
val room = FakeMatrixRoom().apply {
givenUpdatePowerLevelsResult(Result.failure(IllegalStateException("Failed to update power levels")))
}
val presenter = createChangeRoomPermissionsPresenter(room = room)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val state = awaitUpdatedItem()
assertThat(state.currentPermissions?.roomName).isEqualTo(ADMIN.powerLevel)
assertThat(state.hasChanges).isFalse()
state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.ROOM_NAME, MODERATOR))
assertThat(awaitItem().hasChanges).isTrue()
state.eventSink(ChangeRoomPermissionsEvent.Save)
assertThat(awaitItem().saveAction).isEqualTo(AsyncAction.Loading)
awaitItem().run {
assertThat(currentPermissions?.roomName).isEqualTo(MODERATOR.powerLevel)
// Couldn't save the changes, so they're still pending
assertThat(hasChanges).isTrue()
assertThat(saveAction).isInstanceOf(AsyncAction.Failure::class.java)
}
state.eventSink(ChangeRoomPermissionsEvent.ResetPendingActions)
awaitItem().run {
assertThat(currentPermissions?.roomName).isEqualTo(MODERATOR.powerLevel)
assertThat(saveAction).isEqualTo(AsyncAction.Uninitialized)
assertThat(hasChanges).isTrue()
}
}
}
@Test
fun `present - Exit does not need a confirmation when there are no pending changes`() = runTest {
val presenter = createChangeRoomPermissionsPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val state = awaitUpdatedItem()
state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.ROOM_NAME, MODERATOR))
assertThat(awaitItem().hasChanges).isTrue()
state.eventSink(ChangeRoomPermissionsEvent.Exit)
assertThat(awaitItem().confirmExitAction).isEqualTo(AsyncAction.Confirming)
state.eventSink(ChangeRoomPermissionsEvent.Exit)
assertThat(awaitItem().confirmExitAction).isEqualTo(AsyncAction.Success(Unit))
}
}
@Test
fun `present - Exit needs confirmation when there are pending changes`() = runTest {
val presenter = createChangeRoomPermissionsPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val state = awaitUpdatedItem()
state.eventSink(ChangeRoomPermissionsEvent.Exit)
assertThat(awaitItem().confirmExitAction).isEqualTo(AsyncAction.Success(Unit))
}
}
private fun createChangeRoomPermissionsPresenter(
section: ChangeRoomPermissionsSection = ChangeRoomPermissionsSection.RoomDetails,
room: FakeMatrixRoom = FakeMatrixRoom(),
) = ChangeRoomPermissionsPresenter(
section = section,
room = room,
)
private fun defaultPermissions() = defaultRoomPowerLevels().run {
MatrixRoomPowerLevels(
invite = invite,
kick = kick,
ban = ban,
redactEvents = redactEvents,
sendEvents = sendEvents,
roomName = roomName,
roomAvatar = roomAvatar,
roomTopic = roomTopic,
)
}
private suspend fun TurbineTestContext<ChangeRoomPermissionsState>.awaitUpdatedItem(): ChangeRoomPermissionsState {
skipItems(1)
return awaitItem()
}
}

View File

@@ -0,0 +1,201 @@
/*
* Copyright (c) 2024 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.element.android.features.roomdetails.rolesandpermissions.permissions
import androidx.activity.ComponentActivity
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.onAllNodesWithText
import androidx.compose.ui.test.onFirst
import androidx.compose.ui.test.performClick
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.element.android.features.roomdetails.impl.R
import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsEvent
import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsSection
import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsState
import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsView
import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.RoomPermissionType
import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.aChangeRoomPermissionsState
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.tests.testutils.EnsureNeverCalled
import io.element.android.tests.testutils.EventsRecorder
import io.element.android.tests.testutils.clickOn
import io.element.android.tests.testutils.clickOnFirst
import io.element.android.tests.testutils.ensureCalledOnce
import io.element.android.tests.testutils.pressBack
import io.element.android.tests.testutils.pressBackKey
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class ChangeRoomPermissionsViewTests {
@get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
@Test
fun `click on back icon invokes Exit`() {
val recorder = EventsRecorder<ChangeRoomPermissionsEvent>()
rule.setChangeRoomPermissionsRule(
eventsRecorder = recorder,
)
rule.pressBack()
recorder.assertSingle(ChangeRoomPermissionsEvent.Exit)
}
@Test
fun `click on back key invokes Exit`() {
val recorder = EventsRecorder<ChangeRoomPermissionsEvent>()
rule.setChangeRoomPermissionsRule(
eventsRecorder = recorder,
)
rule.pressBackKey()
recorder.assertSingle(ChangeRoomPermissionsEvent.Exit)
}
@Test
fun `when confirming exit with pending changes, using the back key actually exits`() {
val recorder = EventsRecorder<ChangeRoomPermissionsEvent>()
rule.setChangeRoomPermissionsRule(
state = aChangeRoomPermissionsState(
section = ChangeRoomPermissionsSection.RoomDetails,
hasChanges = true,
eventSink = recorder,
),
eventsRecorder = recorder,
)
rule.pressBackKey()
recorder.assertSingle(ChangeRoomPermissionsEvent.Exit)
}
@Test
fun `when confirming exit with pending changes, clicking on 'discard' button in the dialog actually exits`() {
val recorder = EventsRecorder<ChangeRoomPermissionsEvent>()
rule.setChangeRoomPermissionsRule(
state = aChangeRoomPermissionsState(
section = ChangeRoomPermissionsSection.RoomDetails,
hasChanges = true,
confirmExitAction = AsyncAction.Confirming,
eventSink = recorder,
),
eventsRecorder = recorder,
)
rule.clickOn(CommonStrings.action_discard)
recorder.assertSingle(ChangeRoomPermissionsEvent.Exit)
}
@Test
fun `when confirming exit with pending changes, clicking on 'save' button in the dialog saves the changes`() {
val recorder = EventsRecorder<ChangeRoomPermissionsEvent>()
rule.setChangeRoomPermissionsRule(
state = aChangeRoomPermissionsState(
section = ChangeRoomPermissionsSection.RoomDetails,
hasChanges = true,
confirmExitAction = AsyncAction.Confirming,
eventSink = recorder,
),
eventsRecorder = recorder,
)
rule.clickOnFirst(CommonStrings.action_save)
recorder.assertSingle(ChangeRoomPermissionsEvent.Save)
}
@Test
fun `click on a role item triggers ChangeRole event`() {
val recorder = EventsRecorder<ChangeRoomPermissionsEvent>()
rule.setChangeRoomPermissionsRule(
eventsRecorder = recorder,
)
val admins = rule.activity.getText(R.string.screen_room_change_permissions_administrators).toString()
val moderators = rule.activity.getText(R.string.screen_room_change_permissions_moderators).toString()
val users = rule.activity.getText(R.string.screen_room_change_permissions_everyone).toString()
rule.onAllNodesWithText(admins).onFirst().performClick()
rule.onAllNodesWithText(moderators).onFirst().performClick()
rule.onAllNodesWithText(users).onFirst().performClick()
recorder.assertList(
listOf(
ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.ROOM_NAME, RoomMember.Role.ADMIN),
ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.ROOM_NAME, RoomMember.Role.MODERATOR),
ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.ROOM_NAME, RoomMember.Role.USER),
)
)
}
@Test
fun `click on the Save menu item triggers Save event`() {
val recorder = EventsRecorder<ChangeRoomPermissionsEvent>()
rule.setChangeRoomPermissionsRule(
state = aChangeRoomPermissionsState(
section = ChangeRoomPermissionsSection.RoomDetails,
hasChanges = true,
eventSink = recorder,
),
eventsRecorder = recorder,
)
rule.clickOn(CommonStrings.action_save)
recorder.assertSingle(ChangeRoomPermissionsEvent.Save)
}
@Test
fun `a successful save exits the screen`() {
ensureCalledOnce { callback ->
rule.setChangeRoomPermissionsRule(
state = aChangeRoomPermissionsState(
section = ChangeRoomPermissionsSection.RoomDetails,
hasChanges = true,
saveAction = AsyncAction.Success(Unit),
),
onBackPressed = callback
)
rule.clickOn(CommonStrings.action_save)
}
}
@Test
fun `click on the Ok option in save error dialog triggers ResetPendingAction event`() {
val recorder = EventsRecorder<ChangeRoomPermissionsEvent>()
rule.setChangeRoomPermissionsRule(
state = aChangeRoomPermissionsState(
section = ChangeRoomPermissionsSection.RoomDetails,
hasChanges = true,
saveAction = AsyncAction.Failure(IllegalStateException("Failed to set room power levels")),
eventSink = recorder,
),
eventsRecorder = recorder,
)
rule.clickOn(CommonStrings.action_ok)
recorder.assertSingle(ChangeRoomPermissionsEvent.ResetPendingActions)
}
}
private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setChangeRoomPermissionsRule(
eventsRecorder: EventsRecorder<ChangeRoomPermissionsEvent> = EventsRecorder(expectEvents = false),
state: ChangeRoomPermissionsState = aChangeRoomPermissionsState(
section = ChangeRoomPermissionsSection.RoomDetails,
eventSink = eventsRecorder,
),
onBackPressed: () -> Unit = EnsureNeverCalled(),
) {
setContent {
ChangeRoomPermissionsView(
state = state,
onBackPressed = onBackPressed,
)
}
}

View File

@@ -7,8 +7,14 @@
<string name="screen_roomlist_a11y_create_message">"Стварыце новую размову або пакой"</string>
<string name="screen_roomlist_empty_message">"Пачніце з паведамлення каму-небудзь."</string>
<string name="screen_roomlist_empty_title">"Пакуль няма чатаў."</string>
<string name="screen_roomlist_filter_favourites">"Абранае"</string>
<string name="screen_roomlist_filter_low_priority">"Нізкі прыярытэт"</string>
<string name="screen_roomlist_filter_people">"Людзі"</string>
<string name="screen_roomlist_filter_rooms">"Пакоі"</string>
<string name="screen_roomlist_filter_unreads">"Непрачытаныя"</string>
<string name="screen_roomlist_main_space_title">"Усе чаты"</string>
<string name="screen_roomlist_mark_as_read">"Пазначыць як прачытанае"</string>
<string name="screen_roomlist_mark_as_unread">"Пазначыць як непрачытанае"</string>
<string name="session_verification_banner_message">"Здаецца, вы карыстаецеся новай прыладай. Праверце з дапамогай іншай прылады, каб атрымаць доступ да зашыфраваных паведамленняў."</string>
<string name="session_verification_banner_title">"Пацвердзіце, што гэта вы"</string>
</resources>

View File

@@ -8,10 +8,19 @@
<string name="screen_roomlist_empty_message">"Beginne, indem du jemandem eine Nachricht sendest."</string>
<string name="screen_roomlist_empty_title">"Noch keine Chats."</string>
<string name="screen_roomlist_filter_favourites">"Favoriten"</string>
<string name="screen_roomlist_filter_favourites_empty_state_subtitle">"In den Chat-Einstellungen kannst du einen Chat als Favorit hinzufügen.
Um deine anderen Chats zu sehen wähle diesen Filter ab."</string>
<string name="screen_roomlist_filter_favourites_empty_state_title">"Du hast noch keine Chats als Favorit markiert."</string>
<string name="screen_roomlist_filter_low_priority">"Niedrige Priorität"</string>
<string name="screen_roomlist_filter_mixed_empty_state_subtitle">"Wähle Filter ab, um Deine Chats zu sehen."</string>
<string name="screen_roomlist_filter_mixed_empty_state_title">"Du hast keine Chats für diese Auswahl"</string>
<string name="screen_roomlist_filter_people">"Personen"</string>
<string name="screen_roomlist_filter_people_empty_state_title">"Du hast noch keine Direktnachrichten"</string>
<string name="screen_roomlist_filter_rooms">"Räume"</string>
<string name="screen_roomlist_filter_rooms_empty_state_title">"Du bist noch in keinem Raum."</string>
<string name="screen_roomlist_filter_unreads">"Ungelesen"</string>
<string name="screen_roomlist_filter_unreads_empty_state_title">"Glückwunsch!
Du hast keine ungelesenen Nachrichten!"</string>
<string name="screen_roomlist_main_space_title">"Chats"</string>
<string name="screen_roomlist_mark_as_read">"Als gelesen markieren"</string>
<string name="screen_roomlist_mark_as_unread">"Als ungelesen markieren"</string>

View File

@@ -8,10 +8,19 @@
<string name="screen_roomlist_empty_message">"Commencez par envoyer un message à quelquun."</string>
<string name="screen_roomlist_empty_title">"Aucune discussion pour le moment."</string>
<string name="screen_roomlist_filter_favourites">"Favoris"</string>
<string name="screen_roomlist_filter_favourites_empty_state_subtitle">"Vous pouvez ajouter une discussion aux favoris depuis les paramètres de la discussion.
En attendant, vous pouvez désélectionner des filtres pour voir vos autres salons."</string>
<string name="screen_roomlist_filter_favourites_empty_state_title">"Vous navez pas encore de discussions favorites"</string>
<string name="screen_roomlist_filter_low_priority">"Priorité basse"</string>
<string name="screen_roomlist_filter_mixed_empty_state_subtitle">"Veuillez désélectionner des filtres pour voir vos discussions"</string>
<string name="screen_roomlist_filter_mixed_empty_state_title">"Vous navez pas de discussions pour cette sélection"</string>
<string name="screen_roomlist_filter_people">"Personnes"</string>
<string name="screen_roomlist_filter_people_empty_state_title">"Vous navez pas encore de discussions"</string>
<string name="screen_roomlist_filter_rooms">"Salons"</string>
<string name="screen_roomlist_filter_rooms_empty_state_title">"Vous nêtes membre daucun salon"</string>
<string name="screen_roomlist_filter_unreads">"Non-lus"</string>
<string name="screen_roomlist_filter_unreads_empty_state_title">"Félicitations!
Vous navez plus de messages non-lus!"</string>
<string name="screen_roomlist_main_space_title">"Conversations"</string>
<string name="screen_roomlist_mark_as_read">"Marquer comme lu"</string>
<string name="screen_roomlist_mark_as_unread">"Marquer comme non lu"</string>

View File

@@ -1,17 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="confirm_recovery_key_banner_message">"Il backup della chat non è attualmente sincronizzato. Devi confermare la chiave di recupero per mantenere l\'accesso al backup della chat."</string>
<string name="confirm_recovery_key_banner_title">"Conferma la chiave di recupero"</string>
<string name="confirm_recovery_key_banner_title">"Inserisci la chiave di recupero"</string>
<string name="screen_migration_message">"Si tratta di una procedura che si effettua una sola volta, grazie per l\'attesa."</string>
<string name="screen_migration_title">"Configurazione del tuo account."</string>
<string name="screen_roomlist_a11y_create_message">"Crea una nuova conversazione o stanza"</string>
<string name="screen_roomlist_empty_message">"Inizia inviando un messaggio a qualcuno."</string>
<string name="screen_roomlist_empty_title">"Ancora nessuna chat."</string>
<string name="screen_roomlist_empty_title">"Ancora nessuna conversazione."</string>
<string name="screen_roomlist_filter_favourites">"Preferiti"</string>
<string name="screen_roomlist_filter_favourites_empty_state_subtitle">"Puoi aggiungere una conversazione ai tuoi preferiti nelle impostazioni della stessa.
Per il momento, puoi deselezionare i filtri per vedere le altre conversazioni."</string>
<string name="screen_roomlist_filter_favourites_empty_state_title">"Non hai ancora conversazioni preferite"</string>
<string name="screen_roomlist_filter_low_priority">"Bassa priorità"</string>
<string name="screen_roomlist_filter_mixed_empty_state_subtitle">"Puoi deselezionare i filtri per vedere le altre conversazioni."</string>
<string name="screen_roomlist_filter_mixed_empty_state_title">"Non hai conversazioni per questa selezione"</string>
<string name="screen_roomlist_filter_people">"Persone"</string>
<string name="screen_roomlist_filter_people_empty_state_title">"Non hai ancora nessuna conversazione diretta"</string>
<string name="screen_roomlist_filter_rooms">"Stanze"</string>
<string name="screen_roomlist_filter_rooms_empty_state_title">"Non sei ancora in nessuna stanza"</string>
<string name="screen_roomlist_filter_unreads">"Non letti"</string>
<string name="screen_roomlist_filter_unreads_empty_state_title">"Congratulazioni!
Non hai messaggi non letti!"</string>
<string name="screen_roomlist_main_space_title">"Tutte le conversazioni"</string>
<string name="screen_roomlist_mark_as_read">"Segna come letto"</string>
<string name="screen_roomlist_mark_as_unread">"Segna come non letto"</string>

View File

@@ -6,7 +6,7 @@
<string name="screen_chat_backup_key_backup_title">"Backup"</string>
<string name="screen_chat_backup_recovery_action_change">"Cambia la chiave di recupero"</string>
<string name="screen_chat_backup_recovery_action_confirm">"Conferma la chiave di recupero"</string>
<string name="screen_chat_backup_recovery_action_confirm_description">"Il backup della chat attualmente non è sincronizzato."</string>
<string name="screen_chat_backup_recovery_action_confirm_description">"Il backup delle conversazioni non è attualmente sincronizzato."</string>
<string name="screen_chat_backup_recovery_action_setup">"Configura il recupero"</string>
<string name="screen_chat_backup_recovery_action_setup_description">"Ottieni l\'accesso ai tuoi messaggi cifrati se perdi tutti i tuoi dispositivi o se sei disconnesso da %1$s ovunque."</string>
<string name="screen_key_backup_disable_confirmation_action_turn_off">"Disattiva"</string>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_signed_out_reason_1">"Hai cambiato la password in un\'altra sessione"</string>
<string name="screen_signed_out_reason_2">"Hai eliminato la sessione da un\'altra sessione"</string>
<string name="screen_signed_out_reason_2">"Hai eliminato la sessione da un\'altra"</string>
<string name="screen_signed_out_reason_3">"L\'amministratore del tuo server ha invalidato il tuo accesso"</string>
<string name="screen_signed_out_subtitle">"Potresti essere stato disconnesso per uno dei motivi elencati di seguito. Accedi di nuovo per continuare a usare %s."</string>
<string name="screen_signed_out_title">"Sei disconnesso"</string>

View File

@@ -6,6 +6,7 @@
<string name="screen_session_verification_compare_numbers_subtitle">"Пераканайцеся, што прыведзеныя ніжэй лічбы супадаюць з лічбамі, паказанымі ў іншым сеансе."</string>
<string name="screen_session_verification_compare_numbers_title">"Параўнайце лічбы"</string>
<string name="screen_session_verification_complete_subtitle">"Ваш новы сеанс пацверджаны. Ён мае доступ да вашых зашыфраваных паведамленняў, і іншыя карыстальнікі будуць лічыць яго давераным."</string>
<string name="screen_session_verification_enter_recovery_key">"Увядзіце ключ аднаўлення"</string>
<string name="screen_session_verification_open_existing_session_subtitle">"Дакажыце, што гэта вы, каб атрымаць доступ да вашай зашыфраванай гісторыі паведамленняў."</string>
<string name="screen_session_verification_open_existing_session_title">"Адкрыйце існуючы сеанс"</string>
<string name="screen_session_verification_positive_button_canceled">"Паўтарыце праверку"</string>

View File

@@ -6,6 +6,7 @@
<string name="screen_session_verification_compare_numbers_subtitle">"Conferma che i numeri seguenti corrispondano a quelli mostrati nell\'altra sessione."</string>
<string name="screen_session_verification_compare_numbers_title">"Confronta i numeri"</string>
<string name="screen_session_verification_complete_subtitle">"La tua nuova sessione è ora verificata. Ha accesso ai tuoi messaggi crittografati e gli altri utenti la vedranno come attendibile."</string>
<string name="screen_session_verification_enter_recovery_key">"Inserisci la chiave di recupero"</string>
<string name="screen_session_verification_open_existing_session_subtitle">"Dimostra la tua identità per accedere alla cronologia dei messaggi crittografati."</string>
<string name="screen_session_verification_open_existing_session_title">"Apri una sessione esistente"</string>
<string name="screen_session_verification_positive_button_canceled">"Riprova la verifica"</string>

View File

@@ -8,7 +8,7 @@
<string name="screen_session_verification_complete_subtitle">"Ваш новий сеанс підтверджено. Він матиме доступ до ваших зашифрованих повідомлень, й інші користувачі вважатимуть його надійним."</string>
<string name="screen_session_verification_enter_recovery_key">"Введіть ключ відновлення"</string>
<string name="screen_session_verification_open_existing_session_subtitle">"Доведіть, що це Ви, щоб отримати доступ до історії зашифрованих повідомлень."</string>
<string name="screen_session_verification_open_existing_session_title">"Відкрити існуючий сеанс"</string>
<string name="screen_session_verification_open_existing_session_title">"Відкрийте існуючий сеанс"</string>
<string name="screen_session_verification_positive_button_canceled">"Повторити перевірку"</string>
<string name="screen_session_verification_positive_button_initial">"Я готовий"</string>
<string name="screen_session_verification_positive_button_verifying_ongoing">"Очікування збігу"</string>

View File

@@ -153,7 +153,7 @@ jsoup = "org.jsoup:jsoup:1.17.2"
appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" }
molecule-runtime = "app.cash.molecule:molecule-runtime:1.4.1"
timber = "com.jakewharton.timber:timber:5.0.1"
matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.2.7"
matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.2.8"
matrix_richtexteditor = { module = "io.element.android:wysiwyg", version.ref = "wysiwyg" }
matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose", version.ref = "wysiwyg" }
sqldelight-driver-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" }

View File

@@ -170,7 +170,7 @@ class StateContentFormatter @Inject constructor(
"RoomPinnedEvents"
}
}
is OtherState.RoomPowerLevels -> when (renderingMode) {
is OtherState.RoomUserPowerLevels -> when (renderingMode) {
RenderingMode.RoomList -> {
Timber.v("Filtering timeline item for room state change: $content")
null

View File

@@ -39,6 +39,8 @@
<string name="state_event_room_name_changed_by_you">"Вы змянілі назву пакоя на: %1$s"</string>
<string name="state_event_room_name_removed">"%1$s выдаліў(-ла) назву пакоя"</string>
<string name="state_event_room_name_removed_by_you">"Вы выдалілі назву пакоя"</string>
<string name="state_event_room_none">"%1$s не зрабіў ніякіх змен"</string>
<string name="state_event_room_none_by_you">"Вы не зрабілі ніякіх змен"</string>
<string name="state_event_room_reject">"%1$s адхіліў запрашэнне"</string>
<string name="state_event_room_reject_by_you">"Вы адхілілі запрашэнне"</string>
<string name="state_event_room_remove">"%1$s выдаліў %2$s"</string>

View File

@@ -3,12 +3,16 @@
<string name="state_event_avatar_changed_too">"(Avatar wurde auch geändert)"</string>
<string name="state_event_avatar_url_changed">"%1$s hat den Avatar geändert"</string>
<string name="state_event_avatar_url_changed_by_you">"Du hast deinen Avatar geändert"</string>
<string name="state_event_demoted_to_member">"%1$s wurde zum Mitglied herabgestuft"</string>
<string name="state_event_demoted_to_moderator">"%1$s wurde zum Moderator herabgestuft"</string>
<string name="state_event_display_name_changed_from">"%1$s hat den Anzeigenamen von %2$s auf %3$s geändert"</string>
<string name="state_event_display_name_changed_from_by_you">"Du hast deinen Anzeigenamen von %1$s auf %2$s geändert"</string>
<string name="state_event_display_name_removed">"%1$s hat den Anzeigenamen entfernt (war %2$s)"</string>
<string name="state_event_display_name_removed_by_you">"Du hast deinen Anzeigenamen entfernt (war %1$s)"</string>
<string name="state_event_display_name_set">"%1$s hat den Anzeigenamen auf %2$s geändert"</string>
<string name="state_event_display_name_set_by_you">"Du hast deinen Anzeigenamen zu %1$s geändert"</string>
<string name="state_event_promoted_to_administrator">"%1$s ist jetzt Administrator*in"</string>
<string name="state_event_promoted_to_moderator">"%1$s ist jetzt Moderator*in"</string>
<string name="state_event_room_avatar_changed">"%1$s hat den Raum-Avatar geändert"</string>
<string name="state_event_room_avatar_changed_by_you">"Du hast den Raum-Avatar geändert"</string>
<string name="state_event_room_avatar_removed">"%1$s hat den Raum-Avatar entfernt"</string>

View File

@@ -3,12 +3,16 @@
<string name="state_event_avatar_changed_too">"(lavatar a aussi été modifié)"</string>
<string name="state_event_avatar_url_changed">"%1$s a changé son avatar"</string>
<string name="state_event_avatar_url_changed_by_you">"Vous avez changé davatar"</string>
<string name="state_event_demoted_to_member">"%1$s a été rétrogradé vers simple utilisateur"</string>
<string name="state_event_demoted_to_moderator">"%1$s a été rétrogradé vers modérateur"</string>
<string name="state_event_display_name_changed_from">"%1$s a changé son pseudonyme de %2$s à %3$s"</string>
<string name="state_event_display_name_changed_from_by_you">"Vous avez changé votre pseudonyme de %1$s à %2$s"</string>
<string name="state_event_display_name_removed">"%1$s a supprimé son pseudonyme (cétait %2$s)"</string>
<string name="state_event_display_name_removed_by_you">"Vous avez supprimé votre pseudonyme (cétait %1$s)"</string>
<string name="state_event_display_name_set">"%1$s a défini son pseudonyme en tant que %2$s"</string>
<string name="state_event_display_name_set_by_you">"Vous avez défini votre pseudonyme comme %1$s"</string>
<string name="state_event_promoted_to_administrator">"%1$s a été promu administrateur"</string>
<string name="state_event_promoted_to_moderator">"%1$s a été promu modérateur"</string>
<string name="state_event_room_avatar_changed">"%1$s a changé lavatar du salon"</string>
<string name="state_event_room_avatar_changed_by_you">"Vous avez changé lavatar du salon"</string>
<string name="state_event_room_avatar_removed">"%1$s a supprimé lavatar du salon"</string>

View File

@@ -3,18 +3,22 @@
<string name="state_event_avatar_changed_too">"(anche l\'avatar è stato cambiato)"</string>
<string name="state_event_avatar_url_changed">"%1$s ha cambiato il proprio avatar"</string>
<string name="state_event_avatar_url_changed_by_you">"Hai cambiato il tuo avatar"</string>
<string name="state_event_demoted_to_member">"%1$s è stato declassato a membro"</string>
<string name="state_event_demoted_to_moderator">"%1$s è stato declassato a moderatore"</string>
<string name="state_event_display_name_changed_from">"%1$s ha cambiato il proprio nome visualizzato da %2$s a %3$s"</string>
<string name="state_event_display_name_changed_from_by_you">"Hai cambiato il tuo nome visualizzato da %1$s a %2$s"</string>
<string name="state_event_display_name_removed">"%1$s ha rimosso il proprio nome visualizzato (era %2$s)"</string>
<string name="state_event_display_name_removed_by_you">"Hai rimosso il tuo nome visualizzato (era %1$s)"</string>
<string name="state_event_display_name_set">"%1$s ha impostato il proprio nome visualizzato su %2$s"</string>
<string name="state_event_display_name_set_by_you">"Hai impostato il tuo nome visualizzato su %1$s"</string>
<string name="state_event_promoted_to_administrator">"%1$s è stato promosso amministratore"</string>
<string name="state_event_promoted_to_moderator">"%1$s è stato promosso a moderatore"</string>
<string name="state_event_room_avatar_changed">"%1$s ha cambiato l\'avatar della stanza"</string>
<string name="state_event_room_avatar_changed_by_you">"Hai cambiato l\'avatar della stanza"</string>
<string name="state_event_room_avatar_removed">"%1$s ha rimosso l\'avatar della stanza"</string>
<string name="state_event_room_avatar_removed_by_you">"Hai rimosso l\'avatar della stanza"</string>
<string name="state_event_room_ban">"%1$s ha rimosso %2$s"</string>
<string name="state_event_room_ban_by_you">"Hai rimosso %1$s"</string>
<string name="state_event_room_ban">"%1$s ha escluso %2$s"</string>
<string name="state_event_room_ban_by_you">"Hai escluso %1$s"</string>
<string name="state_event_room_created">"%1$s ha creato la stanza"</string>
<string name="state_event_room_created_by_you">"Hai creato la stanza"</string>
<string name="state_event_room_invite">"%1$s ha invitato %2$s"</string>
@@ -48,12 +52,12 @@
<string name="state_event_room_third_party_invite">"%1$s ha inviato un invito a %2$s per unirsi alla stanza"</string>
<string name="state_event_room_third_party_invite_by_you">"Hai inviato un invito a %1$s per unirsi alla stanza"</string>
<string name="state_event_room_third_party_revoked_invite">"%1$s ha revocato l\'invito di %2$s ad unirsi alla stanza."</string>
<string name="state_event_room_third_party_revoked_invite_by_you">"Hai revocato l\'invito a %1$s a universi alla stanza"</string>
<string name="state_event_room_topic_changed">"%1$s ha cambiato l\'oggetto in: %2$s"</string>
<string name="state_event_room_topic_changed_by_you">"Hai cambiato l\'oggetto in: %1$s"</string>
<string name="state_event_room_third_party_revoked_invite_by_you">"Hai revocato l\'invito a %1$s a unirsi alla stanza"</string>
<string name="state_event_room_topic_changed">"%1$s ha cambiato l\'argomento in: %2$s"</string>
<string name="state_event_room_topic_changed_by_you">"Hai cambiato l\'argomento in: %1$s"</string>
<string name="state_event_room_topic_removed">"%1$s ha rimosso l\'oggetto della stanza"</string>
<string name="state_event_room_topic_removed_by_you">"Hai rimosso l\'oggetto della stanza"</string>
<string name="state_event_room_topic_removed_by_you">"Hai rimosso l\'argomento della stanza"</string>
<string name="state_event_room_unban">"%1$s ha sbloccato %2$s"</string>
<string name="state_event_room_unban_by_you">"Hai sbloccato %1$s"</string>
<string name="state_event_room_unknown_membership_change">"%1$s ha apportato una modifica sconosciuta alla propria iscrizione"</string>
<string name="state_event_room_unknown_membership_change">"%1$s ha apportato una modifica sconosciuta alla propria presenza nella stanza"</string>
</resources>

View File

@@ -3,12 +3,16 @@
<string name="state_event_avatar_changed_too">"(аватар тоже был изменен)"</string>
<string name="state_event_avatar_url_changed">"%1$s сменили свой аватар"</string>
<string name="state_event_avatar_url_changed_by_you">"Вы сменили изображение"</string>
<string name="state_event_demoted_to_member">"%1$s был понижен в должности до участника"</string>
<string name="state_event_demoted_to_moderator">"%1$s был понижен в должности до модератора"</string>
<string name="state_event_display_name_changed_from">"%1$s изменил свое отображаемое имя с %2$s на %3$s"</string>
<string name="state_event_display_name_changed_from_by_you">"Вы изменили свое отображаемое имя с %1$s на %2$s"</string>
<string name="state_event_display_name_removed">"%1$s удалил свое отображаемое имя (оно было %2$s)"</string>
<string name="state_event_display_name_removed_by_you">"Вы удалили свое отображаемое имя (оно было %1$s)"</string>
<string name="state_event_display_name_set">"%1$s установили свое отображаемое имя на %2$s"</string>
<string name="state_event_display_name_set_by_you">"Вы установили отображаемое имя на %1$s"</string>
<string name="state_event_promoted_to_administrator">"%1$s был повышен до уровня администратора"</string>
<string name="state_event_promoted_to_moderator">"%1$s был повышен до модератора"</string>
<string name="state_event_room_avatar_changed">"%1$s изменил аватар комнаты"</string>
<string name="state_event_room_avatar_changed_by_you">"Вы изменили аватар комнаты"</string>
<string name="state_event_room_avatar_removed">"%1$s удалил аватар комнаты"</string>

View File

@@ -3,12 +3,16 @@
<string name="state_event_avatar_changed_too">"(obrázok bol tiež zmenený)"</string>
<string name="state_event_avatar_url_changed">"%1$s zmenili svoj obrázok"</string>
<string name="state_event_avatar_url_changed_by_you">"Zmenili ste svoj obrázok"</string>
<string name="state_event_demoted_to_member">"Používateľovi %1$s bola znížená úroveň na člena"</string>
<string name="state_event_demoted_to_moderator">"Používateľovi %1$s bola znížená úroveň na moderátora"</string>
<string name="state_event_display_name_changed_from">"%1$s zmenili svoje zobrazované meno z %2$s na %3$s"</string>
<string name="state_event_display_name_changed_from_by_you">"Zmenili ste si zobrazované meno z %1$s na %2$s"</string>
<string name="state_event_display_name_removed">"%1$s odstránili svoje zobrazované meno (predtým bolo %2$s)"</string>
<string name="state_event_display_name_removed_by_you">"Odstránili ste svoje zobrazované meno (predtým bolo %1$s)"</string>
<string name="state_event_display_name_set">"%1$s nastavili svoje zobrazované meno na %2$s"</string>
<string name="state_event_display_name_set_by_you">"Svoje zobrazované meno ste nastavili na %1$s"</string>
<string name="state_event_promoted_to_administrator">"%1$s bol/a povýšený/á na správcu"</string>
<string name="state_event_promoted_to_moderator">"%1$s bol/a povýšený/á na moderátora"</string>
<string name="state_event_room_avatar_changed">"%1$s zmenil/a obrázok miestnosti"</string>
<string name="state_event_room_avatar_changed_by_you">"Zmenili ste obrázok miestnosti"</string>
<string name="state_event_room_avatar_removed">"%1$s odstránil/a obrázok miestnosti"</string>

View File

@@ -650,7 +650,7 @@ class DefaultRoomLastMessageFormatterTest {
OtherState.RoomHistoryVisibility,
OtherState.RoomJoinRules,
OtherState.RoomPinnedEvents,
OtherState.RoomPowerLevels(emptyMap()),
OtherState.RoomUserPowerLevels(emptyMap()),
OtherState.RoomServerAcl,
OtherState.RoomTombstone,
OtherState.SpaceChild,

View File

@@ -29,6 +29,7 @@ import io.element.android.libraries.matrix.api.media.MediaUploadHandler
import io.element.android.libraries.matrix.api.media.VideoInfo
import io.element.android.libraries.matrix.api.poll.PollKind
import io.element.android.libraries.matrix.api.room.location.AssetType
import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels
import io.element.android.libraries.matrix.api.room.powerlevels.UserRoleChange
import io.element.android.libraries.matrix.api.timeline.MatrixTimeline
import io.element.android.libraries.matrix.api.timeline.ReceiptType
@@ -97,6 +98,12 @@ interface MatrixRoom : Closeable {
suspend fun unsubscribeFromSync()
suspend fun powerLevels(): Result<MatrixRoomPowerLevels>
suspend fun updatePowerLevels(matrixRoomPowerLevels: MatrixRoomPowerLevels): Result<Unit>
suspend fun resetPowerLevels(): Result<MatrixRoomPowerLevels>
suspend fun userRole(userId: UserId): Result<RoomMember.Role>
suspend fun updateUsersRoles(changes: List<UserRoleChange>): Result<Unit>

View File

@@ -20,6 +20,17 @@ import io.element.android.libraries.matrix.api.room.MatrixRoom
import io.element.android.libraries.matrix.api.room.MessageEventType
import io.element.android.libraries.matrix.api.room.StateEventType
data class MatrixRoomPowerLevels(
val ban: Long,
val invite: Long,
val kick: Long,
val sendEvents: Long,
val redactEvents: Long,
val roomName: Long,
val roomAvatar: Long,
val roomTopic: Long,
)
/**
* Shortcut for calling [MatrixRoom.canUserInvite] with our own user.
*/

View File

@@ -33,7 +33,7 @@ sealed interface OtherState {
data object RoomJoinRules : OtherState
data class RoomName(val name: String?) : OtherState
data object RoomPinnedEvents : OtherState
data class RoomPowerLevels(val users: Map<String, Long>) : OtherState
data class RoomUserPowerLevels(val users: Map<String, Long>) : OtherState
data object RoomServerAcl : OtherState
data class RoomThirdPartyInvite(val displayName: String?) : OtherState
data object RoomTombstone : OtherState

View File

@@ -39,6 +39,7 @@ import io.element.android.libraries.matrix.api.room.MessageEventType
import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.room.StateEventType
import io.element.android.libraries.matrix.api.room.location.AssetType
import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels
import io.element.android.libraries.matrix.api.room.powerlevels.UserRoleChange
import io.element.android.libraries.matrix.api.room.roomNotificationSettings
import io.element.android.libraries.matrix.api.timeline.MatrixTimeline
@@ -54,6 +55,7 @@ import io.element.android.libraries.matrix.impl.poll.toInner
import io.element.android.libraries.matrix.impl.room.location.toInner
import io.element.android.libraries.matrix.impl.room.member.RoomMemberListFetcher
import io.element.android.libraries.matrix.impl.room.member.RoomMemberMapper
import io.element.android.libraries.matrix.impl.room.powerlevels.RoomPowerLevelsMapper
import io.element.android.libraries.matrix.impl.timeline.RustMatrixTimeline
import io.element.android.libraries.matrix.impl.timeline.toRustReceiptType
import io.element.android.libraries.matrix.impl.util.mxCallbackFlow
@@ -86,6 +88,7 @@ import org.matrix.rustcomponents.sdk.messageEventContentFromHtml
import org.matrix.rustcomponents.sdk.messageEventContentFromMarkdown
import org.matrix.rustcomponents.sdk.use
import timber.log.Timber
import uniffi.matrix_sdk.RoomPowerLevelChanges
import java.io.File
import org.matrix.rustcomponents.sdk.Room as InnerRoom
import org.matrix.rustcomponents.sdk.Timeline as InnerTimeline
@@ -253,6 +256,34 @@ class RustMatrixRoom(
}
}
override suspend fun powerLevels(): Result<MatrixRoomPowerLevels> = withContext(roomDispatcher) {
runCatching {
RoomPowerLevelsMapper.map(innerRoom.getPowerLevels())
}
}
override suspend fun updatePowerLevels(matrixRoomPowerLevels: MatrixRoomPowerLevels): Result<Unit> = withContext(roomDispatcher) {
runCatching {
val changes = RoomPowerLevelChanges(
ban = matrixRoomPowerLevels.ban,
invite = matrixRoomPowerLevels.invite,
kick = matrixRoomPowerLevels.kick,
redact = matrixRoomPowerLevels.redactEvents,
eventsDefault = matrixRoomPowerLevels.sendEvents,
roomName = matrixRoomPowerLevels.roomName,
roomAvatar = matrixRoomPowerLevels.roomAvatar,
roomTopic = matrixRoomPowerLevels.roomTopic,
)
innerRoom.applyPowerLevelChanges(changes)
}
}
override suspend fun resetPowerLevels(): Result<MatrixRoomPowerLevels> = withContext(roomDispatcher) {
runCatching {
RoomPowerLevelsMapper.map(innerRoom.resetPowerLevels())
}
}
override suspend fun userAvatarUrl(userId: UserId): Result<String?> = withContext(roomDispatcher) {
runCatching {
innerRoom.memberAvatarUrl(userId.value)

View File

@@ -0,0 +1,35 @@
/*
* Copyright (c) 2024 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.element.android.libraries.matrix.impl.room.powerlevels
import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels
import org.matrix.rustcomponents.sdk.RoomPowerLevels as RustRoomPowerLevels
object RoomPowerLevelsMapper {
fun map(roomPowerLevels: RustRoomPowerLevels): MatrixRoomPowerLevels {
return MatrixRoomPowerLevels(
ban = roomPowerLevels.ban,
invite = roomPowerLevels.invite,
kick = roomPowerLevels.kick,
sendEvents = roomPowerLevels.eventsDefault,
redactEvents = roomPowerLevels.redact,
roomName = roomPowerLevels.roomName,
roomAvatar = roomPowerLevels.roomAvatar,
roomTopic = roomPowerLevels.roomTopic
)
}
}

View File

@@ -163,7 +163,7 @@ private fun RustOtherState.map(): OtherState {
RustOtherState.RoomJoinRules -> OtherState.RoomJoinRules
is RustOtherState.RoomName -> OtherState.RoomName(name)
RustOtherState.RoomPinnedEvents -> OtherState.RoomPinnedEvents
is RustOtherState.RoomPowerLevels -> OtherState.RoomPowerLevels(users)
is RustOtherState.RoomPowerLevels -> OtherState.RoomUserPowerLevels(users)
RustOtherState.RoomServerAcl -> OtherState.RoomServerAcl
is RustOtherState.RoomThirdPartyInvite -> OtherState.RoomThirdPartyInvite(displayName)
RustOtherState.RoomTombstone -> OtherState.RoomTombstone

View File

@@ -40,6 +40,7 @@ import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
import io.element.android.libraries.matrix.api.room.StateEventType
import io.element.android.libraries.matrix.api.room.location.AssetType
import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels
import io.element.android.libraries.matrix.api.room.powerlevels.UserRoleChange
import io.element.android.libraries.matrix.api.timeline.MatrixTimeline
import io.element.android.libraries.matrix.api.timeline.ReceiptType
@@ -125,6 +126,9 @@ class FakeMatrixRoom(
private var canUserTriggerRoomNotificationResult: Result<Boolean> = Result.success(true)
private var canUserJoinCallResult: Result<Boolean> = Result.success(true)
private var setIsFavoriteResult = Result.success(Unit)
private var powerLevelsResult = Result.success(defaultRoomPowerLevels())
private var updatePowerLevelsResult = Result.success(Unit)
private var resetPowerLevelsResult = Result.success(defaultRoomPowerLevels())
var sendMessageMentions = emptyList<Mention>()
val editMessageCalls = mutableListOf<Pair<String, String?>>()
private val _typingRecord = mutableListOf<Boolean>()
@@ -204,6 +208,17 @@ class FakeMatrixRoom(
override suspend fun subscribeToSync() = Unit
override suspend fun unsubscribeFromSync() = Unit
override suspend fun powerLevels(): Result<MatrixRoomPowerLevels> {
return powerLevelsResult
}
override suspend fun updatePowerLevels(matrixRoomPowerLevels: MatrixRoomPowerLevels): Result<Unit> = simulateLongTask {
updatePowerLevelsResult
}
override suspend fun resetPowerLevels(): Result<MatrixRoomPowerLevels> = simulateLongTask {
resetPowerLevelsResult
}
override fun destroy() = Unit
@@ -676,6 +691,18 @@ class FakeMatrixRoom(
fun givenRoomTypingMembers(typingMembers: List<UserId>) {
_roomTypingMembersFlow.tryEmit(typingMembers)
}
fun givenPowerLevelsResult(result: Result<MatrixRoomPowerLevels>) {
powerLevelsResult = result
}
fun givenUpdatePowerLevelsResult(result: Result<Unit>) {
updatePowerLevelsResult = result
}
fun givenResetPowerLevelsResult(result: Result<MatrixRoomPowerLevels>) {
resetPowerLevelsResult = result
}
}
data class SendLocationInvocation(
@@ -752,3 +779,14 @@ fun aRoomInfo(
userPowerLevels = userPowerLevels,
activeRoomCallParticipants = activeRoomCallParticipants.toImmutableList(),
)
fun defaultRoomPowerLevels() = MatrixRoomPowerLevels(
ban = 50,
invite = 0,
kick = 50,
sendEvents = 0,
redactEvents = 50,
roomName = 100,
roomAvatar = 100,
roomTopic = 100
)

View File

@@ -32,6 +32,7 @@
<item quantity="many">"%d новых паведамленняў"</item>
</plurals>
<string name="notification_reaction_body">"Адрэагаваў на %1$s"</string>
<string name="notification_room_action_mark_as_read">"Пазначыць як прачытанае"</string>
<string name="notification_room_action_quick_reply">"Хуткі адказ"</string>
<string name="notification_room_invite_body">"Запрасіў вас далучыцца да пакоя"</string>
<string name="notification_sender_me">"Я"</string>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="notification_channel_call">"Chiamata"</string>
<string name="notification_channel_listening_for_events">"Ascolto degli eventi"</string>
<string name="notification_channel_listening_for_events">"Eventi in ascolto"</string>
<string name="notification_channel_noisy">"Notifiche con suono"</string>
<string name="notification_channel_silent">"Notifiche silenziose"</string>
<plurals name="notification_compat_summary_line_for_room">
@@ -20,7 +20,7 @@
<item quantity="one">"%d invito"</item>
<item quantity="other">"%d inviti"</item>
</plurals>
<string name="notification_invite_body">"Ti ha invitato a chattare"</string>
<string name="notification_invite_body">"Ti ha invitato ad una conversazione"</string>
<string name="notification_mentioned_you_body">"Ti ha menzionato: %1$s"</string>
<string name="notification_new_messages">"Nuovi messaggi"</string>
<plurals name="notification_new_messages_for_room">

View File

@@ -7,13 +7,13 @@
<string name="rich_text_editor_composer_placeholder">"Messaggio…"</string>
<string name="rich_text_editor_create_link">"Crea un collegamento"</string>
<string name="rich_text_editor_edit_link">"Modifica collegamento"</string>
<string name="rich_text_editor_format_bold">"Applica il formato in grassetto"</string>
<string name="rich_text_editor_format_bold">"Applica il formato grassetto"</string>
<string name="rich_text_editor_format_italic">"Applicare il formato corsivo"</string>
<string name="rich_text_editor_format_strikethrough">"Applica il formato barrato"</string>
<string name="rich_text_editor_format_underline">"Applicare il formato di sottolineatura"</string>
<string name="rich_text_editor_full_screen_toggle">"Attiva/disattiva la modalità a schermo intero"</string>
<string name="rich_text_editor_indent">"Rientro a destra"</string>
<string name="rich_text_editor_inline_code">"Applicare il formato del codice in linea"</string>
<string name="rich_text_editor_inline_code">"Applicare il formato codice inline"</string>
<string name="rich_text_editor_link">"Imposta collegamento"</string>
<string name="rich_text_editor_numbered_list">"Attiva/disattiva elenco numerato"</string>
<string name="rich_text_editor_open_compose_options">"Apri le opzioni di composizione"</string>

View File

@@ -113,6 +113,7 @@
<string name="common_analytics">"Аналітыка"</string>
<string name="common_appearance">"Знешні выгляд"</string>
<string name="common_audio">"Аўдыё"</string>
<string name="common_blocked_users">"Заблакіраваныя карыстальнікі"</string>
<string name="common_bubbles">"Бурбалкі"</string>
<string name="common_chat_backup">"Рэзервовае капіраванне чата"</string>
<string name="common_copyright">"Аўтарскае права"</string>
@@ -129,7 +130,9 @@
<string name="common_enter_your_pin">"Увядзіце свой PIN-код"</string>
<string name="common_error">"Памылка"</string>
<string name="common_everyone">"Усе"</string>
<string name="common_failed">"Памылка"</string>
<string name="common_favourite">"Захаванае"</string>
<string name="common_favourited">"Абранае"</string>
<string name="common_file">"Файл"</string>
<string name="common_file_saved_on_disk_android">"Файл захаваны ў папку Спампоўкі"</string>
<string name="common_forward_message">"Перасылка паведамлення"</string>
@@ -155,6 +158,7 @@
<string name="common_mute">"Адключыць гук"</string>
<string name="common_no_results">"Вынікаў няма"</string>
<string name="common_offline">"Па-за сеткай"</string>
<string name="common_or">"або"</string>
<string name="common_password">"Пароль"</string>
<string name="common_people">"Людзі"</string>
<string name="common_permalink">"Пастаянная спасылка"</string>
@@ -181,6 +185,7 @@
<string name="common_room">"Пакой"</string>
<string name="common_room_name">"Назва пакоя"</string>
<string name="common_room_name_placeholder">"напрыклад, назва вашага праекта"</string>
<string name="common_saving">"Захаванне"</string>
<string name="common_screen_lock">"Блакіроўка экрана"</string>
<string name="common_search_for_someone">"Шукаць карыстальніка"</string>
<string name="common_search_results">"Вынікі пошуку"</string>
@@ -192,6 +197,7 @@
<string name="common_server_not_supported">"Сервер не падтрымліваецца"</string>
<string name="common_server_url">"URL-адрас сервера"</string>
<string name="common_settings">"Налады"</string>
<string name="common_shared_location">"Абагуленыя геаданыя"</string>
<string name="common_signing_out">"Выхад"</string>
<string name="common_starting_chat">"Пачатак чата…"</string>
<string name="common_sticker">"Стыкер"</string>
@@ -239,6 +245,14 @@
<string name="screen_media_picker_error_failed_selection">"Не ўдалося выбраць носьбіт, паўтарыце спробу."</string>
<string name="screen_media_upload_preview_error_failed_processing">"Не атрымалася апрацаваць медыяфайл для загрузкі, паспрабуйце яшчэ раз."</string>
<string name="screen_media_upload_preview_error_failed_sending">"Не атрымалася загрузіць медыяфайлы, паспрабуйце яшчэ раз."</string>
<string name="screen_room_error_failed_processing_media">"Не атрымалася апрацаваць медыяфайл для загрузкі, паспрабуйце яшчэ раз."</string>
<string name="screen_room_error_failed_retrieving_user_details">"Не ўдалося атрымаць інфармацыю пра карыстальніка"</string>
<string name="screen_room_member_details_block_alert_action">"Заблакіраваць"</string>
<string name="screen_room_member_details_block_alert_description">"Заблакіраваныя карыстальнікі не змогуць адпраўляць вам паведамленні, і ўсе іх паведамленні будуць схаваны. Вы можаце разблакіраваць іх у любы час."</string>
<string name="screen_room_member_details_block_user">"Заблакіраваць карыстальніка"</string>
<string name="screen_room_member_details_unblock_alert_action">"Разблакіраваць"</string>
<string name="screen_room_member_details_unblock_alert_description">"Вы зноў зможаце ўбачыць усе паведамленні."</string>
<string name="screen_room_member_details_unblock_user">"Разблакіраваць карыстальніка"</string>
<string name="screen_share_location_title">"Падзяліцца месцазнаходжаннем"</string>
<string name="screen_share_my_location_action">"Падзяліцца маім месцазнаходжаннем"</string>
<string name="screen_share_open_apple_maps">"Адкрыць у Apple Maps"</string>

View File

@@ -198,6 +198,10 @@
<string name="invite_friends_rich_title">"🔐️ Присъединете се към мен в %1$s"</string>
<string name="invite_friends_text">"Хей, говорете с мен в %1$s: %2$s"</string>
<string name="login_initial_device_name_android">"%1$s Android"</string>
<string name="screen_room_member_details_block_alert_action">"Блокиране"</string>
<string name="screen_room_member_details_block_user">"Блокиране на потребителя"</string>
<string name="screen_room_member_details_unblock_alert_action">"Отблокиране"</string>
<string name="screen_room_member_details_unblock_user">"Отблокиране на потребителя"</string>
<string name="screen_share_location_title">"Споделяне на местоположение"</string>
<string name="screen_share_my_location_action">"Споделяне на моето местоположение"</string>
<string name="screen_share_open_apple_maps">"Отваряне в Apple Maps"</string>

View File

@@ -251,6 +251,14 @@
<string name="screen_media_picker_error_failed_selection">"Výběr média se nezdařil, zkuste to prosím znovu."</string>
<string name="screen_media_upload_preview_error_failed_processing">"Nahrání média se nezdařilo, zkuste to prosím znovu."</string>
<string name="screen_media_upload_preview_error_failed_sending">"Nahrání média se nezdařilo, zkuste to prosím znovu."</string>
<string name="screen_room_error_failed_processing_media">"Nahrání média se nezdařilo, zkuste to prosím znovu."</string>
<string name="screen_room_error_failed_retrieving_user_details">"Nepodařilo se načíst údaje o uživateli"</string>
<string name="screen_room_member_details_block_alert_action">"Zablokovat"</string>
<string name="screen_room_member_details_block_alert_description">"Blokovaní uživatelé vám nebudou moci posílat zprávy a všechny jejich zprávy budou skryty. Můžete je kdykoli odblokovat."</string>
<string name="screen_room_member_details_block_user">"Zablokovat uživatele"</string>
<string name="screen_room_member_details_unblock_alert_action">"Odblokovat"</string>
<string name="screen_room_member_details_unblock_alert_description">"Znovu uvidíte všechny zprávy od nich."</string>
<string name="screen_room_member_details_unblock_user">"Odblokovat uživatele"</string>
<string name="screen_share_location_title">"Sdílet polohu"</string>
<string name="screen_share_my_location_action">"Sdílet moji polohu"</string>
<string name="screen_share_open_apple_maps">"Otevřít v Mapách Apple"</string>

Some files were not shown because too many files have changed in this diff Show More