Merge branch 'develop' into feature/jme/add-simplified-sliding-sync-toggle

This commit is contained in:
ganfra 2024-07-24 17:35:57 +02:00
commit 60fdee32bf
163 changed files with 4353 additions and 1579 deletions

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="error_no_compatible_app_found">"Nie znaleziono kompatybilnej aplikacji do obsługi tej akcji."</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="error_no_compatible_app_found">"Nenhum aplicativo compatível foi encontrado para lidar com essa ação."</string>
</resources>

View file

@ -85,7 +85,7 @@ class DefaultRoomLastMessageFormatter @Inject constructor(
}
}
is StickerContent -> {
content.body
prefixIfNeeded(sp.getString(CommonStrings.common_sticker) + " (" + content.body + ")", senderDisambiguatedDisplayName, isDmRoom)
}
is UnableToDecryptContent -> {
val message = sp.getString(CommonStrings.common_waiting_for_decryption_key)

View file

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="state_event_avatar_changed_too">"(zdjęcie profilowe też zostało zmienione)"</string>
<string name="state_event_avatar_url_changed">"%1$s zmienił swoje zdjęcie profilowe"</string>
<string name="state_event_avatar_url_changed_by_you">"Zmieniłeś swoje zdjęcie profilowe"</string>
<string name="state_event_display_name_changed_from">"%1$s zmienił swoją wyświetlaną nazwę z %2$s na %3$s"</string>
<string name="state_event_display_name_changed_from_by_you">"Zmieniłeś swoją wyświetlaną nazwę z %1$s na %2$s"</string>
<string name="state_event_display_name_removed">"%1$s usunął swoją wyświetlaną nazwę (byo to %2$s)"</string>
<string name="state_event_display_name_removed_by_you">"Usunąłeś swoją wyświetlaną nazwę (było to %1$s)"</string>
<string name="state_event_display_name_set">"%1$s ustawił swoją wyświetlaną nazwę na %2$s"</string>
<string name="state_event_display_name_set_by_you">"Ustawiłeś swoją wyświetlaną nazwę na %1$s"</string>
<string name="state_event_room_avatar_changed">"%1$s zmienił zdjęcie profilowe pokoju"</string>
<string name="state_event_room_avatar_changed_by_you">"Zmieniłeś zdjęcie profilowe pokoju"</string>
<string name="state_event_room_avatar_removed">"%1$s usunął zdjęcie profilowe pokoju"</string>
<string name="state_event_room_avatar_removed_by_you">"Usunąłeś zdjęcie profilowe pokoju"</string>
<string name="state_event_room_ban">"%1$s zbanował %2$s"</string>
<string name="state_event_room_ban_by_you">"Zbanowałeś %1$s"</string>
<string name="state_event_room_created">"%1$s stworzył pokój"</string>
<string name="state_event_room_created_by_you">"Stworzyłeś pokój"</string>
<string name="state_event_room_invite">"%1$s zaprosił %2$s"</string>
<string name="state_event_room_invite_accepted">"%1$s zaakceptował zaproszenie"</string>
<string name="state_event_room_invite_accepted_by_you">"Zaakceptowałeś zaproszenie"</string>
<string name="state_event_room_invite_by_you">"Zaprosiłeś %1$s"</string>
<string name="state_event_room_invite_you">"%1$s zaprosił Cię"</string>
<string name="state_event_room_join">"%1$s dołączył do pokoju"</string>
<string name="state_event_room_join_by_you">"Dołączyłeś(aś) do pokoju"</string>
<string name="state_event_room_knock">"%1$s prosi o możliwość dołączenia"</string>
<string name="state_event_room_knock_accepted">"%1$s zezwolił %2$s na dołączenie"</string>
<string name="state_event_room_knock_accepted_by_you">"Zezwoliłeś %1$s na dołączenie"</string>
<string name="state_event_room_knock_by_you">"Poprosiłeś o możliwość dołączenia"</string>
<string name="state_event_room_knock_denied">"%1$s odrzucił prośbę %2$s o dołączenie"</string>
<string name="state_event_room_knock_denied_by_you">"Odrzuciłeś prośbę %1$s o dołączenie"</string>
<string name="state_event_room_knock_denied_you">"%1$s odrzucił Twoją prośbę o dołączenie"</string>
<string name="state_event_room_knock_retracted">"%1$s nie jest już zainteresowany dołączeniem"</string>
<string name="state_event_room_knock_retracted_by_you">"Anulowałeś prośbę o dołączenie"</string>
<string name="state_event_room_leave">"%1$s opuścił pokój"</string>
<string name="state_event_room_leave_by_you">"Opuściłeś pokój"</string>
<string name="state_event_room_name_changed">"%1$s zmienił nazwę pokoju na: %2$s"</string>
<string name="state_event_room_name_changed_by_you">"Zmieniłeś nazwę pokoju na: %1$s"</string>
<string name="state_event_room_name_removed">"%1$s usunął nazwę pokoju"</string>
<string name="state_event_room_name_removed_by_you">"Usunąłeś nazwę pokoju"</string>
<string name="state_event_room_none">"%1$s nie wprowadził żadnych zmian"</string>
<string name="state_event_room_none_by_you">"Nie wprowadzono żadnych zmian"</string>
<string name="state_event_room_reject">"%1$s odrzucił zaproszenie"</string>
<string name="state_event_room_reject_by_you">"Odrzuciłeś(aś) zaproszenie"</string>
<string name="state_event_room_remove">"%1$s usunął %2$s"</string>
<string name="state_event_room_remove_by_you">"Usunąłeś %1$s"</string>
<string name="state_event_room_third_party_invite">"%1$s wysłał zaproszenie do %2$s, aby dołączył do pokoju"</string>
<string name="state_event_room_third_party_invite_by_you">"Wysłano zaproszenie do %1$s, aby dołączył do pokoju"</string>
<string name="state_event_room_third_party_revoked_invite">"%1$s cofnął zaproszenie dla %2$s do tego pokoju"</string>
<string name="state_event_room_third_party_revoked_invite_by_you">"Odwołano zaproszenie %1$s, aby dołączył do pokoju"</string>
<string name="state_event_room_topic_changed">"%1$s zmienił temat na: %2$s"</string>
<string name="state_event_room_topic_changed_by_you">"Zmieniłeś temat na: %1$s"</string>
<string name="state_event_room_topic_removed">"%1$s usunął temat pokoju"</string>
<string name="state_event_room_topic_removed_by_you">"Usunąłeś temat pokoju"</string>
<string name="state_event_room_unban">"%1$s odbanował %2$s"</string>
<string name="state_event_room_unban_by_you">"Odbanowałeś %1$s"</string>
<string name="state_event_room_unknown_membership_change">"%1$s dokonał nieznanej zmiany w swoim członkostwie"</string>
</resources>

View file

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="state_event_avatar_changed_too">"(o avatar também foi alterado)"</string>
<string name="state_event_avatar_url_changed">"%1$s mudou seu avatar"</string>
<string name="state_event_avatar_url_changed_by_you">"Você mudou seu avatar"</string>
<string name="state_event_display_name_changed_from">"%1$s mudou seu nome de exibição de %2$s para %3$s"</string>
<string name="state_event_display_name_changed_from_by_you">"Você alterou seu nome de exibição de %1$s para %2$s"</string>
<string name="state_event_display_name_removed">"%1$s removeu seu nome de exibição (era %2$s)"</string>
<string name="state_event_display_name_removed_by_you">"Você removeu seu nome de exibição (era %1$s)"</string>
<string name="state_event_display_name_set">"%1$s definiu seu nome de exibição como %2$s"</string>
<string name="state_event_display_name_set_by_you">"Você definiu seu nome de exibição como %1$s"</string>
<string name="state_event_room_avatar_changed">"%1$s mudou o avatar da sala"</string>
<string name="state_event_room_avatar_changed_by_you">"Você mudou o avatar da sala"</string>
<string name="state_event_room_avatar_removed">"%1$s removeu o avatar da sala"</string>
<string name="state_event_room_avatar_removed_by_you">"Você removeu o avatar da sala"</string>
<string name="state_event_room_ban">"%1$s baniu %2$s"</string>
<string name="state_event_room_ban_by_you">"Você baniu %1$s"</string>
<string name="state_event_room_created">"%1$s criou a sala"</string>
<string name="state_event_room_created_by_you">"Você criou a sala"</string>
<string name="state_event_room_invite">"%1$s convidou %2$s"</string>
<string name="state_event_room_invite_accepted">"%1$s aceitou o convite"</string>
<string name="state_event_room_invite_accepted_by_you">"Você aceitou o convite"</string>
<string name="state_event_room_invite_by_you">"Você convidou %1$s"</string>
<string name="state_event_room_invite_you">"%1$s convidou você"</string>
<string name="state_event_room_join">"%1$s entrou na sala"</string>
<string name="state_event_room_join_by_you">"Você entrou na sala"</string>
<string name="state_event_room_knock">"%1$s solicitou entrada"</string>
<string name="state_event_room_knock_accepted">"%1$s permitiu que o %2$s entrar"</string>
<string name="state_event_room_knock_accepted_by_you">"Você permitiu que o %1$s entrasse"</string>
<string name="state_event_room_knock_by_you">"Você solicitou entrada"</string>
<string name="state_event_room_knock_denied">"%1$s rejeitou a solicitação de %2$s para entrar"</string>
<string name="state_event_room_knock_denied_by_you">"Você rejeitou a solicitação de %1$s para entrar"</string>
<string name="state_event_room_knock_denied_you">"%1$s rejeitou sua solicitação para entrar"</string>
<string name="state_event_room_knock_retracted">"%1$s não está mais interessado em entrar"</string>
<string name="state_event_room_knock_retracted_by_you">"Você cancelou seu pedido para entrar"</string>
<string name="state_event_room_leave">"%1$s saiu da sala"</string>
<string name="state_event_room_leave_by_you">"Você saiu da sala"</string>
<string name="state_event_room_name_changed">"%1$s mudou o nome da sala para: %2$s"</string>
<string name="state_event_room_name_changed_by_you">"Você mudou o nome da sala para: %1$s"</string>
<string name="state_event_room_name_removed">"%1$s removeu o nome da sala"</string>
<string name="state_event_room_name_removed_by_you">"Você removeu o nome da sala"</string>
<string name="state_event_room_reject">"%1$s rejeitou o convite"</string>
<string name="state_event_room_reject_by_you">"Você rejeitou o convite"</string>
<string name="state_event_room_remove">"%1$s removido %2$s"</string>
<string name="state_event_room_remove_by_you">"Você removeu %1$s"</string>
<string name="state_event_room_third_party_invite">"%1$s enviou um convite para %2$s para entrar na sala"</string>
<string name="state_event_room_third_party_invite_by_you">"Você enviou um convite para %1$s para entrar na sala"</string>
<string name="state_event_room_third_party_revoked_invite">"%1$s revogou o convite para %2$s para entrar na sala"</string>
<string name="state_event_room_third_party_revoked_invite_by_you">"Você revogou o convite para %1$s para entrar na sala"</string>
<string name="state_event_room_topic_changed">"%1$s mudou o tópico para: %2$s"</string>
<string name="state_event_room_topic_changed_by_you">"Você mudou o tópico para: %1$s"</string>
<string name="state_event_room_topic_removed">"%1$s removeu o tópico da sala"</string>
<string name="state_event_room_topic_removed_by_you">"Você removeu o tópico da sala"</string>
<string name="state_event_room_unban">"%1$s desbaniu %2$s"</string>
<string name="state_event_room_unban_by_you">"Você desbaniu %1$s"</string>
<string name="state_event_room_unknown_membership_change">"%1$s fez uma alteração desconhecida em sua associação"</string>
</resources>

View file

@ -105,11 +105,12 @@ class DefaultRoomLastMessageFormatterTest {
@Test
@Config(qualifiers = "en")
fun `Sticker content`() {
val body = "body"
val body = "a sticker body"
val info = ImageInfo(null, null, null, null, null, null, null)
val message = createRoomEvent(false, null, StickerContent(body, info, aMediaSource(url = "url")))
val result = formatter.format(message, false)
assertThat(result).isEqualTo(body)
val expectedBody = someoneElseId.toString() + ": Sticker (a sticker body)"
assertThat(result.toString()).isEqualTo(expectedBody)
}
@Test

View file

@ -126,6 +126,8 @@ interface MatrixRoom : Closeable {
suspend fun sendMessage(body: String, htmlBody: String?, mentions: List<Mention>): Result<Unit>
suspend fun editMessage(eventId: EventId, body: String, htmlBody: String?, mentions: List<Mention>): Result<Unit>
suspend fun sendImage(
file: File,
thumbnailFile: File?,

View file

@ -18,4 +18,5 @@ package io.element.android.libraries.matrix.api.timeline
sealed class TimelineException : Exception() {
data object CannotPaginate : TimelineException()
data object EventNotFound : TimelineException()
}

View file

@ -56,6 +56,7 @@ 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.RustTimeline
import io.element.android.libraries.matrix.impl.timeline.toRustReceiptType
import io.element.android.libraries.matrix.impl.util.MessageEventContent
import io.element.android.libraries.matrix.impl.util.mxCallbackFlow
import io.element.android.libraries.matrix.impl.widget.RustWidgetDriver
import io.element.android.libraries.matrix.impl.widget.generateWidgetWebViewUrl
@ -324,6 +325,14 @@ class RustMatrixRoom(
}
}
override suspend fun editMessage(eventId: EventId, body: String, htmlBody: String?, mentions: List<Mention>): Result<Unit> = withContext(roomDispatcher) {
runCatching {
MessageEventContent.from(body, htmlBody, mentions).use { newContent ->
innerRoom.edit(eventId.value, newContent)
}
}
}
override suspend fun sendMessage(body: String, htmlBody: String?, mentions: List<Mention>): Result<Unit> {
return liveTimeline.sendMessage(body, htmlBody, mentions)
}

View file

@ -42,7 +42,6 @@ import io.element.android.libraries.matrix.impl.media.toMSC3246range
import io.element.android.libraries.matrix.impl.poll.toInner
import io.element.android.libraries.matrix.impl.room.RoomContentForwarder
import io.element.android.libraries.matrix.impl.room.location.toInner
import io.element.android.libraries.matrix.impl.room.map
import io.element.android.libraries.matrix.impl.timeline.item.event.EventTimelineItemMapper
import io.element.android.libraries.matrix.impl.timeline.item.event.TimelineEventContentMapper
import io.element.android.libraries.matrix.impl.timeline.item.virtual.VirtualTimelineItemMapper
@ -51,6 +50,7 @@ import io.element.android.libraries.matrix.impl.timeline.postprocessor.LoadingIn
import io.element.android.libraries.matrix.impl.timeline.postprocessor.RoomBeginningPostProcessor
import io.element.android.libraries.matrix.impl.timeline.postprocessor.TimelineEncryptedHistoryPostProcessor
import io.element.android.libraries.matrix.impl.timeline.reply.InReplyToMapper
import io.element.android.libraries.matrix.impl.util.MessageEventContent
import io.element.android.services.toolbox.api.systemclock.SystemClock
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CoroutineDispatcher
@ -70,12 +70,10 @@ import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.matrix.rustcomponents.sdk.EventTimelineItem
import org.matrix.rustcomponents.sdk.FormattedBody
import org.matrix.rustcomponents.sdk.MessageFormat
import org.matrix.rustcomponents.sdk.RoomMessageEventContentWithoutRelation
import org.matrix.rustcomponents.sdk.SendAttachmentJoinHandle
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_ui.LiveBackPaginationStatus
@ -266,7 +264,7 @@ class RustTimeline(
}
override suspend fun sendMessage(body: String, htmlBody: String?, mentions: List<Mention>): Result<Unit> = withContext(dispatcher) {
messageEventContentFromParts(body, htmlBody).withMentions(mentions.map()).use { content ->
MessageEventContent.from(body, htmlBody, mentions).use { content ->
runCatching<Unit> {
inner.send(content)
}
@ -275,20 +273,8 @@ class RustTimeline(
override suspend fun redactEvent(eventId: EventId?, transactionId: TransactionId?, reason: String?): Result<Boolean> = withContext(dispatcher) {
runCatching {
when {
eventId != null -> {
inner.getEventTimelineItemByEventId(eventId.value).use {
inner.redactEvent(item = it, reason = reason)
}
}
transactionId != null -> {
inner.getEventTimelineItemByTransactionId(transactionId.value).use {
inner.redactEvent(item = it, reason = reason)
}
}
else -> {
error("Either eventId or transactionId must be non-null")
}
getEventTimelineItem(eventId, transactionId).use { item ->
inner.redactEvent(item = item, reason = reason)
}
}
}
@ -302,26 +288,11 @@ class RustTimeline(
): Result<Unit> =
withContext(dispatcher) {
runCatching<Unit> {
when {
originalEventId != null -> {
inner.getEventTimelineItemByEventId(originalEventId.value).use {
inner.edit(
newContent = messageEventContentFromParts(body, htmlBody).withMentions(mentions.map()),
item = it,
)
}
}
transactionId != null -> {
inner.getEventTimelineItemByTransactionId(transactionId.value).use {
inner.edit(
newContent = messageEventContentFromParts(body, htmlBody).withMentions(mentions.map()),
item = it,
)
}
}
else -> {
error("Either originalEventId or transactionId must be non null")
}
getEventTimelineItem(originalEventId, transactionId).use { item ->
inner.edit(
newContent = MessageEventContent.from(body, htmlBody, mentions),
item = item,
)
}
}
}
@ -334,7 +305,7 @@ class RustTimeline(
fromNotification: Boolean,
): Result<Unit> = withContext(dispatcher) {
runCatching {
val msg = messageEventContentFromParts(body, htmlBody).withMentions(mentions.map())
val msg = MessageEventContent.from(body, htmlBody, mentions)
inner.sendReply(msg, eventId.value)
}
}
@ -361,6 +332,20 @@ class RustTimeline(
}
}
@Throws
private suspend fun getEventTimelineItem(eventId: EventId?, transactionId: TransactionId?): EventTimelineItem {
return try {
when {
eventId != null -> inner.getEventTimelineItemByEventId(eventId.value)
transactionId != null -> inner.getEventTimelineItemByTransactionId(transactionId.value)
else -> error("Either eventId or transactionId must be non-null")
}
} catch (e: Exception) {
Timber.e(e, "Failed to get event timeline item")
throw TimelineException.EventNotFound
}
}
override suspend fun sendVideo(
file: File,
thumbnailFile: File?,
@ -517,13 +502,6 @@ class RustTimeline(
)
}
private fun messageEventContentFromParts(body: String, htmlBody: String?): RoomMessageEventContentWithoutRelation =
if (htmlBody != null) {
messageEventContentFromHtml(body, htmlBody)
} else {
messageEventContentFromMarkdown(body)
}
private fun sendAttachment(files: List<File>, handle: () -> SendAttachmentJoinHandle): Result<MediaUploadHandler> {
return runCatching {
MediaUploadHandlerImpl(files, handle())

View file

@ -0,0 +1,36 @@
/*
* 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
*
* https://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.util
import io.element.android.libraries.matrix.api.room.Mention
import io.element.android.libraries.matrix.impl.room.map
import org.matrix.rustcomponents.sdk.RoomMessageEventContentWithoutRelation
import org.matrix.rustcomponents.sdk.messageEventContentFromHtml
import org.matrix.rustcomponents.sdk.messageEventContentFromMarkdown
/**
* Creates a [RoomMessageEventContentWithoutRelation] from a body, an html body and a list of mentions.
*/
object MessageEventContent {
fun from(body: String, htmlBody: String?, mentions: List<Mention>): RoomMessageEventContentWithoutRelation {
return if (htmlBody != null) {
messageEventContentFromHtml(body, htmlBody)
} else {
messageEventContentFromMarkdown(body)
}.withMentions(mentions.map())
}
}

View file

@ -21,7 +21,7 @@ import io.element.android.libraries.matrix.api.MatrixClientProvider
import io.element.android.libraries.matrix.api.core.SessionId
class FakeMatrixClientProvider(
private val getClient: (SessionId) -> Result<MatrixClient> = { Result.success(FakeMatrixClient()) }
var getClient: (SessionId) -> Result<MatrixClient> = { Result.success(FakeMatrixClient()) }
) : MatrixClientProvider {
override suspend fun getOrRestore(sessionId: SessionId): Result<MatrixClient> = getClient(sessionId)

View file

@ -56,7 +56,7 @@ import io.element.android.libraries.matrix.test.A_SESSION_ID
import io.element.android.libraries.matrix.test.media.FakeMediaUploadHandler
import io.element.android.libraries.matrix.test.notificationsettings.FakeNotificationSettingsService
import io.element.android.libraries.matrix.test.timeline.FakeTimeline
import io.element.android.libraries.matrix.test.widget.FakeMatrixWidgetDriver
import io.element.android.tests.testutils.lambda.lambdaError
import io.element.android.tests.testutils.simulateLongTask
import kotlinx.collections.immutable.ImmutableMap
import kotlinx.collections.immutable.persistentMapOf
@ -84,126 +84,88 @@ class FakeMatrixRoom(
override val activeMemberCount: Long = 234L,
val notificationSettingsService: NotificationSettingsService = FakeNotificationSettingsService(),
override val liveTimeline: Timeline = FakeTimeline(),
private var roomPermalinkResult: () -> Result<String> = { Result.success("room link") },
private var eventPermalinkResult: (EventId) -> Result<String> = { Result.success("event link") },
var sendCallNotificationIfNeededResult: () -> Result<Unit> = { Result.success(Unit) },
canRedactOwn: Boolean = false,
canRedactOther: Boolean = false,
private var roomPermalinkResult: () -> Result<String> = { lambdaError() },
private var eventPermalinkResult: (EventId) -> Result<String> = { lambdaError() },
private val sendCallNotificationIfNeededResult: () -> Result<Unit> = { lambdaError() },
private val userDisplayNameResult: () -> Result<String?> = { lambdaError() },
private val userAvatarUrlResult: () -> Result<String?> = { lambdaError() },
private val userRoleResult: () -> Result<RoomMember.Role> = { lambdaError() },
private val getUpdatedMemberResult: (UserId) -> Result<RoomMember> = { lambdaError() },
private val joinRoomResult: () -> Result<Unit> = { lambdaError() },
private val inviteUserResult: (UserId) -> Result<Unit> = { lambdaError() },
private val canInviteResult: (UserId) -> Result<Boolean> = { lambdaError() },
private val canKickResult: (UserId) -> Result<Boolean> = { lambdaError() },
private val canBanResult: (UserId) -> Result<Boolean> = { lambdaError() },
private val canRedactOwnResult: (UserId) -> Result<Boolean> = { lambdaError() },
private val canRedactOtherResult: (UserId) -> Result<Boolean> = { lambdaError() },
private val canSendStateResult: (UserId, StateEventType) -> Result<Boolean> = { _, _ -> lambdaError() },
private val canUserSendMessageResult: (UserId, MessageEventType) -> Result<Boolean> = { _, _ -> lambdaError() },
private val sendMediaResult: (ProgressCallback?) -> Result<FakeMediaUploadHandler> = { lambdaError() },
private val setNameResult: (String) -> Result<Unit> = { lambdaError() },
private val setTopicResult: (String) -> Result<Unit> = { lambdaError() },
private val updateAvatarResult: (String, ByteArray) -> Result<Unit> = { _, _ -> lambdaError() },
private val removeAvatarResult: () -> Result<Unit> = { lambdaError() },
private val sendMessageResult: (String, String?, List<Mention>) -> Result<Unit> = { _, _, _ -> lambdaError() },
private val updateUserRoleResult: () -> Result<Unit> = { lambdaError() },
private val toggleReactionResult: (String, EventId) -> Result<Unit> = { _, _ -> lambdaError() },
private val retrySendMessageResult: (TransactionId) -> Result<Unit> = { lambdaError() },
private val cancelSendResult: (TransactionId) -> Result<Boolean> = { lambdaError() },
private val forwardEventResult: (EventId, List<RoomId>) -> Result<Unit> = { _, _ -> lambdaError() },
private val reportContentResult: (EventId, String, UserId?) -> Result<Unit> = { _, _, _ -> lambdaError() },
private val kickUserResult: (UserId, String?) -> Result<Unit> = { _, _ -> lambdaError() },
private val banUserResult: (UserId, String?) -> Result<Unit> = { _, _ -> lambdaError() },
private val unBanUserResult: (UserId, String?) -> Result<Unit> = { _, _ -> lambdaError() },
private val sendLocationResult: (String, String, String?, Int?, AssetType?) -> Result<Unit> = { _, _, _, _, _ -> lambdaError() },
private val createPollResult: (String, List<String>, Int, PollKind) -> Result<Unit> = { _, _, _, _ -> lambdaError() },
private val editPollResult: (EventId, String, List<String>, Int, PollKind) -> Result<Unit> = { _, _, _, _, _ -> lambdaError() },
private val sendPollResponseResult: (EventId, List<String>) -> Result<Unit> = { _, _ -> lambdaError() },
private val endPollResult: (EventId, String) -> Result<Unit> = { _, _ -> lambdaError() },
private val progressCallbackValues: List<Pair<Long, Long>> = emptyList(),
private val generateWidgetWebViewUrlResult: (MatrixWidgetSettings, String, String?, String?) -> Result<String> = { _, _, _, _ -> lambdaError() },
private val getWidgetDriverResult: (MatrixWidgetSettings) -> Result<MatrixWidgetDriver> = { lambdaError() },
private val canUserTriggerRoomNotificationResult: (UserId) -> Result<Boolean> = { lambdaError() },
private val canUserJoinCallResult: (UserId) -> Result<Boolean> = { lambdaError() },
private val setIsFavoriteResult: (Boolean) -> Result<Unit> = { lambdaError() },
private val powerLevelsResult: () -> Result<MatrixRoomPowerLevels> = { lambdaError() },
private val updatePowerLevelsResult: () -> Result<Unit> = { lambdaError() },
private val resetPowerLevelsResult: () -> Result<MatrixRoomPowerLevels> = { lambdaError() },
private val typingNoticeResult: (Boolean) -> Result<Unit> = { lambdaError() },
private val leaveRoomLambda: () -> Result<Unit> = { lambdaError() },
private val updateMembersResult: () -> Unit = { lambdaError() },
private val getMembersResult: (Int) -> Result<List<RoomMember>> = { lambdaError() },
private val timelineFocusedOnEventResult: (EventId) -> Result<Timeline> = { lambdaError() },
private val setSendQueueEnabledLambda: (Boolean) -> Unit = { _: Boolean -> },
private val saveComposerDraftLambda: (ComposerDraft) -> Result<Unit> = { _: ComposerDraft -> Result.success(Unit) },
private val loadComposerDraftLambda: () -> Result<ComposerDraft?> = { Result.success<ComposerDraft?>(null) },
private val clearComposerDraftLambda: () -> Result<Unit> = { Result.success(Unit) },
) : MatrixRoom {
private var ignoreResult: Result<Unit> = Result.success(Unit)
private var unignoreResult: Result<Unit> = Result.success(Unit)
private var userDisplayNameResult = Result.success<String?>(null)
private var userAvatarUrlResult = Result.success<String?>(null)
private var userRoleResult = Result.success(RoomMember.Role.USER)
private var getRoomMemberResult = Result.failure<RoomMember>(IllegalStateException("Member not found"))
private var joinRoomResult = Result.success(Unit)
private var inviteUserResult = Result.success(Unit)
private var canInviteResult = Result.success(true)
private var canKickResult = Result.success(false)
private var canBanResult = Result.success(false)
private var canRedactOwnResult = Result.success(canRedactOwn)
private var canRedactOtherResult = Result.success(canRedactOther)
private val canSendStateResults = mutableMapOf<StateEventType, Result<Boolean>>()
private val canSendEventResults = mutableMapOf<MessageEventType, Result<Boolean>>()
private var sendMediaResult = Result.success(FakeMediaUploadHandler())
private var setNameResult = Result.success(Unit)
private var setTopicResult = Result.success(Unit)
private var updateAvatarResult = Result.success(Unit)
private var removeAvatarResult = Result.success(Unit)
private var updateUserRoleResult = Result.success(Unit)
private var toggleReactionResult = Result.success(Unit)
private var retrySendMessageResult = Result.success(Unit)
private var cancelSendResult = Result.success(true)
private var forwardEventResult = Result.success(Unit)
private var reportContentResult = Result.success(Unit)
private var kickUserResult = Result.success(Unit)
private var banUserResult = Result.success(Unit)
private var unBanUserResult = Result.success(Unit)
private var sendLocationResult = Result.success(Unit)
private var createPollResult = Result.success(Unit)
private var editPollResult = Result.success(Unit)
private var sendPollResponseResult = Result.success(Unit)
private var endPollResult = Result.success(Unit)
private var progressCallbackValues = emptyList<Pair<Long, Long>>()
private var generateWidgetWebViewUrlResult = Result.success("https://call.element.io")
private var getWidgetDriverResult: Result<MatrixWidgetDriver> = Result.success(FakeMatrixWidgetDriver())
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>()
private val _typingRecord = mutableListOf<Boolean>()
val typingRecord: List<Boolean>
get() = _typingRecord
var sendMediaCount = 0
private set
private val _myReactions = mutableSetOf<String>()
val myReactions: Set<String> = _myReactions
var retrySendMessageCount: Int = 0
private set
var cancelSendCount: Int = 0
private set
var reportedContentCount: Int = 0
private set
private val _sentLocations = mutableListOf<SendLocationInvocation>()
val sentLocations: List<SendLocationInvocation> = _sentLocations
private val _createPollInvocations = mutableListOf<SavePollInvocation>()
val createPollInvocations: List<SavePollInvocation> = _createPollInvocations
private val _editPollInvocations = mutableListOf<SavePollInvocation>()
val editPollInvocations: List<SavePollInvocation> = _editPollInvocations
private val _sendPollResponseInvocations = mutableListOf<SendPollResponseInvocation>()
val sendPollResponseInvocations: List<SendPollResponseInvocation> = _sendPollResponseInvocations
private val _endPollInvocations = mutableListOf<EndPollInvocation>()
val endPollInvocations: List<EndPollInvocation> = _endPollInvocations
var invitedUserId: UserId? = null
private set
var newTopic: String? = null
private set
var newName: String? = null
private set
var newAvatarData: ByteArray? = null
private set
var removedAvatar: Boolean = false
private set
var leaveRoomLambda: (() -> Result<Unit>) = { Result.success(Unit) }
private val _roomInfoFlow: MutableSharedFlow<MatrixRoomInfo> = MutableSharedFlow(replay = 1)
override val roomInfoFlow: Flow<MatrixRoomInfo> = _roomInfoFlow
fun givenRoomInfo(roomInfo: MatrixRoomInfo) {
_roomInfoFlow.tryEmit(roomInfo)
}
private val _roomTypingMembersFlow: MutableSharedFlow<List<UserId>> = MutableSharedFlow(replay = 1)
override val roomTypingMembersFlow: Flow<List<UserId>> = _roomTypingMembersFlow
fun givenRoomTypingMembers(typingMembers: List<UserId>) {
_roomTypingMembersFlow.tryEmit(typingMembers)
}
override val membersStateFlow: MutableStateFlow<MatrixRoomMembersState> = MutableStateFlow(MatrixRoomMembersState.Unknown)
override val roomNotificationSettingsStateFlow: MutableStateFlow<MatrixRoomNotificationSettingsState> =
MutableStateFlow(MatrixRoomNotificationSettingsState.Unknown)
override suspend fun updateMembers() = Unit
override suspend fun updateMembers() = updateMembersResult()
override suspend fun getUpdatedMember(userId: UserId): Result<RoomMember> {
return getRoomMemberResult
return getUpdatedMemberResult(userId)
}
override suspend fun getMembers(limit: Int): Result<List<RoomMember>> {
return Result.success(emptyList())
return getMembersResult(limit)
}
override suspend fun updateRoomNotificationSettings(): Result<Unit> = simulateLongTask {
@ -214,76 +176,61 @@ class FakeMatrixRoom(
override val syncUpdateFlow: StateFlow<Long> = MutableStateFlow(0L)
private var timelineFocusedOnEventResult: Result<Timeline> = Result.success(FakeTimeline())
fun givenTimelineFocusedOnEventResult(result: Result<Timeline>) {
timelineFocusedOnEventResult = result
}
override suspend fun timelineFocusedOnEvent(eventId: EventId): Result<Timeline> = simulateLongTask {
timelineFocusedOnEventResult
timelineFocusedOnEventResult(eventId)
}
override suspend fun subscribeToSync() = Unit
override suspend fun powerLevels(): Result<MatrixRoomPowerLevels> {
return powerLevelsResult
return powerLevelsResult()
}
override suspend fun updatePowerLevels(matrixRoomPowerLevels: MatrixRoomPowerLevels): Result<Unit> = simulateLongTask {
updatePowerLevelsResult
updatePowerLevelsResult()
}
override suspend fun resetPowerLevels(): Result<MatrixRoomPowerLevels> = simulateLongTask {
resetPowerLevelsResult
resetPowerLevelsResult()
}
override fun destroy() = Unit
override suspend fun userDisplayName(userId: UserId): Result<String?> = simulateLongTask {
userDisplayNameResult
userDisplayNameResult()
}
override suspend fun userAvatarUrl(userId: UserId): Result<String?> = simulateLongTask {
userAvatarUrlResult
userAvatarUrlResult()
}
override suspend fun userRole(userId: UserId): Result<RoomMember.Role> {
return userRoleResult
return userRoleResult()
}
override suspend fun updateUsersRoles(changes: List<UserRoleChange>): Result<Unit> {
return updateUserRoleResult
return updateUserRoleResult()
}
var editMessageLambda: (EventId, String, String?, List<Mention>) -> Result<Unit> = { _, _, _, _ -> lambdaError() }
override suspend fun editMessage(eventId: EventId, body: String, htmlBody: String?, mentions: List<Mention>): Result<Unit> {
return editMessageLambda(eventId, body, htmlBody, mentions)
}
override suspend fun sendMessage(body: String, htmlBody: String?, mentions: List<Mention>) = simulateLongTask {
sendMessageMentions = mentions
Result.success(Unit)
sendMessageResult(body, htmlBody, mentions)
}
override suspend fun toggleReaction(emoji: String, eventId: EventId): Result<Unit> {
if (toggleReactionResult.isFailure) {
// Don't do the toggle if we failed
return toggleReactionResult
}
if (_myReactions.contains(emoji)) {
_myReactions.remove(emoji)
} else {
_myReactions.add(emoji)
}
return toggleReactionResult
return toggleReactionResult(emoji, eventId)
}
override suspend fun retrySendMessage(transactionId: TransactionId): Result<Unit> {
retrySendMessageCount++
return retrySendMessageResult
return retrySendMessageResult(transactionId)
}
override suspend fun cancelSend(transactionId: TransactionId): Result<Boolean> {
cancelSendCount++
return cancelSendResult
return cancelSendResult(transactionId)
}
override suspend fun getPermalink(): Result<String> {
@ -299,48 +246,47 @@ class FakeMatrixRoom(
}
override suspend fun join(): Result<Unit> {
return joinRoomResult
return joinRoomResult()
}
override suspend fun inviteUserById(id: UserId): Result<Unit> = simulateLongTask {
invitedUserId = id
inviteUserResult
inviteUserResult(id)
}
override suspend fun canUserBan(userId: UserId): Result<Boolean> {
return canBanResult
return canBanResult(userId)
}
override suspend fun canUserKick(userId: UserId): Result<Boolean> {
return canKickResult
return canKickResult(userId)
}
override suspend fun canUserInvite(userId: UserId): Result<Boolean> {
return canInviteResult
return canInviteResult(userId)
}
override suspend fun canUserRedactOwn(userId: UserId): Result<Boolean> {
return canRedactOwnResult
return canRedactOwnResult(userId)
}
override suspend fun canUserRedactOther(userId: UserId): Result<Boolean> {
return canRedactOtherResult
return canRedactOtherResult(userId)
}
override suspend fun canUserSendState(userId: UserId, type: StateEventType): Result<Boolean> {
return canSendStateResults[type] ?: Result.failure(IllegalStateException("No fake answer"))
return canSendStateResult(userId, type)
}
override suspend fun canUserSendMessage(userId: UserId, type: MessageEventType): Result<Boolean> {
return canSendEventResults[type] ?: Result.failure(IllegalStateException("No fake answer"))
return canUserSendMessageResult(userId, type)
}
override suspend fun canUserTriggerRoomNotification(userId: UserId): Result<Boolean> {
return canUserTriggerRoomNotificationResult
return canUserTriggerRoomNotificationResult(userId)
}
override suspend fun canUserJoinCall(userId: UserId): Result<Boolean> {
return canUserJoinCallResult
return canUserJoinCallResult(userId)
}
override suspend fun sendImage(
@ -376,37 +322,31 @@ class FakeMatrixRoom(
): Result<MediaUploadHandler> = fakeSendMedia(progressCallback)
override suspend fun forwardEvent(eventId: EventId, roomIds: List<RoomId>): Result<Unit> = simulateLongTask {
forwardEventResult
forwardEventResult(eventId, roomIds)
}
private suspend fun fakeSendMedia(progressCallback: ProgressCallback?): Result<MediaUploadHandler> = simulateLongTask {
sendMediaResult.onSuccess {
progressCallbackValues.forEach { (current, total) ->
progressCallback?.onProgress(current, total)
delay(1)
}
sendMediaCount++
progressCallbackValues.forEach { (current, total) ->
progressCallback?.onProgress(current, total)
delay(1)
}
sendMediaResult(progressCallback)
}
override suspend fun updateAvatar(mimeType: String, data: ByteArray): Result<Unit> = simulateLongTask {
newAvatarData = data
updateAvatarResult
updateAvatarResult(mimeType, data)
}
override suspend fun removeAvatar(): Result<Unit> = simulateLongTask {
removedAvatar = true
removeAvatarResult
removeAvatarResult()
}
override suspend fun setName(name: String): Result<Unit> = simulateLongTask {
newName = name
setNameResult
setNameResult(name)
}
override suspend fun setTopic(topic: String): Result<Unit> = simulateLongTask {
newTopic = topic
setTopicResult
setTopicResult(topic)
}
override suspend fun reportContent(
@ -414,28 +354,23 @@ class FakeMatrixRoom(
reason: String,
blockUserId: UserId?
): Result<Unit> = simulateLongTask {
reportedContentCount++
return reportContentResult
return reportContentResult(eventId, reason, blockUserId)
}
override suspend fun kickUser(userId: UserId, reason: String?): Result<Unit> {
return kickUserResult
return kickUserResult(userId, reason)
}
override suspend fun banUser(userId: UserId, reason: String?): Result<Unit> {
return banUserResult
return banUserResult(userId, reason)
}
override suspend fun unbanUser(userId: UserId, reason: String?): Result<Unit> {
return unBanUserResult
return unBanUserResult(userId, reason)
}
val setIsFavoriteCalls = mutableListOf<Boolean>()
override suspend fun setIsFavorite(isFavorite: Boolean): Result<Unit> {
return setIsFavoriteResult.also {
setIsFavoriteCalls.add(isFavorite)
}
return setIsFavoriteResult(isFavorite)
}
val markAsReadCalls = mutableListOf<ReceiptType>()
@ -460,8 +395,13 @@ class FakeMatrixRoom(
zoomLevel: Int?,
assetType: AssetType?,
): Result<Unit> = simulateLongTask {
_sentLocations.add(SendLocationInvocation(body, geoUri, description, zoomLevel, assetType))
return sendLocationResult
return sendLocationResult(
body,
geoUri,
description,
zoomLevel,
assetType,
)
}
override suspend fun createPoll(
@ -470,8 +410,12 @@ class FakeMatrixRoom(
maxSelections: Int,
pollKind: PollKind
): Result<Unit> = simulateLongTask {
_createPollInvocations.add(SavePollInvocation(question, answers, maxSelections, pollKind))
return createPollResult
return createPollResult(
question,
answers,
maxSelections,
pollKind,
)
}
override suspend fun editPoll(
@ -481,24 +425,27 @@ class FakeMatrixRoom(
maxSelections: Int,
pollKind: PollKind
): Result<Unit> = simulateLongTask {
_editPollInvocations.add(SavePollInvocation(question, answers, maxSelections, pollKind))
return editPollResult
return editPollResult(
pollStartId,
question,
answers,
maxSelections,
pollKind,
)
}
override suspend fun sendPollResponse(
pollStartId: EventId,
answers: List<String>
): Result<Unit> = simulateLongTask {
_sendPollResponseInvocations.add(SendPollResponseInvocation(pollStartId, answers))
return sendPollResponseResult
return sendPollResponseResult(pollStartId, answers)
}
override suspend fun endPoll(
pollStartId: EventId,
text: String
): Result<Unit> = simulateLongTask {
_endPollInvocations.add(EndPollInvocation(pollStartId, text))
return endPollResult
return endPollResult(pollStartId, text)
}
override suspend fun sendVoiceMessage(
@ -509,8 +456,7 @@ class FakeMatrixRoom(
): Result<MediaUploadHandler> = fakeSendMedia(progressCallback)
override suspend fun typingNotice(isTyping: Boolean): Result<Unit> {
_typingRecord += isTyping
return Result.success(Unit)
return typingNoticeResult(isTyping)
}
override suspend fun generateWidgetWebViewUrl(
@ -518,228 +464,34 @@ class FakeMatrixRoom(
clientId: String,
languageTag: String?,
theme: String?,
): Result<String> = generateWidgetWebViewUrlResult
): Result<String> = generateWidgetWebViewUrlResult(
widgetSettings,
clientId,
languageTag,
theme,
)
override suspend fun sendCallNotificationIfNeeded(): Result<Unit> {
return sendCallNotificationIfNeededResult()
}
var setSendQueueEnabledLambda = { _: Boolean -> }
override suspend fun setSendQueueEnabled(enabled: Boolean) = setSendQueueEnabledLambda(enabled)
var saveComposerDraftLambda = { _: ComposerDraft -> Result.success(Unit) }
override suspend fun saveComposerDraft(composerDraft: ComposerDraft) = saveComposerDraftLambda(composerDraft)
var loadComposerDraftLambda = { Result.success<ComposerDraft?>(null) }
override suspend fun loadComposerDraft() = loadComposerDraftLambda()
var clearComposerDraftLambda = { Result.success(Unit) }
override suspend fun clearComposerDraft() = clearComposerDraftLambda()
override fun getWidgetDriver(widgetSettings: MatrixWidgetSettings): Result<MatrixWidgetDriver> = getWidgetDriverResult
override fun getWidgetDriver(widgetSettings: MatrixWidgetSettings): Result<MatrixWidgetDriver> {
return getWidgetDriverResult(widgetSettings)
}
fun givenRoomMembersState(state: MatrixRoomMembersState) {
membersStateFlow.value = state
}
fun givenGetRoomMemberResult(result: Result<RoomMember>) {
getRoomMemberResult = result
}
fun givenUserDisplayNameResult(displayName: Result<String?>) {
userDisplayNameResult = displayName
}
fun givenUserAvatarUrlResult(avatarUrl: Result<String?>) {
userAvatarUrlResult = avatarUrl
}
fun givenUserRoleResult(role: Result<RoomMember.Role>) {
userRoleResult = role
}
fun givenUpdateUserRoleResult(result: Result<Unit>) {
updateUserRoleResult = result
}
fun givenJoinRoomResult(result: Result<Unit>) {
joinRoomResult = result
}
fun givenCanKickResult(result: Result<Boolean>) {
canKickResult = result
}
fun givenCanBanResult(result: Result<Boolean>) {
canBanResult = result
}
fun givenInviteUserResult(result: Result<Unit>) {
inviteUserResult = result
}
fun givenCanInviteResult(result: Result<Boolean>) {
canInviteResult = result
}
fun givenCanSendStateResult(type: StateEventType, result: Result<Boolean>) {
canSendStateResults[type] = result
}
fun givenCanSendEventResult(type: MessageEventType, result: Result<Boolean>) {
canSendEventResults[type] = result
}
fun givenCanTriggerRoomNotification(result: Result<Boolean>) {
canUserTriggerRoomNotificationResult = result
}
fun givenCanUserJoinCall(result: Result<Boolean>) {
canUserJoinCallResult = result
}
fun givenIgnoreResult(result: Result<Unit>) {
ignoreResult = result
}
fun givenUnIgnoreResult(result: Result<Unit>) {
unignoreResult = result
}
fun givenSendMediaResult(result: Result<FakeMediaUploadHandler>) {
sendMediaResult = result
}
fun givenUpdateAvatarResult(result: Result<Unit>) {
updateAvatarResult = result
}
fun givenRemoveAvatarResult(result: Result<Unit>) {
removeAvatarResult = result
}
fun givenSetNameResult(result: Result<Unit>) {
setNameResult = result
}
fun givenSetTopicResult(result: Result<Unit>) {
setTopicResult = result
}
fun givenToggleReactionResult(result: Result<Unit>) {
toggleReactionResult = result
}
fun givenRetrySendMessageResult(result: Result<Unit>) {
retrySendMessageResult = result
}
fun givenCancelSendResult(result: Result<Boolean>) {
cancelSendResult = result
}
fun givenForwardEventResult(result: Result<Unit>) {
forwardEventResult = result
}
fun givenReportContentResult(result: Result<Unit>) {
reportContentResult = result
}
fun givenKickUserResult(result: Result<Unit>) {
kickUserResult = result
}
fun givenBanUserResult(result: Result<Unit>) {
banUserResult = result
}
fun givenUnbanUserResult(result: Result<Unit>) {
unBanUserResult = result
}
fun givenSendLocationResult(result: Result<Unit>) {
sendLocationResult = result
}
fun givenCreatePollResult(result: Result<Unit>) {
createPollResult = result
}
fun givenEditPollResult(result: Result<Unit>) {
editPollResult = result
}
fun givenSendPollResponseResult(result: Result<Unit>) {
sendPollResponseResult = result
}
fun givenEndPollResult(result: Result<Unit>) {
endPollResult = result
}
fun givenProgressCallbackValues(values: List<Pair<Long, Long>>) {
progressCallbackValues = values
}
fun givenGenerateWidgetWebViewUrlResult(result: Result<String>) {
generateWidgetWebViewUrlResult = result
}
fun givenGetWidgetDriverResult(result: Result<MatrixWidgetDriver>) {
getWidgetDriverResult = result
}
fun givenSetIsFavoriteResult(result: Result<Unit>) {
setIsFavoriteResult = result
}
fun givenRoomInfo(roomInfo: MatrixRoomInfo) {
_roomInfoFlow.tryEmit(roomInfo)
}
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(
val body: String,
val geoUri: String,
val description: String?,
val zoomLevel: Int?,
val assetType: AssetType?,
)
data class SavePollInvocation(
val question: String,
val answers: List<String>,
val maxSelections: Int,
val pollKind: PollKind,
)
data class SendPollResponseInvocation(
val pollStartId: EventId,
val answers: List<String>,
)
data class EndPollInvocation(
val pollStartId: EventId,
val text: String,
)
fun aRoomInfo(
id: RoomId = A_ROOM_ID,
name: String? = A_ROOM_NAME,

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_invites_invited_you">"%1$s (%2$s) zaprosił Cię"</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_invites_invited_you">"%1$s(%2$s) convidou você"</string>
</resources>

View file

@ -40,6 +40,7 @@ android {
testImplementation(projects.libraries.matrix.test)
testImplementation(projects.libraries.mediaupload.test)
testImplementation(projects.tests.testutils)
testImplementation(libs.test.junit)
testImplementation(libs.test.truth)
testImplementation(libs.coroutines.test)

View file

@ -19,9 +19,12 @@ package io.element.android.libraries.mediaupload.api
import android.net.Uri
import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.core.mimetype.MimeTypes
import io.element.android.libraries.matrix.api.core.ProgressCallback
import io.element.android.libraries.matrix.api.room.MatrixRoom
import io.element.android.libraries.matrix.test.media.FakeMediaUploadHandler
import io.element.android.libraries.matrix.test.room.FakeMatrixRoom
import io.element.android.libraries.mediaupload.test.FakeMediaPreProcessor
import io.element.android.tests.testutils.lambda.lambdaRecorder
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.launch
import kotlinx.coroutines.test.StandardTestDispatcher
@ -46,13 +49,17 @@ class MediaSenderTest {
@Test
fun `given an attachment when sending it the MatrixRoom will call sendMedia`() = runTest {
val room = FakeMatrixRoom()
val sendMediaResult = lambdaRecorder<ProgressCallback?, Result<FakeMediaUploadHandler>> {
Result.success(FakeMediaUploadHandler())
}
val room = FakeMatrixRoom(
sendMediaResult = sendMediaResult
)
val sender = aMediaSender(room = room)
val uri = Uri.parse("content://image.jpg")
sender.sendMedia(uri = uri, mimeType = MimeTypes.Jpeg, compressIfPossible = true)
assertThat(room.sendMediaCount).isEqualTo(1)
sendMediaResult.assertions().isCalledOnce()
}
@Test
@ -70,9 +77,9 @@ class MediaSenderTest {
@Test
fun `given a failure in the media upload when sending the whole process fails`() = runTest {
val room = FakeMatrixRoom().apply {
givenSendMediaResult(Result.failure(Exception()))
}
val room = FakeMatrixRoom(
sendMediaResult = { Result.failure(Exception()) }
)
val sender = aMediaSender(room = room)
val uri = Uri.parse("content://image.jpg")
@ -84,7 +91,9 @@ class MediaSenderTest {
@OptIn(ExperimentalCoroutinesApi::class)
@Test
fun `given a cancellation in the media upload when sending the job is cancelled`() = runTest(StandardTestDispatcher()) {
val room = FakeMatrixRoom()
val room = FakeMatrixRoom(
sendMediaResult = { Result.success(FakeMediaUploadHandler()) }
)
val sender = aMediaSender(room = room)
val sendJob = launch {
val uri = Uri.parse("content://image.jpg")

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="dialog_permission_camera">"Aby umożliwić aplikacji korzystanie z aparatu, prosimy o udzielenie zezwolenia w ustawieniach systemowych."</string>
<string name="dialog_permission_generic">"Proszę nadać uprawnienia w ustawieniach systemowych."</string>
<string name="dialog_permission_microphone">"Aby umożliwić aplikacji korzystanie z mikrofonu, prosimy o udzielenie zezwolenia w ustawieniach systemowych."</string>
<string name="dialog_permission_notification">"Aby aplikacja mogła wyświetlać powiadomienia, udziel uprawnienia w ustawieniach systemowych."</string>
</resources>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="dialog_permission_camera">"Para permitir que o aplicativo use a câmera, conceda a permissão nas configurações do sistema."</string>
<string name="dialog_permission_generic">"Por favor, conceda a permissão nas configurações do sistema."</string>
<string name="dialog_permission_microphone">"Para permitir que o aplicativo use o microfone, conceda a permissão nas configurações do sistema."</string>
<string name="dialog_permission_notification">"Para permitir que o aplicativo exiba notificações, conceda a permissão nas configurações do sistema."</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="troubleshoot_notifications_test_check_permission_title">"Verifique as permissões"</string>
</resources>

View file

@ -21,6 +21,7 @@
<item quantity="other">"%d მოწვევები"</item>
</plurals>
<string name="notification_invite_body">"მოგიწვიათ ჩატში"</string>
<string name="notification_mentioned_you_body">"მოგახსენათ: %1$s"</string>
<string name="notification_new_messages">"ახალი შეტყობინებები"</string>
<plurals name="notification_new_messages_for_room">
<item quantity="one">"%d ახალი მესიჯი"</item>

View file

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="notification_channel_call">"Zadzwoń"</string>
<string name="notification_channel_listening_for_events">"Nasłuchiwanie wydarzeń"</string>
<string name="notification_channel_noisy">"Głośne powiadomienia"</string>
<string name="notification_channel_ringing_calls">"Dzwoniące połączenia"</string>
<string name="notification_channel_silent">"Ciche powiadomienia"</string>
<plurals name="notification_compat_summary_line_for_room">
<item quantity="one">"%1$s: %2$d wiadomość"</item>
<item quantity="few">"%1$s: %2$d wiadomości"</item>
<item quantity="many">"%1$s: %2$d wiadomości"</item>
</plurals>
<plurals name="notification_compat_summary_title">
<item quantity="one">"%d powiadomienie"</item>
<item quantity="few">"%d powiadomienia"</item>
<item quantity="many">"%d powiadomień"</item>
</plurals>
<string name="notification_fallback_content">"Powiadomienie"</string>
<string name="notification_incoming_call">"Przychodzące połączenie"</string>
<string name="notification_inline_reply_failed">"** Nie udało się wysłać - proszę otworzyć pokój"</string>
<string name="notification_invitation_action_join">"Dołącz"</string>
<string name="notification_invitation_action_reject">"Odrzuć"</string>
<plurals name="notification_invitations">
<item quantity="one">"%d zaproszenie"</item>
<item quantity="few">"%d zaproszenia"</item>
<item quantity="many">"%d zaproszeń"</item>
</plurals>
<string name="notification_invite_body">"Zaprosił(a) cię do czatu"</string>
<string name="notification_mentioned_you_body">"Wspomniano o Tobie: %1$s"</string>
<string name="notification_new_messages">"Nowe wiadomości"</string>
<plurals name="notification_new_messages_for_room">
<item quantity="one">"%d nowa wiadomość"</item>
<item quantity="few">"%d nowe wiadomości"</item>
<item quantity="many">"%d nowych wiadomości"</item>
</plurals>
<string name="notification_reaction_body">"Zareagował z %1$s"</string>
<string name="notification_room_action_quick_reply">"Szybka odpowiedź"</string>
<string name="notification_room_invite_body">"Zaprosił Cię do dołączenia do pokoju"</string>
<string name="notification_sender_me">"Ja"</string>
<string name="notification_test_push_notification_content">"Wyświetlasz powiadomienie! Kliknij mnie!"</string>
<string name="notification_ticker_text_dm">"%1$s: %2$s"</string>
<string name="notification_ticker_text_group">"%1$s: %2$s %3$s"</string>
<plurals name="notification_unread_notified_messages">
<item quantity="one">"%d nieprzeczytana wiadomość"</item>
<item quantity="few">"%d nieprzeczytane wiadomość"</item>
<item quantity="many">"%d nieprzeczytanych wiadomości"</item>
</plurals>
<string name="notification_unread_notified_messages_and_invitation">"%1$s i %2$s"</string>
<string name="notification_unread_notified_messages_in_room">"%1$s w %2$s"</string>
<string name="notification_unread_notified_messages_in_room_and_invitation">"%1$s w %2$s i %3$s"</string>
<plurals name="notification_unread_notified_messages_in_room_rooms">
<item quantity="one">"%d pokój"</item>
<item quantity="few">"%d pokoje"</item>
<item quantity="many">"%d pokoi"</item>
</plurals>
<string name="push_distributor_background_sync_android">"Synchronizacja w tle"</string>
<string name="push_distributor_firebase_android">"Usługi Google"</string>
<string name="push_no_valid_google_play_services_apk_android">"Nie znaleziono usług Google Play. Powiadomienia mogą nie działać prawidłowo."</string>
</resources>

View file

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="notification_channel_call">"Chamada"</string>
<string name="notification_channel_listening_for_events">"Ouvindo eventos"</string>
<string name="notification_channel_noisy">"Notificações barulhentas"</string>
<string name="notification_channel_silent">"Notificações silenciosas"</string>
<plurals name="notification_compat_summary_line_for_room">
<item quantity="one">"%1$s: %2$d mensagem"</item>
<item quantity="other">"%1$s: %2$d mensagens"</item>
</plurals>
<plurals name="notification_compat_summary_title">
<item quantity="one">"%d notificação"</item>
<item quantity="other">"%d notificações"</item>
</plurals>
<string name="notification_fallback_content">"Notificação"</string>
<string name="notification_inline_reply_failed">"** Falha ao enviar - por favor, abra a sala"</string>
<string name="notification_invitation_action_join">"Entrar"</string>
<string name="notification_invitation_action_reject">"Rejeitar"</string>
<plurals name="notification_invitations">
<item quantity="one">"%d convite"</item>
<item quantity="other">"%d convites"</item>
</plurals>
<string name="notification_invite_body">"Convidou você para conversar"</string>
<string name="notification_new_messages">"Novas mensagens"</string>
<plurals name="notification_new_messages_for_room">
<item quantity="one">"%d nova mensagem"</item>
<item quantity="other">"%d novas mensagens"</item>
</plurals>
<string name="notification_reaction_body">"Reagiu com %1$s"</string>
<string name="notification_room_action_quick_reply">"Resposta rápida"</string>
<string name="notification_room_invite_body">"Convidou você para entrar na sala"</string>
<string name="notification_sender_me">"Eu"</string>
<string name="notification_test_push_notification_content">"Você está visualizando a notificação! Clique em mim!"</string>
<string name="notification_ticker_text_dm">"%1$s: %2$s"</string>
<string name="notification_ticker_text_group">"%1$s: %2$s %3$s"</string>
<plurals name="notification_unread_notified_messages">
<item quantity="one">"%d mensagem notificada não lida"</item>
<item quantity="other">"%d mensagens notificadas não lidas"</item>
</plurals>
<string name="notification_unread_notified_messages_and_invitation">"%1$s e %2$s"</string>
<string name="notification_unread_notified_messages_in_room">"%1$s em %2$s"</string>
<string name="notification_unread_notified_messages_in_room_and_invitation">"%1$s em %2$s e %3$s"</string>
<plurals name="notification_unread_notified_messages_in_room_rooms">
<item quantity="one">"%d sala"</item>
<item quantity="other">"%d salas"</item>
</plurals>
<string name="push_distributor_background_sync_android">"Sincronização em segundo plano"</string>
<string name="push_distributor_firebase_android">"Serviços do Google"</string>
<string name="push_no_valid_google_play_services_apk_android">"O Google Play Services não foi encontrado. As notificações podem não funcionar corretamente."</string>
<string name="troubleshoot_notifications_test_push_loop_back_failure_2">"Erro: %1$s."</string>
</resources>

View file

@ -35,6 +35,7 @@ import io.element.android.libraries.matrix.test.FakeMatrixClient
import io.element.android.libraries.matrix.test.FakeMatrixClientProvider
import io.element.android.libraries.matrix.test.core.aBuildMeta
import io.element.android.libraries.matrix.test.room.FakeMatrixRoom
import io.element.android.libraries.matrix.test.room.aRoomMember
import io.element.android.libraries.matrix.test.timeline.FakeTimeline
import io.element.android.libraries.preferences.api.store.SessionPreferencesStore
import io.element.android.libraries.preferences.api.store.SessionPreferencesStoreFactory
@ -297,9 +298,9 @@ class NotificationBroadcastReceiverHandlerTest {
@Test
fun `Test reject room`() = runTest {
val leaveRoom = lambdaRecorder<Result<Unit>> { Result.success(Unit) }
val matrixRoom = FakeMatrixRoom().apply {
val matrixRoom = FakeMatrixRoom(
leaveRoomLambda = leaveRoom
}
)
val clearMembershipNotificationForRoomLambda = lambdaRecorder<SessionId, RoomId, Unit> { _, _ -> }
val fakeNotificationCleaner = FakeNotificationCleaner(
clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda,
@ -342,7 +343,8 @@ class NotificationBroadcastReceiverHandlerTest {
replyMessageLambda = replyMessage
}
val matrixRoom = FakeMatrixRoom(
liveTimeline = liveTimeline
liveTimeline = liveTimeline,
getUpdatedMemberResult = { Result.success(aRoomMember()) },
)
val onNotifiableEventReceivedResult = lambdaRecorder<NotifiableEvent, Unit> { _ -> }
val onNotifiableEventReceived = FakeOnNotifiableEventReceived(onNotifiableEventReceivedResult = onNotifiableEventReceivedResult)
@ -400,7 +402,8 @@ class NotificationBroadcastReceiverHandlerTest {
replyMessageLambda = replyMessage
}
val matrixRoom = FakeMatrixRoom(
liveTimeline = liveTimeline
liveTimeline = liveTimeline,
getUpdatedMemberResult = { Result.success(aRoomMember()) },
)
val onNotifiableEventReceivedResult = lambdaRecorder<NotifiableEvent, Unit> { _ -> }
val onNotifiableEventReceived = FakeOnNotifiableEventReceived(onNotifiableEventReceivedResult = onNotifiableEventReceivedResult)

View file

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="rich_text_editor_a11y_add_attachment">"Dodaj załącznik"</string>
<string name="rich_text_editor_bullet_list">"Przełącz listę punktową"</string>
<string name="rich_text_editor_close_formatting_options">"Zamknij opcje formatowania"</string>
<string name="rich_text_editor_code_block">"Przełącz blok kodu"</string>
<string name="rich_text_editor_composer_placeholder">"Wiadomość…"</string>
<string name="rich_text_editor_create_link">"Utwórz link"</string>
<string name="rich_text_editor_edit_link">"Edytuj link"</string>
<string name="rich_text_editor_format_bold">"Zastosuj pogrubiony format"</string>
<string name="rich_text_editor_format_italic">"Zastosuj format kursywy"</string>
<string name="rich_text_editor_format_strikethrough">"Zastosuj format przekreślenia"</string>
<string name="rich_text_editor_format_underline">"Zastosuj format podkreślenia"</string>
<string name="rich_text_editor_full_screen_toggle">"Przełącz tryb pełnoekranowy"</string>
<string name="rich_text_editor_indent">"Wcięcie"</string>
<string name="rich_text_editor_inline_code">"Zastosuj format kodu wbudowanego"</string>
<string name="rich_text_editor_link">"Wstaw łącze"</string>
<string name="rich_text_editor_numbered_list">"Przełącz listę numerowaną"</string>
<string name="rich_text_editor_open_compose_options">"Otwórz opcje tworzenia"</string>
<string name="rich_text_editor_quote">"Przełącz cytat"</string>
<string name="rich_text_editor_remove_link">"Usuń link"</string>
<string name="rich_text_editor_unindent">"Bez wcięcia"</string>
<string name="rich_text_editor_url_placeholder">"Link"</string>
<string name="screen_room_voice_message_tooltip">"Przytrzymaj, aby nagrywać"</string>
</resources>

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="rich_text_editor_a11y_add_attachment">"Adicionar anexo"</string>
<string name="rich_text_editor_bullet_list">"Alternar lista de marcadores"</string>
<string name="rich_text_editor_close_formatting_options">"Fechar opções de formatação"</string>
<string name="rich_text_editor_code_block">"Alternar bloco de código"</string>
<string name="rich_text_editor_composer_placeholder">"Mensagem…"</string>
<string name="rich_text_editor_create_link">"Criar um link"</string>
<string name="rich_text_editor_edit_link">"Editar link"</string>
<string name="rich_text_editor_format_bold">"Aplicar negrito"</string>
<string name="rich_text_editor_format_italic">"Aplicar formato itálico"</string>
<string name="rich_text_editor_format_strikethrough">"Aplicar formato tachado"</string>
<string name="rich_text_editor_format_underline">"Aplicar sublinhado"</string>
<string name="rich_text_editor_full_screen_toggle">"Alternar o modo de tela cheia"</string>
<string name="rich_text_editor_inline_code">"Aplicar formato de código embutido"</string>
<string name="rich_text_editor_link">"Definir link"</string>
<string name="rich_text_editor_numbered_list">"Alternar lista numerada"</string>
<string name="rich_text_editor_open_compose_options">"Abrir opções de composição"</string>
<string name="rich_text_editor_quote">"Alternar citação"</string>
<string name="rich_text_editor_remove_link">"Remover link"</string>
<string name="rich_text_editor_url_placeholder">"Link"</string>
<string name="screen_room_voice_message_tooltip">"Segure para gravar"</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="troubleshoot_notifications_screen_action">"Execute testes"</string>
</resources>

View file

@ -82,6 +82,7 @@
<string name="action_ok">"Добра"</string>
<string name="action_open_settings">"Налады"</string>
<string name="action_open_with">"Адкрыць з дапамогай"</string>
<string name="action_pin">"Замацаваць"</string>
<string name="action_quick_reply">"Хуткі адказ"</string>
<string name="action_quote">"Цытата"</string>
<string name="action_react">"Рэакцыя"</string>
@ -222,7 +223,7 @@
<string name="common_success">"Поспех"</string>
<string name="common_suggestions">"Прапановы"</string>
<string name="common_syncing">"Сінхранізацыя"</string>
<string name="common_system">"Сістэма"</string>
<string name="common_system">"Сістэмная"</string>
<string name="common_text">"Тэкст"</string>
<string name="common_third_party_notices">"Паведамленні трэціх асоб"</string>
<string name="common_thread">"Гутарка"</string>
@ -260,6 +261,10 @@
<string name="error_missing_microphone_voice_rationale_android">"%1$s не мае дазволу на доступ да вашага мікрафона. Дазвольце доступ да запісу галасавога паведамлення."</string>
<string name="error_some_messages_have_not_been_sent">"Некаторыя паведамленні не былі адпраўлены"</string>
<string name="error_unknown">"Выбачце, адбылася памылка"</string>
<string name="event_shield_reason_authenticity_not_guaranteed">"Сапраўднасць гэтага зашыфраванага паведамлення не можа быць гарантаваная на гэтай прыладзе."</string>
<string name="event_shield_reason_unknown_device">"Зашыфравана невядомай ці выдаленай прыладай."</string>
<string name="event_shield_reason_unsigned_device">"Зашыфравана прыладай, не пацверджанай яе ўладальнікам."</string>
<string name="event_shield_reason_unverified_identity">"Зашыфравана неправераным карыстальнікам."</string>
<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>

View file

@ -83,6 +83,7 @@
<string name="action_quick_reply">"Schnelle Antwort"</string>
<string name="action_quote">"Zitat"</string>
<string name="action_react">"Reagieren"</string>
<string name="action_reject">"Ablehnen"</string>
<string name="action_remove">"Entfernen"</string>
<string name="action_reply">"Antworten"</string>
<string name="action_reply_in_thread">"Im Thread antworten"</string>

View file

@ -80,6 +80,7 @@
<string name="action_ok">"OK"</string>
<string name="action_open_settings">"Ρυθμίσεις"</string>
<string name="action_open_with">"Άνοιγμα με"</string>
<string name="action_pin">"Καρφίτσωμα"</string>
<string name="action_quick_reply">"Γρήγορη απάντηση"</string>
<string name="action_quote">"Παράθεση"</string>
<string name="action_react">"Αντέδρασε"</string>
@ -117,6 +118,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_call_invite">"Κλήση σε εξέλιξη (δεν υποστηρίζεται)"</string>
<string name="common_call_started">"Η κλήση ξεκίνησε"</string>
@ -255,6 +257,10 @@
<string name="error_missing_microphone_voice_rationale_android">"Το %1$s δεν έχει άδεια πρόσβασης στο μικρόφωνό σου. Ενεργοποίησε την πρόσβαση για εγγραφή φωνητικού μηνύματος."</string>
<string name="error_some_messages_have_not_been_sent">"Ορισμένα μηνύματα δεν έχουν σταλεί"</string>
<string name="error_unknown">"Λυπούμαστε, παρουσιάστηκε σφάλμα"</string>
<string name="event_shield_reason_authenticity_not_guaranteed">"Η αυθεντικότητα αυτού του κρυπτογραφημένου μηνύματος δεν είναι εγγυημένη σε αυτήν τη συσκευή."</string>
<string name="event_shield_reason_unknown_device">"Κρυπτογραφημένο από άγνωστη ή διαγεγραμμένη συσκευή."</string>
<string name="event_shield_reason_unsigned_device">"Κρυπτογραφημένο από μια συσκευή που δεν έχει επαληθευτεί από τον ιδιοκτήτη της."</string>
<string name="event_shield_reason_unverified_identity">"Κρυπτογραφημένο από μη επαληθευμένο χρήστη."</string>
<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>
@ -271,6 +277,9 @@
<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_room_pinned_banner_indicator">"%1$s από %2$s"</string>
<string name="screen_room_pinned_banner_indicator_description">"%1$s Καρφιτσωμένα μηνύματα"</string>
<string name="screen_room_pinned_banner_view_all_button_title">"Προβολή Όλων"</string>
<string name="screen_room_title">"Συνομιλία"</string>
<string name="screen_share_location_title">"Κοινή χρήση τοποθεσίας"</string>
<string name="screen_share_my_location_action">"Κοινή χρήση της τοποθεσίας μου"</string>

View file

@ -80,6 +80,7 @@
<string name="action_ok">"OK"</string>
<string name="action_open_settings">"Seadistused"</string>
<string name="action_open_with">"Ava rakendusega"</string>
<string name="action_pin">"Kinnita"</string>
<string name="action_quick_reply">"Kiirvastus"</string>
<string name="action_quote">"Tsiteeri"</string>
<string name="action_react">"Reageeri"</string>
@ -256,6 +257,10 @@ Põhjus: %1$s."</string>
<string name="error_missing_microphone_voice_rationale_android">"Rakendusel %1$s puudub õigus sinu nutiseadme mikrofoni kasutada. Järgnevalt anna õigused heli salvestamiseks."</string>
<string name="error_some_messages_have_not_been_sent">"Mõned sõnumid on saatmata"</string>
<string name="error_unknown">"Vabandust, ilmnes viga"</string>
<string name="event_shield_reason_authenticity_not_guaranteed">"Selle krüptitud sõnumi tõepärasus pole selles seadmes tagatud."</string>
<string name="event_shield_reason_unknown_device">"Krüptitud tundmatu või kustutatud seadme poolt."</string>
<string name="event_shield_reason_unsigned_device">"Krüptitud seadme poolt, mida tema omanik pole verifitseerinud."</string>
<string name="event_shield_reason_unverified_identity">"Krüptitud verifitseerimata kasutaja poolt."</string>
<string name="invite_friends_rich_title">"🔐️ Liitu minuga rakenduses %1$s"</string>
<string name="invite_friends_text">"Hei, suhtle minuga %1$s võrgus: %2$s"</string>
<string name="login_initial_device_name_android">"%1$s Android"</string>
@ -272,6 +277,9 @@ Põhjus: %1$s."</string>
<string name="screen_room_member_details_unblock_alert_action">"Eemalda blokeering"</string>
<string name="screen_room_member_details_unblock_alert_description">"Nüüd näed sa jälle kõiki tema sõnumeid"</string>
<string name="screen_room_member_details_unblock_user">"Eemalda kasutajalt blokeering"</string>
<string name="screen_room_pinned_banner_indicator">"%1$s / %2$s"</string>
<string name="screen_room_pinned_banner_indicator_description">"%1$s kinnitatud sõnumit"</string>
<string name="screen_room_pinned_banner_view_all_button_title">"Näita kõiki"</string>
<string name="screen_room_title">"Vestlus"</string>
<string name="screen_share_location_title">"Jaga asukohta"</string>
<string name="screen_share_my_location_action">"Jaga minu asukohta"</string>

View file

@ -80,6 +80,7 @@
<string name="action_ok">"Rendben"</string>
<string name="action_open_settings">"Beállítások megnyitása"</string>
<string name="action_open_with">"Megnyitás a következővel"</string>
<string name="action_pin">"Kitűzés"</string>
<string name="action_quick_reply">"Gyors válasz"</string>
<string name="action_quote">"Idézet"</string>
<string name="action_react">"Reakció"</string>
@ -168,6 +169,7 @@ Ok: %1$s."</string>
<string name="common_no_results">"Nincs találat"</string>
<string name="common_no_room_name">"Nincs szobanév"</string>
<string name="common_offline">"Kapcsolat nélkül"</string>
<string name="common_open_source_licenses">"Nyílt forráskódú licencek"</string>
<string name="common_or">"vagy"</string>
<string name="common_password">"Jelszó"</string>
<string name="common_people">"Emberek"</string>
@ -255,6 +257,10 @@ Ok: %1$s."</string>
<string name="error_missing_microphone_voice_rationale_android">"Az %1$snek nincs engedélye, hogy hozzáférjen a mikrofonhoz. Engedélyezze, hogy tudjon hangüzenetet felvenni."</string>
<string name="error_some_messages_have_not_been_sent">"Néhány üzenet nem került elküldésre"</string>
<string name="error_unknown">"Elnézést, hiba történt"</string>
<string name="event_shield_reason_authenticity_not_guaranteed">"A titkosított üzenetek valódiságát ezen az eszközön nem lehet garantálni."</string>
<string name="event_shield_reason_unknown_device">"Ismeretlen vagy törölt eszköz által titkosítva."</string>
<string name="event_shield_reason_unsigned_device">"A tulajdonos által nem ellenőrzött eszköz által titkosítva."</string>
<string name="event_shield_reason_unverified_identity">"Nem ellenőrzött felhasználó által titkosítva."</string>
<string name="invite_friends_rich_title">"🔐️ Csatlakozz hozzám itt: %1$s"</string>
<string name="invite_friends_text">"Beszélgessünk itt: %1$s, %2$s"</string>
<string name="login_initial_device_name_android">"%1$s Android"</string>

View file

@ -6,17 +6,31 @@
<item quantity="other">"%1$d ციფრი ჩაიწერა"</item>
</plurals>
<string name="a11y_hide_password">"პაროლის დამალვა"</string>
<string name="a11y_jump_to_bottom">"ბოლოში გადასვლა"</string>
<string name="a11y_notifications_mentions_only">"მხოლოდ მოხსენიებები"</string>
<string name="a11y_notifications_muted">"დადუმებულია"</string>
<string name="a11y_page_n">"გვერდი %1$d"</string>
<string name="a11y_pause">"პაუზა"</string>
<string name="a11y_pin_field">"PIN ველი"</string>
<string name="a11y_play">"დაკვრა"</string>
<string name="a11y_poll">"გამოკითხვა"</string>
<string name="a11y_poll_end">"დასრულდა გამოკითხვა"</string>
<string name="a11y_react_with">"რეაგირება %1$s-ით"</string>
<string name="a11y_react_with_other_emojis">"რეაგირება სხვა ემოჯით"</string>
<string name="a11y_read_receipts_multiple">"ნანახია %1$s-სა და %2$s-ს მიერ"</string>
<plurals name="a11y_read_receipts_multiple_with_others">
<item quantity="one">"წაკითხულია %1$s და %2$d-ს ადამიანის მიერ"</item>
<item quantity="other">"წაკითხულია %1$s და %2$d-ს ადამიანის მიერ"</item>
</plurals>
<string name="a11y_read_receipts_single">"წაიკითხეს: %s"</string>
<string name="a11y_read_receipts_tap_to_show_all">"შეეხეთ ყველაფრის საჩვენებლად"</string>
<string name="a11y_remove_reaction_with">"%1$s რეაქციის წაშლა"</string>
<string name="a11y_send_files">"ფაილების გაგზავნა"</string>
<string name="a11y_show_password">"პაროლის ჩვენება"</string>
<string name="a11y_start_call">"დარეკვა"</string>
<string name="a11y_user_menu">"მომხმარებლის მენიუ"</string>
<string name="a11y_voice_message_record">"ხმოვანი შეტყობინების ჩაწერა."</string>
<string name="a11y_voice_message_stop_recording">"ჩაწერის შეწყვეტა"</string>
<string name="action_accept">"მიღება"</string>
<string name="action_add_to_timeline">"დამატება ქრონოლოგიაში"</string>
<string name="action_back">"უკან"</string>
@ -33,11 +47,14 @@
<string name="action_create">"შექმნა"</string>
<string name="action_create_a_room">"ოთახის შექმნა"</string>
<string name="action_decline">"უარყოფა"</string>
<string name="action_delete_poll">"გამოკითხვის წაშლა"</string>
<string name="action_disable">"გამორთვა"</string>
<string name="action_done">"მზადაა"</string>
<string name="action_edit">"რედაქტირება"</string>
<string name="action_edit_poll">"გამოკითხვის რედაქტირება"</string>
<string name="action_enable">"ჩართვა"</string>
<string name="action_end_poll">"გამოკითხვის დასრულება"</string>
<string name="action_enter_pin">"შეიყვანეთ PIN"</string>
<string name="action_forgot_password">"დაგავიწყდათ პაროლი?"</string>
<string name="action_forward">"გადაგზავნა"</string>
<string name="action_invite">"მოწვევა"</string>
@ -49,6 +66,7 @@
<string name="action_learn_more">"შეიტყვეთ მეტი"</string>
<string name="action_leave">"დატოვება"</string>
<string name="action_leave_room">"ოთახის დატოვება"</string>
<string name="action_load_more">"მეტის ჩატვირთვა"</string>
<string name="action_manage_account">"ანგარიშის მართვა"</string>
<string name="action_manage_devices">"მოწყობილობების მართვა"</string>
<string name="action_next">"შემდეგი"</string>
@ -82,20 +100,25 @@
<string name="action_start_verification">"დადასტურების დაწყება"</string>
<string name="action_static_map_load">"დააწკაპუნეთ რუკის ჩასატვირთად"</string>
<string name="action_take_photo">"ფოტოს გადაღება"</string>
<string name="action_tap_for_options">"შეეხეთ ვარიანტების სანახავად"</string>
<string name="action_try_again">"ხელახლა ცდა"</string>
<string name="action_view_source">"წყაროს ნახვა"</string>
<string name="action_yes">"დიახ"</string>
<string name="common_about">"შესახებ"</string>
<string name="common_acceptable_use_policy">"მისაღები გამოყენების პოლიტიკა"</string>
<string name="common_advanced_settings">"გაფართოებული პარამეტრები"</string>
<string name="common_analytics">"ანალიტიკა"</string>
<string name="common_appearance">"გარეგნობა"</string>
<string name="common_audio">"აუდიო"</string>
<string name="common_bubbles">"ბუშტები"</string>
<string name="common_chat_backup">"ჩატის სარეზერვო ასლი"</string>
<string name="common_copyright">"საავტორო უფლება"</string>
<string name="common_creating_room">"ოთახის შექმნა…"</string>
<string name="common_current_user_left_room">"დატოვა ოთახი"</string>
<string name="common_dark">"მუქი"</string>
<string name="common_decryption_error">"გაშიფვრის შეცდომა"</string>
<string name="common_developer_options">"დეველოპერის პარამეტრები"</string>
<string name="common_direct_chat">"პირდაპირი ჩატი"</string>
<string name="common_edited_suffix">"(რედაქტირებულია)"</string>
<string name="common_editing">"რედაქტირება"</string>
<string name="common_emote">"* %1$s %2$s"</string>
@ -112,6 +135,7 @@
<string name="common_install_apk_android">"დააინსტალირეთ APK"</string>
<string name="common_invite_unknown_profile">"ეს Matrix ID ვერ მოიძებნა, ამიტომ მოწვევა შეიძლება არ იყოს მიღებული."</string>
<string name="common_leaving_room">"ოთახის დატოვება"</string>
<string name="common_light">"ღია"</string>
<string name="common_link_copied_to_clipboard">"ბმული კოპირებულია გაცვლის ბუფერში"</string>
<string name="common_loading">"იტვირთება…"</string>
<plurals name="common_member_count">
@ -119,6 +143,7 @@
<item quantity="other">"%1$d წევრები"</item>
</plurals>
<string name="common_message">"შეტყობინება"</string>
<string name="common_message_actions">"შეტყობინებაზე მოქმედებები"</string>
<string name="common_message_layout">"შეტყობინებების ფორმა"</string>
<string name="common_message_removed">"მესიჯი წაშლილია"</string>
<string name="common_modern">"თანამედროვე"</string>
@ -146,24 +171,31 @@
<string name="common_refreshing">"განახლება…"</string>
<string name="common_replying_to">"პასუხი %1$s-ს"</string>
<string name="common_report_a_bug">"ხარვეზის შეტყობინება"</string>
<string name="common_report_a_problem">"შეტყობინება პრობლემაზე"</string>
<string name="common_report_submitted">"რეპორტი გაგზავნილია"</string>
<string name="common_rich_text_editor">"მდიდარი ტექსტის რედაქტორი"</string>
<string name="common_room">"ოთახი"</string>
<string name="common_room_name">"ოთახის სახელი"</string>
<string name="common_room_name_placeholder">"მაგ. თქვენი პროექტის სახელი"</string>
<string name="common_screen_lock">"ეკრანის დაბლოკვა"</string>
<string name="common_search_for_someone">"ვიღაცის ძებნა"</string>
<string name="common_search_results">"ძიების შედეგები"</string>
<string name="common_security">"უსაფრთხოება"</string>
<string name="common_seen_by">"Ნანახი"</string>
<string name="common_sending">"იგზავნება…"</string>
<string name="common_sending_failed">"გაგზავნა ვერ მოხერხდა"</string>
<string name="common_sent">"გაგზავნილი"</string>
<string name="common_server_not_supported">"სერვერი არ არის მხარდაჭერილი"</string>
<string name="common_server_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>
<string name="common_success">"წარმატება"</string>
<string name="common_suggestions">"შეთავაზებები"</string>
<string name="common_syncing">"სინქრონიზაცია"</string>
<string name="common_system">"სისტემა"</string>
<string name="common_text">"ტექსტი"</string>
<string name="common_third_party_notices">"მესამე პირის შენიშვნები"</string>
<string name="common_thread">"თემა"</string>
@ -178,9 +210,11 @@
<string name="common_username">"მომხმარებლის სახელი"</string>
<string name="common_verification_cancelled">"დადასტურება გაუქმდა"</string>
<string name="common_verification_complete">"დადასტურება დასრულებულია"</string>
<string name="common_verify_device">"დაადასტურეთ მოწყობილობა"</string>
<string name="common_video">"ვიდეო"</string>
<string name="common_voice_message">"ხმოვანი შეტყობინება"</string>
<string name="common_waiting">"მოცდა…"</string>
<string name="common_waiting_for_decryption_key">"ლოდინი ამ შეტყობინებისათვის"</string>
<string name="dialog_title_confirmation">"დადასტურება"</string>
<string name="dialog_title_error">"შეცდომა"</string>
<string name="dialog_title_success">"წარმატება"</string>
@ -189,6 +223,7 @@
<string name="error_failed_loading_map">"ვერ გამოვიდა რუკის %1$s ჩატვირთვა. გთხოვთ, მოგვიანებით სცადოთ."</string>
<string name="error_failed_loading_messages">"შეტყობინებების ჩატვირთვა ვერ მოხერხდა"</string>
<string name="error_failed_locating_user">"%1$s ვერ მოახერხა თქვენი ადგილმდებარეობაზე წვდომა. გთხოვთ, მოგვიანებით სცადოთ."</string>
<string name="error_failed_uploading_voice_message">"თქვენი ხმოვანი შეტყობინების ატვირთვა ვერ მოხერხდა."</string>
<string name="error_missing_location_auth_android">"%1$s არ აქვს თქვენს ადგილმდებარეობაზე წვდომის ნებართვა. შეგიძლიათ ჩართოთ წვდომა პარამეტრებში."</string>
<string name="error_missing_location_rationale_android">"%1$s არ აქვს თქვენს ადგილმდებარეობაზე წვდომის ნებართვა. ჩართეთ წვდომა ქვემოთ"</string>
<string name="error_missing_microphone_voice_rationale_android">"%1$s არ აქვს თქვენს მიკროფონზე წვდომის ნებართვა. ჩართეთ წვდომა ხმოვანი შეტყობინების ჩასაწერად."</string>

View file

@ -0,0 +1,287 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="a11y_delete">"Usuń"</string>
<plurals name="a11y_digits_entered">
<item quantity="one">"Wprowadzono %1$d cyfrę"</item>
<item quantity="few">"Wprowadzono %1$d cyfry"</item>
<item quantity="many">"Wprowadzono %1$d cyfr"</item>
</plurals>
<string name="a11y_hide_password">"Ukryj hasło"</string>
<string name="a11y_jump_to_bottom">"Przejdź na dół"</string>
<string name="a11y_notifications_mentions_only">"Tylko wzmianki"</string>
<string name="a11y_notifications_muted">"Wyciszone"</string>
<string name="a11y_page_n">"Strona %1$d"</string>
<string name="a11y_pause">"Wstrzymaj"</string>
<string name="a11y_pin_field">"Pole PIN"</string>
<string name="a11y_play">"Odtwórz"</string>
<string name="a11y_poll">"Ankieta"</string>
<string name="a11y_poll_end">"Zakończona ankieta"</string>
<string name="a11y_react_with">"Zareaguj z %1$s"</string>
<string name="a11y_react_with_other_emojis">"Zareaguj innym emoji"</string>
<string name="a11y_read_receipts_multiple">"Odczytane przez %1$s i %2$s"</string>
<plurals name="a11y_read_receipts_multiple_with_others">
<item quantity="one">"Odczytano przez %1$s i %2$d inną"</item>
<item quantity="few">"Odczytano przez %1$s i %2$d innych"</item>
<item quantity="many">"Odczytano przez %1$s i %2$d innych"</item>
</plurals>
<string name="a11y_read_receipts_single">"Odczytane przez %1$s"</string>
<string name="a11y_read_receipts_tap_to_show_all">"Stuknij, aby pokazać wszystkich"</string>
<string name="a11y_remove_reaction_with">"Usuń reakcję %1$s"</string>
<string name="a11y_send_files">"Wyślij pliki"</string>
<string name="a11y_show_password">"Pokaż hasło"</string>
<string name="a11y_start_call">"Rozpocznij rozmowę"</string>
<string name="a11y_user_menu">"Menu użytkownika"</string>
<string name="a11y_voice_message_record">"Nagraj wiadomość głosową."</string>
<string name="a11y_voice_message_stop_recording">"Zatrzymaj nagrywanie"</string>
<string name="action_accept">"Akceptuj"</string>
<string name="action_add_to_timeline">"Dodaj do osi czasu"</string>
<string name="action_back">"Wróć"</string>
<string name="action_call">"Zadzwoń"</string>
<string name="action_cancel">"Anuluj"</string>
<string name="action_choose_photo">"Wybierz zdjęcie"</string>
<string name="action_clear">"Wyczyść"</string>
<string name="action_close">"Zamknij"</string>
<string name="action_complete_verification">"Dokończ weryfikację"</string>
<string name="action_confirm">"Potwierdź"</string>
<string name="action_continue">"Kontynuuj"</string>
<string name="action_copy">"Kopiuj"</string>
<string name="action_copy_link">"Kopiuj link"</string>
<string name="action_copy_link_to_message">"Kopiuj link do wiadomości"</string>
<string name="action_create">"Utwórz"</string>
<string name="action_create_a_room">"Utwórz pokój"</string>
<string name="action_decline">"Odrzuć"</string>
<string name="action_delete_poll">"Usuń ankietę"</string>
<string name="action_disable">"Wyłącz"</string>
<string name="action_discard">"Odrzuć"</string>
<string name="action_done">"Gotowe"</string>
<string name="action_edit">"Edytuj"</string>
<string name="action_edit_poll">"Edytuj ankietę"</string>
<string name="action_enable">"Włącz"</string>
<string name="action_end_poll">"Zakończ ankietę"</string>
<string name="action_enter_pin">"Wprowadź PIN"</string>
<string name="action_forgot_password">"Nie pamiętasz hasła?"</string>
<string name="action_forward">"Dalej"</string>
<string name="action_go_back">"Wróć"</string>
<string name="action_invite">"Zaproś"</string>
<string name="action_invite_friends">"Zaproś znajomych"</string>
<string name="action_invite_friends_to_app">"Zaproś znajomych do %1$s"</string>
<string name="action_invite_people_to_app">"Zaproś ludzi do %1$s"</string>
<string name="action_invites_list">"Zaproszenia"</string>
<string name="action_join">"Dołącz"</string>
<string name="action_learn_more">"Dowiedz się więcej"</string>
<string name="action_leave">"Opuść"</string>
<string name="action_leave_conversation">"Opuść rozmowę"</string>
<string name="action_leave_room">"Opuść pokój"</string>
<string name="action_load_more">"Załaduj więcej"</string>
<string name="action_manage_account">"Zarządzaj kontem"</string>
<string name="action_manage_devices">"Zarządzaj urządzeniami"</string>
<string name="action_message">"Wiadomość"</string>
<string name="action_next">"Dalej"</string>
<string name="action_no">"Nie"</string>
<string name="action_not_now">"Nie teraz"</string>
<string name="action_ok">"Ok"</string>
<string name="action_open_settings">"Ustawienia"</string>
<string name="action_open_with">"Otwórz za pomocą"</string>
<string name="action_quick_reply">"Szybka odpowiedź"</string>
<string name="action_quote">"Cytuj"</string>
<string name="action_react">"Dodaj reakcję"</string>
<string name="action_reject">"Odrzuć"</string>
<string name="action_remove">"Usuń"</string>
<string name="action_reply">"Odpowiedz"</string>
<string name="action_reply_in_thread">"Odpowiedz w wątku"</string>
<string name="action_report_bug">"Zgłoś błąd"</string>
<string name="action_report_content">"Zgłoś treść"</string>
<string name="action_reset">"Resetuj"</string>
<string name="action_retry">"Spróbuj ponownie"</string>
<string name="action_retry_decryption">"Ponów próbę odszyfrowania"</string>
<string name="action_save">"Zapisz"</string>
<string name="action_search">"Szukaj"</string>
<string name="action_send">"Wyślij"</string>
<string name="action_send_message">"Wyślij wiadomość"</string>
<string name="action_share">"Udostępnij"</string>
<string name="action_share_link">"Udostępnij link"</string>
<string name="action_sign_in_again">"Zaloguj się ponownie"</string>
<string name="action_signout">"Wyloguj się"</string>
<string name="action_signout_anyway">"Wyloguj się mimo to"</string>
<string name="action_skip">"Pomiń"</string>
<string name="action_start">"Rozpocznij"</string>
<string name="action_start_chat">"Rozpocznij chat"</string>
<string name="action_start_verification">"Rozpocznij weryfikację"</string>
<string name="action_static_map_load">"Stuknij, aby załadować mapę"</string>
<string name="action_take_photo">"Zrób zdjęcie"</string>
<string name="action_tap_for_options">"Stuknij, by wyświetlić opcje"</string>
<string name="action_try_again">"Spróbuj ponownie"</string>
<string name="action_view_source">"Wyświetl źródło"</string>
<string name="action_yes">"Tak"</string>
<string name="common_about">"O programie"</string>
<string name="common_acceptable_use_policy">"Polityka użytkowania"</string>
<string name="common_advanced_settings">"Ustawienia zaawansowane"</string>
<string name="common_analytics">"Analityka"</string>
<string name="common_appearance">"Wygląd"</string>
<string name="common_audio">"Dźwięk"</string>
<string name="common_blocked_users">"Zablokowani użytkownicy"</string>
<string name="common_bubbles">"Bąbelki"</string>
<string name="common_call_invite">"Rozmowa w trakcie (niewspierane)"</string>
<string name="common_call_started">"Rozpoczęto rozmowę"</string>
<string name="common_chat_backup">"Backup czatu"</string>
<string name="common_copyright">"Copyright"</string>
<string name="common_creating_room">"Tworzenie pokoju…"</string>
<string name="common_current_user_left_room">"Opuścił pokój"</string>
<string name="common_dark">"Ciemny"</string>
<string name="common_decryption_error">"Błąd deszyfrowania"</string>
<string name="common_developer_options">"Opcje programisty"</string>
<string name="common_direct_chat">"Czat prywatny"</string>
<string name="common_do_not_show_this_again">"Nie pokazuj ponownie"</string>
<string name="common_edited_suffix">"(edytowane)"</string>
<string name="common_editing">"Edytowanie"</string>
<string name="common_emote">"* %1$s %2$s"</string>
<string name="common_encryption_enabled">"Szyfrowanie włączone"</string>
<string name="common_enter_your_pin">"Wprowadź kod PIN"</string>
<string name="common_error">"Błąd"</string>
<string name="common_error_registering_pusher_android">"Wystąpił błąd, możesz nie otrzymać powiadomień nowych wiadomości. Spróbuj naprawić powiadomienia w ustawieniach.
Powód: %1$s."</string>
<string name="common_everyone">"Wszyscy"</string>
<string name="common_failed">"Niepowodzenie"</string>
<string name="common_favourite">"Ulubione"</string>
<string name="common_favourited">"Ulubione"</string>
<string name="common_file">"Plik"</string>
<string name="common_file_saved_on_disk_android">"Plik zapisany do folderu Pobrane"</string>
<string name="common_forward_message">"Przekaż wiadomość"</string>
<string name="common_gif">"GIF"</string>
<string name="common_image">"Zdjęcie"</string>
<string name="common_in_reply_to">"W odpowiedzi do %1$s"</string>
<string name="common_install_apk_android">"Zainstaluj APK"</string>
<string name="common_invite_unknown_profile">"Nie można znaleźć identyfikatora Matrix ID, zaproszenie mogło nie dotrzeć."</string>
<string name="common_leaving_room">"Opuszczanie pokoju"</string>
<string name="common_light">"Jasny"</string>
<string name="common_link_copied_to_clipboard">"Link został skopiowany do schowka"</string>
<string name="common_loading">"Ładowanie…"</string>
<plurals name="common_member_count">
<item quantity="one">"%1$d członek"</item>
<item quantity="few">"%1$d członki"</item>
<item quantity="many">"%1$d członków"</item>
</plurals>
<string name="common_message">"Wiadomość"</string>
<string name="common_message_actions">"Akcje wiadomości"</string>
<string name="common_message_layout">"Układ wiadomości"</string>
<string name="common_message_removed">"Wiadomość usunięta"</string>
<string name="common_modern">"Nowoczesny"</string>
<string name="common_mute">"Wycisz"</string>
<string name="common_no_results">"Brak wyników"</string>
<string name="common_no_room_name">"Brak nazwy pokoju"</string>
<string name="common_offline">"Offline"</string>
<string name="common_open_source_licenses">"Licencje open-source"</string>
<string name="common_or">"lub"</string>
<string name="common_password">"Hasło"</string>
<string name="common_people">"Osoby"</string>
<string name="common_permalink">"Link bezpośredni"</string>
<string name="common_permission">"Uprawnienie"</string>
<string name="common_please_wait">"Proszę czekać…"</string>
<string name="common_poll_end_confirmation">"Jesteś pewien, że chcesz zakończyć tę ankietę?"</string>
<string name="common_poll_summary">"Ankieta: %1$s"</string>
<string name="common_poll_total_votes">"Łączna liczba głosów: %1$s"</string>
<string name="common_poll_undisclosed_text">"Wyniki zostaną wyświetlone po zakończeniu ankiety"</string>
<plurals name="common_poll_votes_count">
<item quantity="one">"%d głos"</item>
<item quantity="few">"%d głosy"</item>
<item quantity="many">"%d głosów"</item>
</plurals>
<string name="common_privacy_policy">"Polityka prywatności"</string>
<string name="common_reaction">"Reakcja"</string>
<string name="common_reactions">"Reakcje"</string>
<string name="common_recovery_key">"Klucz przywracania"</string>
<string name="common_refreshing">"Odświeżanie…"</string>
<string name="common_replying_to">"Odpowiadanie do %1$s"</string>
<string name="common_report_a_bug">"Zgłoś błąd"</string>
<string name="common_report_a_problem">"Zgłoś problem"</string>
<string name="common_report_submitted">"Zgłoszenie wysłane"</string>
<string name="common_rich_text_editor">"Bogaty edytor tekstu"</string>
<string name="common_room">"Pokój"</string>
<string name="common_room_name">"Nazwa pokoju"</string>
<string name="common_room_name_placeholder">"np. nazwa projektu"</string>
<string name="common_saved_changes">"Zapisano zmiany"</string>
<string name="common_saving">"Zapisywanie"</string>
<string name="common_screen_lock">"Blokada ekranu"</string>
<string name="common_search_for_someone">"Wyszukaj kogoś"</string>
<string name="common_search_results">"Wyniki wyszukiwania"</string>
<string name="common_security">"Bezpieczeństwo"</string>
<string name="common_seen_by">"Wyświetlone przez"</string>
<string name="common_send_to">"Wyślij do"</string>
<string name="common_sending">"Wysyłanie…"</string>
<string name="common_sending_failed">"Błąd wysyłania"</string>
<string name="common_sent">"Wysłano"</string>
<string name="common_server_not_supported">"Serwer nie jest obsługiwany"</string>
<string name="common_server_url">"Adres URL serwera"</string>
<string name="common_settings">"Ustawienia"</string>
<string name="common_shared_location">"Udostępniona lokalizacja"</string>
<string name="common_signing_out">"Wylogowywanie"</string>
<string name="common_something_went_wrong">"Coś poszło nie tak"</string>
<string name="common_starting_chat">"Rozpoczynanie czatu…"</string>
<string name="common_sticker">"Naklejka"</string>
<string name="common_success">"Sukces"</string>
<string name="common_suggestions">"Sugestie"</string>
<string name="common_syncing">"Synchronizuję"</string>
<string name="common_system">"System"</string>
<string name="common_text">"Tekst"</string>
<string name="common_third_party_notices">"Informacje stron trzecich"</string>
<string name="common_thread">"Wątek"</string>
<string name="common_topic">"Temat"</string>
<string name="common_topic_placeholder">"O czym jest ten pokój?"</string>
<string name="common_unable_to_decrypt">"Nie można odszyfrować"</string>
<string name="common_unable_to_decrypt_no_access">"Nie masz uprawnień do tej wiadomości"</string>
<string name="common_unable_to_invite_message">"Nie udało się wysłać zaproszenia do jednego lub więcej użytkowników."</string>
<string name="common_unable_to_invite_title">"Nie można wysłać zaproszeń"</string>
<string name="common_unlock">"Odblokuj"</string>
<string name="common_unmute">"Wyłącz wyciszenie"</string>
<string name="common_unsupported_event">"Nieobsługiwane zdarzenie"</string>
<string name="common_username">"Nazwa użytkownika"</string>
<string name="common_verification_cancelled">"Weryfikacja anulowana"</string>
<string name="common_verification_complete">"Weryfikacja zakończona"</string>
<string name="common_verify_device">"Weryfikuj urządzenie"</string>
<string name="common_video">"Film"</string>
<string name="common_voice_message">"Wiadomość głosowa"</string>
<string name="common_waiting">"Oczekiwanie…"</string>
<string name="common_waiting_for_decryption_key">"Oczekiwanie na tę wiadomość"</string>
<string name="dialog_title_confirmation">"Potwierdzenie"</string>
<string name="dialog_title_error">"Błąd"</string>
<string name="dialog_title_success">"Sukces"</string>
<string name="dialog_title_warning">"Ostrzeżenie"</string>
<string name="dialog_unsaved_changes_description_android">"Zmiany nie zostały zapisane. Czy na pewno chcesz wrócić?"</string>
<string name="dialog_unsaved_changes_title">"Zapisać zmiany?"</string>
<string name="error_failed_creating_the_permalink">"Nie udało się utworzyć linku bezpośredniego"</string>
<string name="error_failed_loading_map">"%1$s nie mogło wczytać mapy. Spróbuj ponownie później."</string>
<string name="error_failed_loading_messages">"Nie udało się załadować wiadomości"</string>
<string name="error_failed_locating_user">"%1$s nie mógł uzyskać dostępu do Twojej lokalizacji. Spróbuj ponownie później."</string>
<string name="error_failed_uploading_voice_message">"Nie udało się przesłać Twojej wiadomości głosowej."</string>
<string name="error_message_not_found">"Nie znaleziono wiadomości"</string>
<string name="error_missing_location_auth_android">"%1$s nie uzyskało uprawnienia do dostępu do twojej lokalizacji. Możesz włączyć dostęp w Ustawieniach."</string>
<string name="error_missing_location_rationale_android">"%1$s nie ma uprawnień dostępu do Twojej lokalizacji. Włącz dostęp poniżej."</string>
<string name="error_missing_microphone_voice_rationale_android">"%1$s nie ma uprawnień dostępu do Twojego mikrofonu. Włącz dostęp, aby nagrać wiadomość głosową."</string>
<string name="error_some_messages_have_not_been_sent">"Niektóre wiadomości nie zostały wysłane"</string>
<string name="error_unknown">"Przepraszamy, wystąpił błąd"</string>
<string name="invite_friends_rich_title">"🔐️ Dołącz do mnie na %1$s"</string>
<string name="invite_friends_text">"Hej, porozmawiajmy na %1$s: %2$s"</string>
<string name="login_initial_device_name_android">"%1$s Android"</string>
<string name="preference_rageshake">"Gniewne wstrząsanie, aby zgłosić błąd"</string>
<string name="screen_media_picker_error_failed_selection">"Nie udało się wybrać multimediów. Spróbuj ponownie."</string>
<string name="screen_media_upload_preview_error_failed_processing">"Przetwarzanie multimediów do przesłania nie powiodło się, spróbuj ponownie."</string>
<string name="screen_media_upload_preview_error_failed_sending">"Przesyłanie multimediów nie powiodło się, spróbuj ponownie."</string>
<string name="screen_room_error_failed_processing_media">"Przetwarzanie multimediów do przesłania nie powiodło się, spróbuj ponownie."</string>
<string name="screen_room_error_failed_retrieving_user_details">"Nie można pobrać danych użytkownika"</string>
<string name="screen_room_member_details_block_alert_action">"Zablokuj"</string>
<string name="screen_room_member_details_block_alert_description">"Zablokowani użytkownicy nie będą mogli wysyłać Ci wiadomości, a wszystkie ich wiadomości zostaną ukryte. Możesz odblokować ich w dowolnym momencie."</string>
<string name="screen_room_member_details_block_user">"Zablokuj użytkownika"</string>
<string name="screen_room_member_details_unblock_alert_action">"Odblokuj"</string>
<string name="screen_room_member_details_unblock_alert_description">"Będziesz mógł ponownie zobaczyć wszystkie wiadomości od tego użytkownika."</string>
<string name="screen_room_member_details_unblock_user">"Odblokuj użytkownika"</string>
<string name="screen_share_location_title">"Udostępnij lokalizację"</string>
<string name="screen_share_my_location_action">"Udostępnij moją lokalizację"</string>
<string name="screen_share_open_apple_maps">"Otwórz w Apple Maps"</string>
<string name="screen_share_open_google_maps">"Otwórz w Google Maps"</string>
<string name="screen_share_open_osm_maps">"Otwórz w OpenStreetMap"</string>
<string name="screen_share_this_location_action">"Udostępnij tę lokalizację"</string>
<string name="screen_view_location_title">"Lokalizacja"</string>
<string name="settings_version_number">"Wersja: %1$s (%2$s)"</string>
<string name="test_language_identifier">"pl"</string>
</resources>

View file

@ -0,0 +1,275 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="a11y_delete">"Excluir"</string>
<string name="a11y_hide_password">"Ocultar senha"</string>
<string name="a11y_jump_to_bottom">"Ir para o final"</string>
<string name="a11y_notifications_mentions_only">"Apenas menções"</string>
<string name="a11y_notifications_muted">"Silenciado"</string>
<string name="a11y_page_n">"Página %1$d"</string>
<string name="a11y_pause">"Pausar"</string>
<string name="a11y_pin_field">"Campo de PIN"</string>
<string name="a11y_play">"Reproduzir"</string>
<string name="a11y_poll">"Enquete"</string>
<string name="a11y_poll_end">"Enquete encerrada"</string>
<string name="a11y_react_with">"Reagir com %1$s"</string>
<string name="a11y_react_with_other_emojis">"Reaja com outros emojis"</string>
<string name="a11y_read_receipts_multiple">"Lido por %1$s e %2$s"</string>
<string name="a11y_read_receipts_single">"Lido por %1$s"</string>
<string name="a11y_read_receipts_tap_to_show_all">"Toque para mostrar tudo"</string>
<string name="a11y_remove_reaction_with">"Remova a reação com %1$s"</string>
<string name="a11y_send_files">"Enviar arquivos"</string>
<string name="a11y_show_password">"Mostrar senha"</string>
<string name="a11y_start_call">"Iniciar uma chamada"</string>
<string name="a11y_user_menu">"Menu do usuário"</string>
<string name="a11y_voice_message_record">"Gravar mensagem de voz."</string>
<string name="a11y_voice_message_stop_recording">"Parar gravação"</string>
<string name="action_accept">"Aceitar"</string>
<string name="action_add_to_timeline">"Adicionar à linha do tempo"</string>
<string name="action_back">"Voltar"</string>
<string name="action_call">"Chamar"</string>
<string name="action_cancel">"Cancelar"</string>
<string name="action_choose_photo">"Escolher foto"</string>
<string name="action_clear">"Limpar"</string>
<string name="action_close">"Fechar"</string>
<string name="action_complete_verification">"Verificação completa"</string>
<string name="action_confirm">"Confirmar"</string>
<string name="action_continue">"Continuar"</string>
<string name="action_copy">"Copiar"</string>
<string name="action_copy_link">"Copiar link"</string>
<string name="action_copy_link_to_message">"Copiar link para a mensagem"</string>
<string name="action_create">"Criar"</string>
<string name="action_create_a_room">"Criar uma sala"</string>
<string name="action_decline">"Recusar"</string>
<string name="action_delete_poll">"Excluir Enquete"</string>
<string name="action_disable">"Desabilitar"</string>
<string name="action_discard">"Descartar"</string>
<string name="action_done">"Concluído"</string>
<string name="action_edit">"Editar"</string>
<string name="action_edit_poll">"Editar enquete"</string>
<string name="action_enable">"Habilitar"</string>
<string name="action_end_poll">"Encerrar enquete"</string>
<string name="action_enter_pin">"Inserir PIN"</string>
<string name="action_forgot_password">"Esqueceu a senha?"</string>
<string name="action_forward">"Encaminhar"</string>
<string name="action_go_back">"Voltar"</string>
<string name="action_invite">"Convidar"</string>
<string name="action_invite_friends">"Convidar pessoas"</string>
<string name="action_invite_friends_to_app">"Convidar pessoas para %1$s"</string>
<string name="action_invite_people_to_app">"Convide pessoas para %1$s"</string>
<string name="action_invites_list">"Convites"</string>
<string name="action_join">"Entrar"</string>
<string name="action_learn_more">"Saber mais"</string>
<string name="action_leave">"Sair"</string>
<string name="action_leave_conversation">"Sair da conversa"</string>
<string name="action_leave_room">"Sair da sala"</string>
<string name="action_load_more">"Carregar mais"</string>
<string name="action_manage_account">"Gerenciar conta"</string>
<string name="action_manage_devices">"Gerenciar dispositivos"</string>
<string name="action_message">"Mensagem"</string>
<string name="action_next">"Próximo"</string>
<string name="action_no">"Não"</string>
<string name="action_not_now">"Agora não"</string>
<string name="action_ok">"OK"</string>
<string name="action_open_settings">"Configurações"</string>
<string name="action_open_with">"Abrir com"</string>
<string name="action_pin">"Fixar"</string>
<string name="action_quick_reply">"Resposta rápida"</string>
<string name="action_quote">"Citação"</string>
<string name="action_react">"Reagir"</string>
<string name="action_reject">"Recusar"</string>
<string name="action_remove">"Remover"</string>
<string name="action_reply">"Responder"</string>
<string name="action_reply_in_thread">"Responder no tópico"</string>
<string name="action_report_bug">"Reportar erro"</string>
<string name="action_report_content">"Denunciar conteúdo"</string>
<string name="action_reset">"Redefinir"</string>
<string name="action_retry">"Tentar novamente"</string>
<string name="action_retry_decryption">"Tente descriptografar novamente"</string>
<string name="action_save">"Salvar"</string>
<string name="action_search">"Pesquisar"</string>
<string name="action_send">"Enviar"</string>
<string name="action_send_message">"Enviar mensagem"</string>
<string name="action_share">"Compartilhar"</string>
<string name="action_share_link">"Compartilhar link"</string>
<string name="action_sign_in_again">"Iniciar sessão novamente"</string>
<string name="action_signout">"Sair"</string>
<string name="action_signout_anyway">"Sair mesmo assim"</string>
<string name="action_skip">"Pular"</string>
<string name="action_start">"Começar"</string>
<string name="action_start_chat">"Iniciar bate-papo"</string>
<string name="action_start_verification">"Iniciar verificação"</string>
<string name="action_static_map_load">"Toque para carregar o mapa"</string>
<string name="action_take_photo">"Tirar foto"</string>
<string name="action_tap_for_options">"Toque para opções"</string>
<string name="action_try_again">"Tente novamente"</string>
<string name="action_view_source">"Ver fonte"</string>
<string name="action_yes">"Sim"</string>
<string name="common_about">"Sobre"</string>
<string name="common_acceptable_use_policy">"Política de uso aceitável"</string>
<string name="common_advanced_settings">"Configurações avançadas"</string>
<string name="common_analytics">"Telemetria"</string>
<string name="common_appearance">"Aparência"</string>
<string name="common_audio">"Áudio"</string>
<string name="common_blocked_users">"Usuários bloqueados"</string>
<string name="common_bubbles">"Bolhas"</string>
<string name="common_call_invite">"Chamada em progresso (sem suporte)"</string>
<string name="common_call_started">"Chamada iniciada"</string>
<string name="common_chat_backup">"Backup de conversas"</string>
<string name="common_copyright">"Direitos autorais"</string>
<string name="common_creating_room">"Criando sala…"</string>
<string name="common_current_user_left_room">"Saiu da sala"</string>
<string name="common_dark">"Escuro"</string>
<string name="common_decryption_error">"Erro de descriptografia"</string>
<string name="common_developer_options">"Opções do desenvolvedor"</string>
<string name="common_direct_chat">"Conversa privada"</string>
<string name="common_do_not_show_this_again">"Não mostrar isto novamente"</string>
<string name="common_edited_suffix">"(editado)"</string>
<string name="common_editing">"Editando"</string>
<string name="common_emote">"* %1$s %2$s"</string>
<string name="common_encryption_enabled">"Criptografia ativada"</string>
<string name="common_enter_your_pin">"Insira seu PIN"</string>
<string name="common_error">"Erro"</string>
<string name="common_everyone">"Todos"</string>
<string name="common_failed">"Falhou"</string>
<string name="common_favourite">"Favorito"</string>
<string name="common_favourited">"Favoritado"</string>
<string name="common_file">"Arquivo"</string>
<string name="common_file_saved_on_disk_android">"Arquivo salvo em Downloads"</string>
<string name="common_forward_message">"Encaminhar mensagem"</string>
<string name="common_gif">"GIF"</string>
<string name="common_image">"Imagem"</string>
<string name="common_in_reply_to">"Em resposta a %1$s"</string>
<string name="common_install_apk_android">"Instalar APK"</string>
<string name="common_invite_unknown_profile">"Este ID Matrix não foi encontrado, então o convite pode não ser recebido"</string>
<string name="common_leaving_room">"Saindo da sala"</string>
<string name="common_light">"Claro"</string>
<string name="common_link_copied_to_clipboard">"Link copiado para área de transferência"</string>
<string name="common_loading">"Carregando…"</string>
<plurals name="common_member_count">
<item quantity="one">"%1$d membro"</item>
<item quantity="other">"%1$d membros"</item>
</plurals>
<string name="common_message">"Mensagem"</string>
<string name="common_message_actions">"Ações de mensagem"</string>
<string name="common_message_layout">"Layout da mensagem"</string>
<string name="common_message_removed">"Mensagem removida"</string>
<string name="common_modern">"Moderno"</string>
<string name="common_mute">"Silenciar"</string>
<string name="common_no_results">"Sem resultados"</string>
<string name="common_no_room_name">"Sem nome de sala"</string>
<string name="common_offline">"Offline"</string>
<string name="common_open_source_licenses">"Licenças de código aberto"</string>
<string name="common_or">"ou"</string>
<string name="common_password">"Senha"</string>
<string name="common_people">"Pessoas"</string>
<string name="common_permalink">"Link permanente"</string>
<string name="common_permission">"Permissão"</string>
<string name="common_please_wait">"Por favor, aguarde…"</string>
<string name="common_poll_end_confirmation">"Tem certeza de que deseja encerrar esta enquete?"</string>
<string name="common_poll_summary">"Enquete: %1$s"</string>
<string name="common_poll_total_votes">"Total de votos: %1$s"</string>
<string name="common_poll_undisclosed_text">"Os resultados serão exibidos após o término da enquete"</string>
<plurals name="common_poll_votes_count">
<item quantity="one">"%d voto"</item>
<item quantity="other">"%d votos"</item>
</plurals>
<string name="common_privacy_policy">"Política de Privacidade"</string>
<string name="common_reaction">"Reação"</string>
<string name="common_reactions">"Reações"</string>
<string name="common_recovery_key">"Chave de recuperação"</string>
<string name="common_refreshing">"Atualizando…"</string>
<string name="common_replying_to">"Respondendo a %1$s"</string>
<string name="common_report_a_bug">"Reportar um erro"</string>
<string name="common_report_a_problem">"Reportar um problema"</string>
<string name="common_report_submitted">"Relatório enviado"</string>
<string name="common_rich_text_editor">"Editor de rich text"</string>
<string name="common_room">"Sala"</string>
<string name="common_room_name">"Nome da sala"</string>
<string name="common_room_name_placeholder">"por exemplo, o nome do seu projeto"</string>
<string name="common_saved_changes">"Mudanças salvas"</string>
<string name="common_saving">"Salvando"</string>
<string name="common_screen_lock">"Bloqueio de tela"</string>
<string name="common_search_for_someone">"Procurar alguém"</string>
<string name="common_search_results">"Resultados da busca"</string>
<string name="common_security">"Segurança"</string>
<string name="common_seen_by">"Visto por"</string>
<string name="common_send_to">"Enviar para"</string>
<string name="common_sending">"Enviando…"</string>
<string name="common_sending_failed">"Envio falhou"</string>
<string name="common_sent">"Enviado"</string>
<string name="common_server_not_supported">"Servidor não suportado"</string>
<string name="common_server_url">"URL do Servidor"</string>
<string name="common_settings">"Configurações"</string>
<string name="common_shared_location">"Localização compartilhada"</string>
<string name="common_signing_out">"Saindo"</string>
<string name="common_something_went_wrong">"Algo deu errado"</string>
<string name="common_starting_chat">"Iniciando o chat…"</string>
<string name="common_sticker">"Adesivo"</string>
<string name="common_success">"Sucesso"</string>
<string name="common_suggestions">"Sugestões"</string>
<string name="common_syncing">"Sincronizando"</string>
<string name="common_system">"Sistema"</string>
<string name="common_text">"Texto"</string>
<string name="common_third_party_notices">"Avisos de terceiros"</string>
<string name="common_thread">"Tópico"</string>
<string name="common_topic">"Tópico"</string>
<string name="common_topic_placeholder">"Sobre o que é essa sala?"</string>
<string name="common_unable_to_decrypt">"Não é possível descriptografar"</string>
<string name="common_unable_to_decrypt_no_access">"Você não tem acesso a esta mensagem"</string>
<string name="common_unable_to_invite_message">"Não foi possível enviar convites para um ou mais usuários."</string>
<string name="common_unable_to_invite_title">"Não foi possível enviar o(s) convite(s)"</string>
<string name="common_unlock">"Desbloquear"</string>
<string name="common_unmute">"Desmutar"</string>
<string name="common_unsupported_event">"Evento não suportado"</string>
<string name="common_username">"Nome do usuário"</string>
<string name="common_verification_cancelled">"Verificação cancelada"</string>
<string name="common_verification_complete">"Verificação concluída"</string>
<string name="common_verify_device">"Verificar dispositivo"</string>
<string name="common_video">"Vídeo"</string>
<string name="common_voice_message">"Mensagem de voz"</string>
<string name="common_waiting">"Esperando…"</string>
<string name="common_waiting_for_decryption_key">"Aguardando esta mensagem"</string>
<string name="dialog_title_confirmation">"Confirmação"</string>
<string name="dialog_title_error">"Erro"</string>
<string name="dialog_title_success">"Sucesso"</string>
<string name="dialog_title_warning">"Aviso"</string>
<string name="dialog_unsaved_changes_description_android">"Suas mudanças não foram salvas. Tem certeza de que você quer voltar?"</string>
<string name="dialog_unsaved_changes_title">"Salvar mudanças?"</string>
<string name="error_failed_creating_the_permalink">"Falha ao criar o link permanente"</string>
<string name="error_failed_loading_map">"%1$s não conseguiu carregar o mapa. Por favor, tente novamente mais tarde."</string>
<string name="error_failed_loading_messages">"Falha ao carregar mensagens"</string>
<string name="error_failed_locating_user">"%1$s não conseguiu acessar sua localização. Por favor, tente novamente mais tarde."</string>
<string name="error_failed_uploading_voice_message">"Falha ao enviar sua mensagem de voz."</string>
<string name="error_message_not_found">"Mensagem não encontrada"</string>
<string name="error_missing_location_auth_android">"%1$s não tem permissão para acessar sua localização. Você pode ativar o acesso nas Configurações."</string>
<string name="error_missing_location_rationale_android">"%1$s não tem permissão para acessar sua localização. Habilite o acesso abaixo."</string>
<string name="error_some_messages_have_not_been_sent">"Algumas mensagens não foram enviadas"</string>
<string name="error_unknown">"Desculpe, ocorreu um erro"</string>
<string name="event_shield_reason_unknown_device">"Criptografada por um dispositivo desconhecido ou apagado."</string>
<string name="event_shield_reason_unsigned_device">"Criptografado por um dispositivo que não foi verificado pelo seu dono."</string>
<string name="event_shield_reason_unverified_identity">"Criptografado por um usuário não verificado."</string>
<string name="invite_friends_rich_title">"🔐️ Junte-se a mim no %1$s"</string>
<string name="invite_friends_text">"Ei, fale comigo em %1$s: %2$s"</string>
<string name="login_initial_device_name_android">"%1$s Android"</string>
<string name="preference_rageshake">"Rageshake para relatar um bug"</string>
<string name="screen_media_picker_error_failed_selection">"Falha ao selecionar a mídia, tente novamente."</string>
<string name="screen_media_upload_preview_error_failed_processing">"Falha ao processar mídia para upload. Tente novamente."</string>
<string name="screen_media_upload_preview_error_failed_sending">"Falha ao enviar mídia. Tente novamente."</string>
<string name="screen_room_error_failed_processing_media">"Falha ao processar mídia para upload. Tente novamente."</string>
<string name="screen_room_error_failed_retrieving_user_details">"Não foi possível recuperar os detalhes do usuário"</string>
<string name="screen_room_member_details_block_alert_action">"Bloquear"</string>
<string name="screen_room_member_details_block_alert_description">"Usuários bloqueados não poderão enviar mensagens para você e todas as mensagens deles serão ocultadas. Você pode desbloqueá-los a qualquer momento."</string>
<string name="screen_room_member_details_block_user">"Bloquear usuário"</string>
<string name="screen_room_member_details_unblock_alert_action">"Desbloquear"</string>
<string name="screen_room_member_details_unblock_alert_description">"Você poderá ver todas as mensagens deles novamente."</string>
<string name="screen_room_member_details_unblock_user">"Desbloquear usuário"</string>
<string name="screen_share_location_title">"Compartilhar localização"</string>
<string name="screen_share_my_location_action">"Compartilhar minha localização"</string>
<string name="screen_share_open_apple_maps">"Abrir no Apple Maps"</string>
<string name="screen_share_open_google_maps">"Abrir no Google Maps"</string>
<string name="screen_share_open_osm_maps">"Abrir no OpenStreetMap"</string>
<string name="screen_share_this_location_action">"Compartilhe esta localização"</string>
<string name="screen_view_location_title">"Localização"</string>
<string name="settings_version_number">"Versão: %1$s (%2$s)"</string>
<string name="test_language_identifier">"pt-br"</string>
</resources>

View file

@ -82,6 +82,7 @@
<string name="action_ok">"OK"</string>
<string name="action_open_settings">"Otvoriť nastavenia"</string>
<string name="action_open_with">"Otvoriť pomocou"</string>
<string name="action_pin">"Pripnúť"</string>
<string name="action_quick_reply">"Rýchla odpoveď"</string>
<string name="action_quote">"Citovať"</string>
<string name="action_react">"Reagovať"</string>
@ -260,6 +261,10 @@ Dôvod: %1$s."</string>
<string name="error_missing_microphone_voice_rationale_android">"%1$s nemá povolenie na prístup k vášmu mikrofónu. Povoľte prístup na nahrávanie hlasovej správy."</string>
<string name="error_some_messages_have_not_been_sent">"Niektoré správy neboli odoslané"</string>
<string name="error_unknown">"Prepáčte, vyskytla sa chyba"</string>
<string name="event_shield_reason_authenticity_not_guaranteed">"Pravosť tejto šifrovanej správy nie je možné zaručiť na tomto zariadení."</string>
<string name="event_shield_reason_unknown_device">"Zašifrované neznámym alebo odstráneným zariadením."</string>
<string name="event_shield_reason_unsigned_device">"Šifrované zariadením, ktoré nie je overené jeho majiteľom."</string>
<string name="event_shield_reason_unverified_identity">"Šifrované neovereným používateľom."</string>
<string name="invite_friends_rich_title">"🔐️ Pripojte sa ku mne na %1$s"</string>
<string name="invite_friends_text">"Ahoj, porozprávajte sa so mnou na %1$s: %2$s"</string>
<string name="login_initial_device_name_android">"%1$s Android"</string>
@ -276,6 +281,9 @@ Dôvod: %1$s."</string>
<string name="screen_room_member_details_unblock_alert_action">"Odblokovať"</string>
<string name="screen_room_member_details_unblock_alert_description">"Všetky správy od nich budete môcť opäť vidieť."</string>
<string name="screen_room_member_details_unblock_user">"Odblokovať používateľa"</string>
<string name="screen_room_pinned_banner_indicator">"%1$s z %2$s"</string>
<string name="screen_room_pinned_banner_indicator_description">"%1$s Pripnutých správ"</string>
<string name="screen_room_pinned_banner_view_all_button_title">"Zobraziť všetko"</string>
<string name="screen_room_title">"Konverzácia"</string>
<string name="screen_share_location_title">"Zdieľať polohu"</string>
<string name="screen_share_my_location_action">"Zdieľať moju polohu"</string>

View file

@ -80,6 +80,7 @@
<string name="action_ok">"OK"</string>
<string name="action_open_settings">"Settings"</string>
<string name="action_open_with">"Open with"</string>
<string name="action_pin">"Pin"</string>
<string name="action_quick_reply">"Quick reply"</string>
<string name="action_quote">"Quote"</string>
<string name="action_react">"React"</string>
@ -256,6 +257,10 @@ Reason: %1$s."</string>
<string name="error_missing_microphone_voice_rationale_android">"%1$s does not have permission to access your microphone. Enable access to record a voice message."</string>
<string name="error_some_messages_have_not_been_sent">"Some messages have not been sent"</string>
<string name="error_unknown">"Sorry, an error occurred"</string>
<string name="event_shield_reason_authenticity_not_guaranteed">"The authenticity of this encrypted message can\'t be guaranteed on this device."</string>
<string name="event_shield_reason_unknown_device">"Encrypted by an unknown or deleted device."</string>
<string name="event_shield_reason_unsigned_device">"Encrypted by a device not verified by its owner."</string>
<string name="event_shield_reason_unverified_identity">"Encrypted by an unverified user."</string>
<string name="invite_friends_rich_title">"🔐️ Join me on %1$s"</string>
<string name="invite_friends_text">"Hey, talk to me on %1$s: %2$s"</string>
<string name="login_initial_device_name_android">"%1$s Android"</string>
@ -272,6 +277,9 @@ Reason: %1$s."</string>
<string name="screen_room_member_details_unblock_alert_action">"Unblock"</string>
<string name="screen_room_member_details_unblock_alert_description">"You\'ll be able to see all messages from them again."</string>
<string name="screen_room_member_details_unblock_user">"Unblock user"</string>
<string name="screen_room_pinned_banner_indicator">"%1$s of %2$s"</string>
<string name="screen_room_pinned_banner_indicator_description">"%1$s Pinned messages"</string>
<string name="screen_room_pinned_banner_view_all_button_title">"View All"</string>
<string name="screen_room_title">"Chat"</string>
<string name="screen_share_location_title">"Share location"</string>
<string name="screen_share_my_location_action">"Share my location"</string>