Merge branch 'develop' into feature/bma/limitComposerHeight

This commit is contained in:
Benoit Marty
2025-12-03 17:44:05 +01:00
230 changed files with 2910 additions and 1855 deletions

View File

@@ -1,3 +1,58 @@
Changes in Element X v25.12.0
=============================
<!-- Release notes generated using configuration in .github/release.yml at v25.12.0 -->
## What's Changed
### ✨ Features
* Room list: enable latest event sorter. by @bmarty in https://github.com/element-hq/element-x-android/pull/5825
* Add room list indicators about last message by @bmarty in https://github.com/element-hq/element-x-android/pull/5824
### 🙌 Improvements
* Change : improve room and space member list by @ganfra in https://github.com/element-hq/element-x-android/pull/5806
* Change : security and privacy rework by @ganfra in https://github.com/element-hq/element-x-android/pull/5816
### 🐛 Bugfixes
* Ensure confirmation dialog is displayed when an admin add other admin to a room by @bmarty in https://github.com/element-hq/element-x-android/pull/5786
* Edit user profile cancel confirmation by @bmarty in https://github.com/element-hq/element-x-android/pull/5788
* Fix editing owner by @bmarty in https://github.com/element-hq/element-x-android/pull/5807
* Uris should take precedence in plain text intents by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5785
* Fix long voice recording by @bmarty in https://github.com/element-hq/element-x-android/pull/5821
### 🗣 Translations
* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5792
* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5830
### 🧱 Build
* Use regex to check forbidden terms by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5784
* Update Gradle Wrapper from 8.14.3 to 9.2.1 by @ElementBot in https://github.com/element-hq/element-x-android/pull/5751
### Dependency upgrades
* fix(deps): update dependency androidx.sqlite:sqlite-ktx to v2.6.2 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5769
* fix(deps): update datastore to v1.2.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5789
* chore(deps): update peter-evans/create-pull-request action to v7.0.9 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5793
* fix(deps): update dependency io.nlopez.compose.rules:detekt to v0.4.28 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5795
* fix(deps): update metro to v0.7.7 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5771
* chore(deps): update plugin sonarqube to v7.1.0.6387 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5783
* fix(deps): update dependency io.github.sergio-sastre.composablepreviewscanner:android to v0.7.2 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5799
* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.11.24 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5796
* fix(deps): update dependency io.sentry:sentry-android to v8.27.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5803
* fix(deps): update dependency io.element.android:emojibase-bindings to v1.5.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5801
* fix(deps): update roborazzi to v1.52.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5804
* fix(deps): update dependency org.maplibre.gl:android-sdk to v12.2.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5814
* chore(deps): update actions/checkout action to v6 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5805
* fix(deps): update dependency com.google.testparameterinjector:test-parameter-injector to v1.20 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5800
* fix(deps): update android.gradle.plugin to v8.13.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5260
* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.11.26 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5818
* fix(deps): update dependencyanalysis to v3.5.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5819
* fix(deps): update dependency com.posthog:posthog-android to v3.27.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5834
* fix(deps): update dependency io.element.android:element-call-embedded to v0.16.3 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5839
* Upgrade the Rust SDK to `v25.12.2` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5838
### Others
* misc : use newLatestEvent api from sdk by @ganfra in https://github.com/element-hq/element-x-android/pull/5809
* Inject RoomMemberListDataSource in the presenter constructor. by @bmarty in https://github.com/element-hq/element-x-android/pull/5822
* Add more performance checks by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5767
* Load `JoinedRoom` in home screen, pass it to the room flow by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5817
* Revert "fix(deps): update dependency com.posthog:posthog-android to v3.27.0" by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5836
**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.11.3...v25.12.0
Changes in Element X v25.11.3
=============================

View File

@@ -39,7 +39,6 @@ import com.bumble.appyx.navmodel.backstack.operation.replace
import com.bumble.appyx.navmodel.backstack.operation.singleTop
import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedInject
import im.vector.app.features.analytics.plan.JoinedRoom
import io.element.android.annotations.ContributesNode
import io.element.android.appnav.loggedin.LoggedInNode
import io.element.android.appnav.loggedin.MediaPreviewConfigMigration
@@ -84,6 +83,7 @@ import io.element.android.libraries.matrix.api.core.RoomIdOrAlias
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias
import io.element.android.libraries.matrix.api.permalink.PermalinkData
import io.element.android.libraries.matrix.api.room.JoinedRoom
import io.element.android.libraries.matrix.api.sync.SyncService
import io.element.android.libraries.matrix.api.verification.SessionVerificationServiceListener
import io.element.android.libraries.matrix.api.verification.VerificationRequest
@@ -109,6 +109,7 @@ import java.util.UUID
import kotlin.time.Duration.Companion.minutes
import kotlin.time.Duration.Companion.seconds
import kotlin.time.toKotlinDuration
import im.vector.app.features.analytics.plan.JoinedRoom as JoinedRoomAnalyticsEvent
@ContributesNode(SessionScope::class)
@AssistedInject
@@ -265,7 +266,7 @@ class LoggedInFlowNode(
data class Room(
val roomIdOrAlias: RoomIdOrAlias,
val serverNames: List<String> = emptyList(),
val trigger: JoinedRoom.Trigger? = null,
val trigger: JoinedRoomAnalyticsEvent.Trigger? = null,
val roomDescription: RoomDescription? = null,
val initialElement: RoomNavigationTarget = RoomNavigationTarget.Root(),
val targetId: UUID = UUID.randomUUID(),
@@ -315,8 +316,13 @@ class LoggedInFlowNode(
}
NavTarget.Home -> {
val callback = object : HomeEntryPoint.Callback {
override fun navigateToRoom(roomId: RoomId) {
backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias()))
override fun navigateToRoom(roomId: RoomId, joinedRoom: JoinedRoom?) {
backstack.push(
NavTarget.Room(
roomIdOrAlias = roomId.toRoomIdOrAlias(),
initialElement = RoomNavigationTarget.Root(joinedRoom = joinedRoom)
)
)
}
override fun navigateToSettings() {
@@ -365,7 +371,7 @@ class LoggedInFlowNode(
val target = NavTarget.Room(
roomIdOrAlias = data.roomIdOrAlias,
serverNames = data.viaParameters,
trigger = JoinedRoom.Trigger.Timeline,
trigger = JoinedRoomAnalyticsEvent.Trigger.Timeline,
initialElement = RoomNavigationTarget.Root(data.eventId),
)
if (pushToBackstack) {
@@ -479,7 +485,7 @@ class LoggedInFlowNode(
NavTarget.Room(
roomIdOrAlias = roomDescription.roomId.toRoomIdOrAlias(),
roomDescription = roomDescription,
trigger = JoinedRoom.Trigger.RoomDirectory,
trigger = JoinedRoomAnalyticsEvent.Trigger.RoomDirectory,
)
)
}
@@ -519,7 +525,7 @@ class LoggedInFlowNode(
suspend fun attachRoom(
roomIdOrAlias: RoomIdOrAlias,
serverNames: List<String> = emptyList(),
trigger: JoinedRoom.Trigger? = null,
trigger: JoinedRoomAnalyticsEvent.Trigger? = null,
eventId: EventId? = null,
clearBackstack: Boolean,
): RoomFlowNode {

View File

@@ -19,10 +19,10 @@ import com.bumble.appyx.core.node.node
import com.bumble.appyx.core.plugin.Plugin
import com.bumble.appyx.core.plugin.plugins
import com.bumble.appyx.navmodel.backstack.BackStack
import com.bumble.appyx.navmodel.backstack.active
import com.bumble.appyx.navmodel.backstack.operation.newRoot
import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedInject
import im.vector.app.features.analytics.plan.JoinedRoom
import io.element.android.annotations.ContributesNode
import io.element.android.appnav.room.joined.JoinedRoomFlowNode
import io.element.android.appnav.room.joined.JoinedRoomLoadedFlowNode
@@ -60,10 +60,13 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.shareIn
import kotlinx.coroutines.launch
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
import timber.log.Timber
import java.util.Optional
import kotlin.jvm.optionals.getOrNull
import im.vector.app.features.analytics.plan.JoinedRoom as JoinedRoomAnalyticsEvent
import io.element.android.libraries.matrix.api.room.JoinedRoom as JoinedRoomInstance
@ContributesNode(SessionScope::class)
@AssistedInject
@@ -77,7 +80,14 @@ class RoomFlowNode(
private val analyticsService: AnalyticsService,
) : BaseFlowNode<RoomFlowNode.NavTarget>(
backstack = BackStack(
initialElement = NavTarget.Loading,
initialElement = run {
val joinedRoom = (plugins.filterIsInstance<Inputs>().first().initialElement as? RoomNavigationTarget.Root)?.joinedRoom
if (joinedRoom != null) {
NavTarget.JoinedRoom(joinedRoom)
} else {
NavTarget.Loading
}
},
savedStateMap = buildContext.savedStateMap,
),
buildContext = buildContext,
@@ -87,7 +97,7 @@ class RoomFlowNode(
val roomIdOrAlias: RoomIdOrAlias,
val roomDescription: Optional<RoomDescription>,
val serverNames: List<String>,
val trigger: Optional<JoinedRoom.Trigger>,
val trigger: Optional<JoinedRoomAnalyticsEvent.Trigger>,
val initialElement: RoomNavigationTarget,
) : NodeInputs
@@ -104,11 +114,16 @@ class RoomFlowNode(
data class JoinRoom(
val roomId: RoomId,
val serverNames: List<String>,
val trigger: im.vector.app.features.analytics.plan.JoinedRoom.Trigger,
val trigger: JoinedRoomAnalyticsEvent.Trigger,
) : NavTarget
@Parcelize
data class JoinedRoom(val roomId: RoomId) : NavTarget
data class JoinedRoom(
val roomId: RoomId,
@IgnoredOnParcel val joinedRoom: JoinedRoomInstance? = null,
) : NavTarget {
constructor(joinedRoom: JoinedRoomInstance) : this(joinedRoom.roomId, joinedRoom)
}
}
override fun onBuilt() {
@@ -133,7 +148,9 @@ class RoomFlowNode(
}
private fun subscribeToRoomInfoFlow(roomId: RoomId, serverNames: List<String>) {
val roomInfoFlow = client.getRoomInfoFlow(roomId)
val joinedRoom = (inputs.initialElement as? RoomNavigationTarget.Root)?.joinedRoom
val roomInfoFlow = joinedRoom?.roomInfoFlow?.map { Optional.of(it) }
?: client.getRoomInfoFlow(roomId)
// This observes the local membership changes for the room
val membershipUpdateFlow = membershipObserver.updates
@@ -149,6 +166,11 @@ class RoomFlowNode(
currentMembershipFlow.onEach { (previousMembership, membership) ->
Timber.d("Room membership: $membership")
if (membership == CurrentUserMembership.JOINED) {
val currentNavTarget = backstack.active?.key?.navTarget
if (currentNavTarget is NavTarget.JoinedRoom && currentNavTarget.roomId == roomId) {
Timber.d("Already in JoinedRoom $roomId, do nothing")
return@onEach
}
backstack.newRoot(NavTarget.JoinedRoom(roomId))
} else {
val leavingFromCurrentDevice =
@@ -163,7 +185,7 @@ class RoomFlowNode(
NavTarget.JoinRoom(
roomId = roomId,
serverNames = serverNames,
trigger = inputs.trigger.getOrNull() ?: JoinedRoom.Trigger.Invite,
trigger = inputs.trigger.getOrNull() ?: JoinedRoomAnalyticsEvent.Trigger.Invite,
)
)
}
@@ -209,7 +231,8 @@ class RoomFlowNode(
val roomFlowNodeCallback = plugins<JoinedRoomLoadedFlowNode.Callback>()
val inputs = JoinedRoomFlowNode.Inputs(
roomId = navTarget.roomId,
initialElement = inputs.initialElement
initialElement = inputs.initialElement,
joinedRoom = navTarget.joinedRoom,
)
createNode<JoinedRoomFlowNode>(buildContext, plugins = listOf(inputs) + roomFlowNodeCallback)
}

View File

@@ -10,12 +10,15 @@ package io.element.android.appnav.room
import android.os.Parcelable
import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.room.JoinedRoom
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
sealed interface RoomNavigationTarget : Parcelable {
@Parcelize
data class Root(
val eventId: EventId? = null,
@IgnoredOnParcel val joinedRoom: JoinedRoom? = null,
) : RoomNavigationTarget
@Parcelize

View File

@@ -38,6 +38,7 @@ import io.element.android.libraries.di.SessionScope
import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.ThreadId
import io.element.android.libraries.matrix.api.room.JoinedRoom
import io.element.android.libraries.matrix.ui.room.LoadingRoomState
import io.element.android.libraries.matrix.ui.room.LoadingRoomStateFlowFactory
import kotlinx.coroutines.flow.distinctUntilChanged
@@ -63,11 +64,12 @@ class JoinedRoomFlowNode(
) {
data class Inputs(
val roomId: RoomId,
val joinedRoom: JoinedRoom?,
val initialElement: RoomNavigationTarget,
) : NodeInputs
private val inputs: Inputs = inputs()
private val loadingRoomStateStateFlow = loadingRoomStateFlowFactory.create(lifecycleScope, inputs.roomId)
private val loadingRoomStateStateFlow = loadingRoomStateFlowFactory.create(lifecycleScope, inputs.roomId, inputs.joinedRoom)
sealed interface NavTarget : Parcelable {
@Parcelize

View File

@@ -23,6 +23,19 @@ import kotlinx.coroutines.test.runTest
import org.junit.Test
class LoadingBaseRoomStateFlowFactoryTest {
@Test
fun `flow should emit only Loaded when we already pass a JoinedRoom`() = runTest {
val room = FakeJoinedRoom(baseRoom = FakeBaseRoom(sessionId = A_SESSION_ID, roomId = A_ROOM_ID))
val matrixClient = FakeMatrixClient(A_SESSION_ID)
val flowFactory = LoadingRoomStateFlowFactory(matrixClient)
flowFactory
.create(lifecycleScope = this, roomId = A_ROOM_ID, joinedRoom = room)
.test {
assertThat(awaitItem()).isEqualTo(LoadingRoomState.Loaded(room))
ensureAllEventsConsumed()
}
}
@Test
fun `flow should emit Loading and then Loaded when there is a room in cache`() = runTest {
val room = FakeJoinedRoom(baseRoom = FakeBaseRoom(sessionId = A_SESSION_ID, roomId = A_ROOM_ID))
@@ -31,7 +44,7 @@ class LoadingBaseRoomStateFlowFactoryTest {
}
val flowFactory = LoadingRoomStateFlowFactory(matrixClient)
flowFactory
.create(this, A_ROOM_ID)
.create(lifecycleScope = this, roomId = A_ROOM_ID, joinedRoom = null)
.test {
assertThat(awaitItem()).isEqualTo(LoadingRoomState.Loading)
assertThat(awaitItem()).isEqualTo(LoadingRoomState.Loaded(room))
@@ -45,7 +58,7 @@ class LoadingBaseRoomStateFlowFactoryTest {
val matrixClient = FakeMatrixClient(A_SESSION_ID, roomListService = roomListService)
val flowFactory = LoadingRoomStateFlowFactory(matrixClient)
flowFactory
.create(this, A_ROOM_ID)
.create(lifecycleScope = this, roomId = A_ROOM_ID, joinedRoom = null)
.test {
assertThat(awaitItem()).isEqualTo(LoadingRoomState.Loading)
matrixClient.givenGetRoomResult(A_ROOM_ID, room)
@@ -60,7 +73,7 @@ class LoadingBaseRoomStateFlowFactoryTest {
val matrixClient = FakeMatrixClient(A_SESSION_ID, roomListService = roomListService)
val flowFactory = LoadingRoomStateFlowFactory(matrixClient)
flowFactory
.create(this, A_ROOM_ID)
.create(lifecycleScope = this, roomId = A_ROOM_ID, joinedRoom = null)
.test {
assertThat(awaitItem()).isEqualTo(LoadingRoomState.Loading)
roomListService.postAllRoomsLoadingState(RoomList.LoadingState.Loaded(1))

View File

@@ -0,0 +1,6 @@
Main changes in this version:
- Improve the room security and privacy screens.
- Better room list sorting.
- Fixed crashes when recording long voice messages.
- Improved the UX when opening a room from the room list.
Full changelog: https://github.com/element-hq/element-x-android/releases

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_space_announcement_item1">"Visualizza gli spazi che hai creato o a cui partecipi"</string>
<string name="screen_space_announcement_item2">"Accetta o rifiuta gli inviti agli spazi"</string>
<string name="screen_space_announcement_item3">"Scopri tutte le stanze a cui puoi partecipare nei tuoi spazi"</string>
<string name="screen_space_announcement_item4">"Unisciti agli spazi pubblici"</string>
<string name="screen_space_announcement_item5">"Lascia tutti gli spazi a cui ti sei unito"</string>
<string name="screen_space_announcement_notice">"A breve saranno disponibili le funzionalità di filtraggio, creazione e gestione degli spazi."</string>
<string name="screen_space_announcement_subtitle">"Benvenuti alla versione beta degli Spazi! Con questa prima versione potrete:"</string>
<string name="screen_space_announcement_title">"Ti presentiamo gli Spazi"</string>
</resources>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_space_announcement_item1">"Visualizar espaços que criou ou entrou"</string>
<string name="screen_space_announcement_item2">"Aceitar ou recusar convites aos espaços"</string>
<string name="screen_space_announcement_item3">"Descobrir quaisquer salas que você pode entrar nos espaços"</string>
<string name="screen_space_announcement_item4">"Entrar espaços públicos"</string>
<string name="screen_space_announcement_item5">"Sair de quaisquer espaços que entrou"</string>
<string name="screen_space_announcement_notice">"Filtrar, criar, e gerenciar espaços virão em breve."</string>
<string name="screen_space_announcement_subtitle">"Boas-vindas à versão beta dos Espaços! Com essa primeira versão, você pode:"</string>
<string name="screen_space_announcement_title">"Apresentando Espaços"</string>
</resources>

View File

@@ -2,4 +2,10 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_space_announcement_item1">"查看您创建或加入的空间"</string>
<string name="screen_space_announcement_item2">"接受或拒绝空间邀请"</string>
<string name="screen_space_announcement_item3">"发现您可以加入空间的所有房间"</string>
<string name="screen_space_announcement_item4">"加入公共空间"</string>
<string name="screen_space_announcement_item5">"离开你加入的所有空间"</string>
<string name="screen_space_announcement_notice">"筛选、创建及管理空间功能即将上线。"</string>
<string name="screen_space_announcement_subtitle">"欢迎使用 Spaces 测试版!使用首个版本,您可以:"</string>
<string name="screen_space_announcement_title">"Spaces 简介"</string>
</resources>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_create_room_action_create_room">"Uusi huone"</string>
<string name="screen_create_room_add_people_title">"Kutsu ihmisiä"</string>
<string name="screen_create_room_add_people_title">"Kutsu henkilöitä"</string>
<string name="screen_create_room_error_creating_room">"Huoneen luomisessa tapahtui virhe"</string>
<string name="screen_create_room_private_option_description">"Vain kutsutut henkilöt pääsevät tähän huoneeseen. Kaikki viestit ovat päästä päähän salattuja."</string>
<string name="screen_create_room_private_option_title">"Yksityinen huone"</string>

View File

@@ -14,6 +14,7 @@ Você pode mudar isso a qualquer momento nas configurações da sala."</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Qualquer pessoa pode pedir para entrar na sala, mas um administrador ou moderador terá de aceitar a solicitação"</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Pedir para entrar"</string>
<string name="screen_create_room_room_address_section_footer">"Para que esta sala fique visível no diretório público de salas, você precisará de um endereço de sala."</string>
<string name="screen_create_room_room_address_section_title">"Endereço da sala"</string>
<string name="screen_create_room_room_name_label">"Nome da sala"</string>
<string name="screen_create_room_room_visibility_section_title">"Visibilidade da sala"</string>
<string name="screen_create_room_title">"Criar uma sala"</string>

View File

@@ -13,6 +13,7 @@ import com.bumble.appyx.core.node.Node
import com.bumble.appyx.core.plugin.Plugin
import io.element.android.libraries.architecture.FeatureEntryPoint
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.room.JoinedRoom
interface HomeEntryPoint : FeatureEntryPoint {
fun createNode(
@@ -22,7 +23,7 @@ interface HomeEntryPoint : FeatureEntryPoint {
): Node
interface Callback : Plugin {
fun navigateToRoom(roomId: RoomId)
fun navigateToRoom(roomId: RoomId, joinedRoom: JoinedRoom?)
fun navigateToCreateRoom()
fun navigateToSettings()
fun navigateToSetUpRecovery()

View File

@@ -14,6 +14,8 @@ import androidx.activity.compose.LocalActivity
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.coroutineScope
@@ -41,20 +43,33 @@ import io.element.android.features.logout.api.direct.DirectLogoutView
import io.element.android.features.reportroom.api.ReportRoomEntryPoint
import io.element.android.features.rolesandpermissions.api.ChangeRoomMemberRolesEntryPoint
import io.element.android.features.rolesandpermissions.api.ChangeRoomMemberRolesListType
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.architecture.BackstackView
import io.element.android.libraries.architecture.BaseFlowNode
import io.element.android.libraries.architecture.appyx.launchMolecule
import io.element.android.libraries.architecture.callback
import io.element.android.libraries.core.extensions.runCatchingExceptions
import io.element.android.libraries.deeplink.api.usecase.InviteFriendsUseCase
import io.element.android.libraries.designsystem.components.ProgressDialog
import io.element.android.libraries.designsystem.utils.DelayedVisibility
import io.element.android.libraries.di.SessionScope
import io.element.android.libraries.di.annotations.SessionCoroutineScope
import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.services.analytics.api.AnalyticsService
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.delay
import kotlinx.coroutines.isActive
import kotlinx.coroutines.job
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import kotlinx.parcelize.Parcelize
import timber.log.Timber
import kotlin.coroutines.cancellation.CancellationException
import kotlin.time.Duration.Companion.milliseconds
@ContributesNode(SessionScope::class)
@AssistedInject
@@ -71,6 +86,7 @@ class HomeFlowNode(
private val declineInviteAndBlockUserEntryPoint: DeclineInviteAndBlockEntryPoint,
private val changeRoomMemberRolesEntryPoint: ChangeRoomMemberRolesEntryPoint,
private val leaveRoomRenderer: LeaveRoomRenderer,
@SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope,
) : BaseFlowNode<HomeFlowNode.NavTarget>(
backstack = BackStack(
initialElement = NavTarget.Root,
@@ -150,9 +166,58 @@ class HomeFlowNode(
return node(buildContext) { modifier ->
val state by stateFlow.collectAsState()
val activity = requireNotNull(LocalActivity.current)
val loadingJoinedRoomJob = remember { mutableStateOf<AsyncData<Job>>(AsyncData.Uninitialized) }
if (loadingJoinedRoomJob.value.isLoading()) {
DelayedVisibility(duration = 400.milliseconds) {
ProgressDialog(
onDismissRequest = {
loadingJoinedRoomJob.value.dataOrNull()?.cancel()
loadingJoinedRoomJob.value = AsyncData.Uninitialized
}
)
}
}
fun navigateToRoom(
roomId: RoomId,
) {
if (!loadingJoinedRoomJob.value.isUninitialized()) {
Timber.w("Already loading a room, ignoring navigateToRoom for $roomId")
return
}
val job = sessionCoroutineScope.launch {
runCatchingExceptions {
matrixClient.getJoinedRoom(roomId)
}.fold(
onSuccess = { joinedRoom ->
if (isActive) {
callback.navigateToRoom(roomId, joinedRoom)
loadingJoinedRoomJob.value = AsyncData.Success(coroutineContext.job)
// Wait a bit before resetting the state to avoid allowing to open several rooms
delay(200.milliseconds)
loadingJoinedRoomJob.value = AsyncData.Uninitialized
}
},
onFailure = {
// If the operation wasn't cancelled, navigate without the room, using the room id
if (it !is CancellationException) {
callback.navigateToRoom(roomId, null)
}
loadingJoinedRoomJob.value = AsyncData.Failure(error = it, prevData = coroutineContext.job)
// Wait a bit before resetting the state to avoid allowing to open several rooms
delay(200.milliseconds)
loadingJoinedRoomJob.value = AsyncData.Uninitialized
}
)
}
loadingJoinedRoomJob.value = AsyncData.Loading(job)
}
HomeView(
homeState = state,
onRoomClick = callback::navigateToRoom,
onRoomClick = ::navigateToRoom,
onSettingsClick = callback::navigateToSettings,
onStartChatClick = callback::navigateToCreateRoom,
onSetUpRecoveryClick = callback::navigateToSetUpRecovery,
@@ -165,7 +230,7 @@ class HomeFlowNode(
acceptDeclineInviteView = {
acceptDeclineInviteView.Render(
state = state.roomListState.acceptDeclineInviteState,
onAcceptInviteSuccess = callback::navigateToRoom,
onAcceptInviteSuccess = ::navigateToRoom,
onDeclineInviteSuccess = { },
modifier = Modifier
)

View File

@@ -40,6 +40,7 @@ import androidx.compose.ui.zIndex
import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.features.home.impl.R
import io.element.android.features.home.impl.model.LatestEvent
import io.element.android.features.home.impl.model.RoomListRoomSummary
import io.element.android.features.home.impl.model.RoomListRoomSummaryProvider
import io.element.android.features.home.impl.model.RoomSummaryDisplayType
@@ -120,6 +121,7 @@ internal fun RoomSummaryRow(
) {
NameAndTimestampRow(
name = room.name,
latestEvent = room.latestEvent,
timestamp = room.timestamp,
isHighlighted = room.isHighlighted
)
@@ -136,6 +138,7 @@ internal fun RoomSummaryRow(
) {
NameAndTimestampRow(
name = room.name,
latestEvent = room.latestEvent,
timestamp = null,
isHighlighted = room.isHighlighted
)
@@ -211,6 +214,7 @@ private fun RoomSummaryScaffoldRow(
@Composable
private fun NameAndTimestampRow(
name: String?,
latestEvent: LatestEvent,
timestamp: String?,
isHighlighted: Boolean,
modifier: Modifier = Modifier
@@ -219,16 +223,42 @@ private fun NameAndTimestampRow(
modifier = modifier.fillMaxWidth(),
horizontalArrangement = spacedBy(16.dp)
) {
// Name
Text(
Row(
modifier = Modifier.weight(1f),
style = ElementTheme.typography.fontBodyLgMedium,
text = name ?: stringResource(id = CommonStrings.common_no_room_name),
fontStyle = FontStyle.Italic.takeIf { name == null },
color = ElementTheme.colors.roomListRoomName,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
verticalAlignment = Alignment.CenterVertically,
) {
// Name
Text(
style = ElementTheme.typography.fontBodyLgMedium,
text = name ?: stringResource(id = CommonStrings.common_no_room_name),
fontStyle = FontStyle.Italic.takeIf { name == null },
color = ElementTheme.colors.roomListRoomName,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
// Picto
when (latestEvent) {
is LatestEvent.Sending -> {
Spacer(modifier = Modifier.width(4.dp))
Icon(
modifier = Modifier.size(16.dp),
imageVector = CompoundIcons.Time(),
contentDescription = null,
tint = ElementTheme.colors.iconTertiary,
)
}
is LatestEvent.Error -> {
Spacer(modifier = Modifier.width(4.dp))
Icon(
modifier = Modifier.size(16.dp),
imageVector = CompoundIcons.ErrorSolid(),
contentDescription = null,
tint = ElementTheme.colors.iconCriticalPrimary,
)
}
else -> Unit
}
}
// Timestamp
Text(
text = timestamp ?: "",
@@ -274,21 +304,41 @@ private fun MessagePreviewAndIndicatorRow(
modifier = modifier.fillMaxWidth(),
horizontalArrangement = spacedBy(28.dp)
) {
val messagePreview = if (room.isTombstoned) {
stringResource(R.string.screen_roomlist_tombstoned_room_description)
if (room.isTombstoned) {
Text(
modifier = Modifier.weight(1f),
text = stringResource(R.string.screen_roomlist_tombstoned_room_description),
color = ElementTheme.colors.roomListRoomMessage,
style = ElementTheme.typography.fontBodyMdRegular,
minLines = 2,
maxLines = 2,
overflow = TextOverflow.Ellipsis,
)
} else {
room.latestEvent.orEmpty()
if (room.latestEvent is LatestEvent.Error) {
Text(
modifier = Modifier.weight(1f),
text = stringResource(CommonStrings.common_message_failed_to_send),
color = ElementTheme.colors.textCriticalPrimary,
style = ElementTheme.typography.fontBodyMdRegular,
minLines = 2,
maxLines = 2,
overflow = TextOverflow.Ellipsis,
)
} else {
val messagePreview = room.latestEvent.content()
val annotatedMessagePreview = messagePreview as? AnnotatedString ?: AnnotatedString(text = messagePreview.orEmpty().toString())
Text(
modifier = Modifier.weight(1f),
text = annotatedMessagePreview,
color = ElementTheme.colors.roomListRoomMessage,
style = ElementTheme.typography.fontBodyMdRegular,
minLines = 2,
maxLines = 2,
overflow = TextOverflow.Ellipsis,
)
}
}
val annotatedMessagePreview = messagePreview as? AnnotatedString ?: AnnotatedString(text = messagePreview.toString())
Text(
modifier = Modifier.weight(1f),
text = annotatedMessagePreview,
color = ElementTheme.colors.roomListRoomMessage,
style = ElementTheme.typography.fontBodyMdRegular,
minLines = 2,
maxLines = 2,
overflow = TextOverflow.Ellipsis
)
// Call and unread
Row(

View File

@@ -9,6 +9,7 @@
package io.element.android.features.home.impl.datasource
import dev.zacsweers.metro.Inject
import io.element.android.features.home.impl.model.LatestEvent
import io.element.android.features.home.impl.model.RoomListRoomSummary
import io.element.android.features.home.impl.model.RoomSummaryDisplayType
import io.element.android.libraries.core.extensions.orEmpty
@@ -18,6 +19,7 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.eventformatter.api.RoomLatestEventFormatter
import io.element.android.libraries.matrix.api.room.CurrentUserMembership
import io.element.android.libraries.matrix.api.room.isDm
import io.element.android.libraries.matrix.api.roomlist.LatestEventValue
import io.element.android.libraries.matrix.api.roomlist.RoomSummary
import io.element.android.libraries.matrix.ui.model.getAvatarData
import io.element.android.libraries.matrix.ui.model.toInviteSender
@@ -44,7 +46,7 @@ class RoomListRoomSummaryFactory(
mode = DateFormatterMode.TimeOrDate,
useRelative = true,
),
latestEvent = roomLatestEventFormatter.format(roomSummary.latestEvent, roomInfo.isDm).orEmpty(),
latestEvent = computeLatestEvent(roomSummary.latestEvent, roomInfo.isDm),
avatarData = avatarData,
userDefinedNotificationMode = roomInfo.userDefinedNotificationMode,
hasRoomCall = roomInfo.hasRoomCall,
@@ -71,4 +73,28 @@ class RoomListRoomSummaryFactory(
isSpace = roomInfo.isSpace,
)
}
private fun computeLatestEvent(latestEvent: LatestEventValue, dm: Boolean): LatestEvent {
return when (latestEvent) {
is LatestEventValue.None -> {
LatestEvent.None
}
is LatestEventValue.Local -> {
if (latestEvent.isSending) {
val content = roomLatestEventFormatter.format(latestEvent, dm).orEmpty()
LatestEvent.Sending(
content = content,
)
} else {
LatestEvent.Error
}
}
is LatestEventValue.Remote -> {
val content = roomLatestEventFormatter.format(latestEvent, dm).orEmpty()
LatestEvent.Synced(
content = content,
)
}
}
}
}

View File

@@ -0,0 +1,34 @@
/*
* Copyright (c) 2025 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.features.home.impl.model
import androidx.compose.runtime.Immutable
@Immutable
sealed interface LatestEvent {
data object None : LatestEvent
data class Synced(
val content: CharSequence?,
) : LatestEvent
data class Sending(
val content: CharSequence?,
) : LatestEvent
data object Error : LatestEvent
fun content(): CharSequence? {
return when (this) {
is None -> null
is Synced -> content
is Sending -> content
is Error -> null
}
}
}

View File

@@ -29,7 +29,7 @@ data class RoomListRoomSummary(
val numberOfUnreadNotifications: Long,
val isMarkedUnread: Boolean,
val timestamp: String?,
val latestEvent: CharSequence?,
val latestEvent: LatestEvent,
val avatarData: AvatarData,
val userDefinedNotificationMode: RoomNotificationMode?,
val hasRoomCall: Boolean,

View File

@@ -25,12 +25,14 @@ open class RoomListRoomSummaryProvider : PreviewParameterProvider<RoomListRoomSu
aRoomListRoomSummary(displayType = RoomSummaryDisplayType.PLACEHOLDER),
aRoomListRoomSummary(),
aRoomListRoomSummary(name = null),
aRoomListRoomSummary(lastMessage = null),
aRoomListRoomSummary(latestEvent = LatestEvent.None),
aRoomListRoomSummary(
name = "A very long room name that should be truncated",
lastMessage = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +
" ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea com" +
"modo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
latestEvent = LatestEvent.Synced(
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +
" ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea com" +
"modo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur."
),
timestamp = "yesterday",
numberOfUnreadMessages = 1,
),
@@ -44,7 +46,7 @@ open class RoomListRoomSummaryProvider : PreviewParameterProvider<RoomListRoomSu
listOf(
aRoomListRoomSummary(
name = roomNotificationMode.name,
lastMessage = "No activity" + if (hasCall) ", call" else "",
latestEvent = LatestEvent.Synced("No activity" + if (hasCall) ", call" else ""),
notificationMode = roomNotificationMode,
numberOfUnreadMessages = 0,
numberOfUnreadMentions = 0,
@@ -52,7 +54,7 @@ open class RoomListRoomSummaryProvider : PreviewParameterProvider<RoomListRoomSu
),
aRoomListRoomSummary(
name = roomNotificationMode.name,
lastMessage = "New messages" + if (hasCall) ", call" else "",
latestEvent = LatestEvent.Synced("New messages" + if (hasCall) ", call" else ""),
notificationMode = roomNotificationMode,
numberOfUnreadMessages = 1,
numberOfUnreadMentions = 0,
@@ -60,7 +62,7 @@ open class RoomListRoomSummaryProvider : PreviewParameterProvider<RoomListRoomSu
),
aRoomListRoomSummary(
name = roomNotificationMode.name,
lastMessage = "New messages, mentions" + if (hasCall) ", call" else "",
latestEvent = LatestEvent.Synced("New messages, mentions" + if (hasCall) ", call" else ""),
notificationMode = roomNotificationMode,
numberOfUnreadMessages = 1,
numberOfUnreadMentions = 1,
@@ -68,7 +70,7 @@ open class RoomListRoomSummaryProvider : PreviewParameterProvider<RoomListRoomSu
),
aRoomListRoomSummary(
name = roomNotificationMode.name,
lastMessage = "New mentions" + if (hasCall) ", call" else "",
latestEvent = LatestEvent.Synced("New mentions" + if (hasCall) ", call" else ""),
notificationMode = roomNotificationMode,
numberOfUnreadMessages = 0,
numberOfUnreadMentions = 1,
@@ -127,6 +129,10 @@ open class RoomListRoomSummaryProvider : PreviewParameterProvider<RoomListRoomSu
isTombstoned = true,
)
),
listOf(
aRoomListRoomSummary(latestEvent = LatestEvent.Sending("A sending message")),
aRoomListRoomSummary(latestEvent = LatestEvent.Error),
)
).flatten()
}
@@ -148,8 +154,8 @@ internal fun aRoomListRoomSummary(
numberOfUnreadMentions: Long = 0,
numberOfUnreadNotifications: Long = 0,
isMarkedUnread: Boolean = false,
lastMessage: String? = "Last message",
timestamp: String? = lastMessage?.let { "88:88" },
latestEvent: LatestEvent = LatestEvent.Synced("Last message"),
timestamp: String? = latestEvent.takeIf { it !is LatestEvent.None }?.let { "88:88" },
notificationMode: RoomNotificationMode? = null,
hasRoomCall: Boolean = false,
avatarData: AvatarData = AvatarData(id, name, size = AvatarSize.RoomListItem),
@@ -171,7 +177,7 @@ internal fun aRoomListRoomSummary(
numberOfUnreadNotifications = numberOfUnreadNotifications,
isMarkedUnread = isMarkedUnread,
timestamp = timestamp,
latestEvent = lastMessage,
latestEvent = latestEvent,
avatarData = avatarData,
userDefinedNotificationMode = notificationMode,
hasRoomCall = hasRoomCall,

View File

@@ -11,6 +11,7 @@ package io.element.android.features.home.impl.roomlist
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.features.home.impl.filters.RoomListFiltersState
import io.element.android.features.home.impl.filters.aRoomListFiltersState
import io.element.android.features.home.impl.model.LatestEvent
import io.element.android.features.home.impl.model.RoomListRoomSummary
import io.element.android.features.home.impl.model.RoomSummaryDisplayType
import io.element.android.features.home.impl.model.aRoomListRoomSummary
@@ -88,7 +89,7 @@ internal fun aRoomListRoomSummaryList(): ImmutableList<RoomListRoomSummary> {
name = "Room",
numberOfUnreadMessages = 1,
timestamp = "14:18",
lastMessage = "A very very very very long message which suites on two lines",
latestEvent = LatestEvent.Synced("A very very very very long message which suites on two lines"),
avatarData = AvatarData("!id", "R", size = AvatarSize.RoomListItem),
id = "!roomId:domain",
),
@@ -96,7 +97,7 @@ internal fun aRoomListRoomSummaryList(): ImmutableList<RoomListRoomSummary> {
name = "Room#2",
numberOfUnreadMessages = 0,
timestamp = "14:16",
lastMessage = "A short message",
latestEvent = LatestEvent.Synced("A short message"),
avatarData = AvatarData("!id", "Z", size = AvatarSize.RoomListItem),
id = "!roomId2:domain",
),
@@ -119,7 +120,7 @@ internal fun generateRoomListRoomSummaryList(
name = "Room#$index",
numberOfUnreadMessages = 0,
timestamp = "14:16",
lastMessage = "A message",
latestEvent = LatestEvent.Synced("A message"),
avatarData = AvatarData("!id$index", "${(65 + index % 26).toChar()}", size = AvatarSize.RoomListItem),
id = "!roomId$index:domain",
)

View File

@@ -6,6 +6,7 @@
<string name="banner_set_up_recovery_content">"بازگردانی تاریخچهٔ پیام‌ها و هویت رمزنگاشته‌تان با کلید بازیابی در صورت از دست دادن همهٔ افزاره‌های موجودتان."</string>
<string name="banner_set_up_recovery_submit">"برپایی بازیابی"</string>
<string name="banner_set_up_recovery_title">"برپایی بازیابی"</string>
<string name="confirm_recovery_key_banner_message">"کلید بازیابی خود را تأیید کنید تا دسترسی به حافظه کلیدها و تاریخچه پیام‌هایتان حفظ شود ."</string>
<string name="confirm_recovery_key_banner_primary_button_title">"ورود کلید بازیابیتان"</string>
<string name="confirm_recovery_key_banner_title">"ذخیره‌ساز کلیدتان از هم‌گام بودن در آمده"</string>
<string name="full_screen_intent_banner_title">"بهبود تجریهٔ تماستان"</string>

View File

@@ -3,6 +3,8 @@
<string name="banner_battery_optimization_content_android">"Disabilita l\'ottimizzazione della batteria per questa app, per assicurarti che tutte le notifiche vengano ricevute."</string>
<string name="banner_battery_optimization_submit_android">"Disabilita l\'ottimizzazione"</string>
<string name="banner_battery_optimization_title_android">"Le notifiche non arrivano?"</string>
<string name="banner_new_sound_message">"Il ping delle notifiche è stato aggiornato: ora è più chiaro, più rapido e meno fastidioso."</string>
<string name="banner_new_sound_title">"Abbiamo rinnovato i tuoi suoni"</string>
<string name="banner_set_up_recovery_content">"Recupera la tua identità crittografica e la cronologia dei messaggi con una chiave di recupero se hai perso tutti i tuoi dispositivi."</string>
<string name="banner_set_up_recovery_submit">"Configura il recupero"</string>
<string name="banner_set_up_recovery_title">"Configura il ripristino"</string>

View File

@@ -3,6 +3,8 @@
<string name="banner_battery_optimization_content_android">"Desative a otimização de bateria para este app, para que tenha certeza que todas as notificações sejam recebidas."</string>
<string name="banner_battery_optimization_submit_android">"Desativar otimização"</string>
<string name="banner_battery_optimization_title_android">"As notificações não chegam?"</string>
<string name="banner_new_sound_message">"O seu ping de notificação foi atualizado—mais suave, mais rápido, e menos disruptivo."</string>
<string name="banner_new_sound_title">"Recarregamos seus sons"</string>
<string name="banner_set_up_recovery_content">"Recupere sua identidade criptográfica e o histórico de mensagens com uma chave de recuperação caso você perda todos os dispositivos existentes."</string>
<string name="banner_set_up_recovery_submit">"Configurar a recuperação"</string>
<string name="banner_set_up_recovery_title">"Configure a recuperação para proteger sua conta"</string>
@@ -33,6 +35,7 @@ Por enquanto, você pode desmarcar os filtros para ver suas outras conversas"</s
<string name="screen_roomlist_filter_invites">"Convites"</string>
<string name="screen_roomlist_filter_invites_empty_state_title">"Você não tem nenhum convite pendente."</string>
<string name="screen_roomlist_filter_low_priority">"Baixa prioridade"</string>
<string name="screen_roomlist_filter_low_priority_empty_state_title">"Você ainda não tem nenhuma conversa de baixa prioridade"</string>
<string name="screen_roomlist_filter_mixed_empty_state_subtitle">"Você pode desmarcar filtros para ver suas outras conversas"</string>
<string name="screen_roomlist_filter_mixed_empty_state_title">"Você não tem conversas para esta seleção"</string>
<string name="screen_roomlist_filter_people">"Pessoas"</string>

View File

@@ -13,6 +13,7 @@
<string name="full_screen_intent_banner_message">"Muhim qoʻngʻiroqlarni oʻtkazib yubormasligingiz uchun telefoningiz qulflangan holatida toʻliq ekranli bildirishnomalarni korsatishga ruxsat beradigan qilib sozlamalaringizni oʻzgartiring."</string>
<string name="full_screen_intent_banner_title">"Qoʻngʻiroq tajribangizni yaxshilang"</string>
<string name="screen_home_tab_chats">"Suhbatlar"</string>
<string name="screen_home_tab_spaces">"Boshliqlar"</string>
<string name="screen_invites_decline_chat_message">"Haqiqatan ham qo\'shilish taklifini rad qilmoqchimisiz%1$s ?"</string>
<string name="screen_invites_decline_chat_title">"Taklifni rad etish"</string>
<string name="screen_invites_decline_direct_chat_message">"Haqiqatan ham bu shaxsiy chatni rad qilmoqchimisiz%1$s ?"</string>
@@ -22,6 +23,7 @@
<string name="screen_migration_message">"Bu bir martalik jarayon, kutganingiz uchun rahmat."</string>
<string name="screen_migration_title">"Hisobingiz sozlanmoqda."</string>
<string name="screen_roomlist_a11y_create_message">"Yangi suhbat yoki xona yarating"</string>
<string name="screen_roomlist_clear_filters">"Filtrlarni tozalash"</string>
<string name="screen_roomlist_empty_message">"Kimgadir xabar yuborishdan boshlang."</string>
<string name="screen_roomlist_empty_title">"Hozircha chatlar yoq."</string>
<string name="screen_roomlist_filter_favourites">"Sevimlilar"</string>
@@ -31,6 +33,7 @@ Hozircha, boshqa suhbatlaringizni korish uchun filtrlarni bekor qilishingiz m
<string name="screen_roomlist_filter_invites">"Takliflar"</string>
<string name="screen_roomlist_filter_invites_empty_state_title">"Sizda hech qanday kutilayotgan takliflar yoʻq."</string>
<string name="screen_roomlist_filter_low_priority">"Past darajali"</string>
<string name="screen_roomlist_filter_low_priority_empty_state_title">"Sizda hali past ustuvor chatlar yoʻq"</string>
<string name="screen_roomlist_filter_mixed_empty_state_subtitle">"Boshqa suhbatlaringizni koʻrish uchun filtrlarni bekor qilishingiz mumkin"</string>
<string name="screen_roomlist_filter_mixed_empty_state_title">"Sizda bu tanlov uchun chatlar yoq"</string>
<string name="screen_roomlist_filter_people">"Odamlar"</string>
@@ -44,6 +47,7 @@ Sizda oʻqilmagan xabarlar yoʻq!"</string>
<string name="screen_roomlist_main_space_title">"Suhbatlar"</string>
<string name="screen_roomlist_mark_as_read">"Oʻqilgan deb belgilash"</string>
<string name="screen_roomlist_mark_as_unread">"Oʻqilmagan deb belgilash"</string>
<string name="screen_roomlist_tombstoned_room_description">"Bu xona yangilandi"</string>
<string name="session_verification_banner_message">"Siz yangi qurilmadan foydalanayotganga oxshaysiz. Shifrlangan xabarlaringizga kirish uchun boshqa qurilma bilan tasdiqlang."</string>
<string name="session_verification_banner_title">"Siz ekanligingizni tasdiqlang"</string>
</resources>

View File

@@ -3,6 +3,8 @@
<string name="banner_battery_optimization_content_android">"请关闭本应用的电池优化设置,确保不错过任何消息通知。"</string>
<string name="banner_battery_optimization_submit_android">"禁用优化"</string>
<string name="banner_battery_optimization_title_android">"通知未送达?"</string>
<string name="banner_new_sound_message">"您的通知提示音已升级 - 更清晰、更快速、干扰更少。"</string>
<string name="banner_new_sound_title">"我们已更新您的声音"</string>
<string name="banner_set_up_recovery_content">"生成新的恢复密钥,该密钥可用于在您无法访问设备时恢复加密的消息历史记录。"</string>
<string name="banner_set_up_recovery_submit">"设置恢复"</string>
<string name="banner_set_up_recovery_title">"设置恢复"</string>

View File

@@ -13,17 +13,19 @@ import com.bumble.appyx.core.modality.BuildContext
import com.google.common.truth.Truth.assertThat
import io.element.android.features.home.api.HomeEntryPoint
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.room.JoinedRoom
import io.element.android.libraries.matrix.test.FakeMatrixClient
import io.element.android.services.analytics.test.FakeAnalyticsService
import io.element.android.tests.testutils.lambda.lambdaError
import io.element.android.tests.testutils.node.TestParentNode
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class DefaultHomeEntryPointTest {
@Test
fun `test node builder`() {
fun `test node builder`() = runTest {
val entryPoint = DefaultHomeEntryPoint()
val parentNode = TestParentNode.create { buildContext, plugins ->
HomeFlowNode(
@@ -39,10 +41,11 @@ class DefaultHomeEntryPointTest {
declineInviteAndBlockUserEntryPoint = { _, _, _ -> lambdaError() },
changeRoomMemberRolesEntryPoint = { _, _, _, _ -> lambdaError() },
leaveRoomRenderer = { _, _, _ -> lambdaError() },
sessionCoroutineScope = backgroundScope,
)
}
val callback = object : HomeEntryPoint.Callback {
override fun navigateToRoom(roomId: RoomId) = lambdaError()
override fun navigateToRoom(roomId: RoomId, joinedRoom: JoinedRoom?) = lambdaError()
override fun navigateToCreateRoom() = lambdaError()
override fun navigateToSettings() = lambdaError()
override fun navigateToSetUpRecovery() = lambdaError()

View File

@@ -11,11 +11,12 @@ package io.element.android.features.home.impl.datasource
import io.element.android.libraries.dateformatter.api.DateFormatter
import io.element.android.libraries.dateformatter.test.FakeDateFormatter
import io.element.android.libraries.eventformatter.api.RoomLatestEventFormatter
import io.element.android.libraries.eventformatter.test.FakeRoomLatestEventFormatter
fun aRoomListRoomSummaryFactory(
dateFormatter: DateFormatter = FakeDateFormatter { _, _, _ -> "Today" },
roomLatestEventFormatter: RoomLatestEventFormatter = RoomLatestEventFormatter { _, _ -> "Hey" }
roomLatestEventFormatter: RoomLatestEventFormatter = FakeRoomLatestEventFormatter(),
) = RoomListRoomSummaryFactory(
dateFormatter = dateFormatter,
roomLatestEventFormatter = roomLatestEventFormatter
roomLatestEventFormatter = roomLatestEventFormatter,
)

View File

@@ -96,7 +96,7 @@ internal fun createRoomListRoomSummary(
numberOfUnreadNotifications = numberOfUnreadNotifications,
isMarkedUnread = isMarkedUnread,
timestamp = timestamp,
latestEvent = "",
latestEvent = LatestEvent.Synced(""),
avatarData = AvatarData(id = A_ROOM_ID.value, name = A_ROOM_NAME, size = AvatarSize.RoomListItem),
displayType = displayType,
userDefinedNotificationMode = userDefinedNotificationMode,

View File

@@ -170,7 +170,7 @@ class RoomListViewTest {
// Remove automatic initial events
eventsRecorder.clear()
rule.onNodeWithText(room0.latestEvent!!.toString()).performClick()
rule.onNodeWithText(room0.latestEvent.content().toString()).performClick()
}
eventsRecorder.assertEmpty()
@@ -192,7 +192,7 @@ class RoomListViewTest {
)
// Remove automatic initial events
eventsRecorder.clear()
rule.onNodeWithText(room0.latestEvent!!.toString())
rule.onNodeWithText(room0.latestEvent.content().toString())
.performClick()
.performClick()
}
@@ -214,7 +214,7 @@ class RoomListViewTest {
// Remove automatic initial events
eventsRecorder.clear()
rule.onNodeWithText(room0.latestEvent!!.toString()).performTouchInput { longClick() }
rule.onNodeWithText(room0.latestEvent.content().toString()).performTouchInput { longClick() }
eventsRecorder.assertSingle(RoomListEvents.ShowContextMenu(room0))
}

View File

@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_decline_and_block_block_user_option_description">"Siz bu foydalanuvchidan hech qanday xabar yoki xonaga taklif kormaysiz"</string>
<string name="screen_decline_and_block_block_user_option_title">"Foydalanuvchini bloklash"</string>
<string name="screen_decline_and_block_report_user_option_description">"Bu xona haqida hisobingiz provayderiga xabar bering."</string>
<string name="screen_decline_and_block_report_user_reason_placeholder">"Xabar berish sababini tushuntiring…"</string>
<string name="screen_decline_and_block_title">"Rad etish va bloklash"</string>
<string name="screen_invites_decline_chat_message">"Haqiqatan ham qo\'shilish taklifini rad qilmoqchimisiz%1$s ?"</string>
<string name="screen_invites_decline_chat_title">"Taklifni rad etish"</string>
@@ -8,5 +11,8 @@
<string name="screen_invites_decline_direct_chat_title">"Chatni rad etish"</string>
<string name="screen_invites_empty_list">"Takliflar yo\'q"</string>
<string name="screen_invites_invited_you">"%1$s(%2$s ) sizni taklif qildi"</string>
<string name="screen_join_room_decline_and_block_alert_confirmation">"Ha, rad etish va bloklash"</string>
<string name="screen_join_room_decline_and_block_alert_message">"Ushbu xonaga qoshilish taklifini rad etishga ishonchingiz komilmi? Bu %1$sning siz bilan boglanishiga yoki sizni xonalarga taklif qilishiga ham tosqinlik qiladi."</string>
<string name="screen_join_room_decline_and_block_alert_title">"Taklifni rad etish va bloklash"</string>
<string name="screen_join_room_decline_and_block_button_title">"Rad etish va bloklash"</string>
</resources>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_join_room_ban_by_message">"Sei stato bandito da questa stanza da %1$s."</string>
<string name="screen_join_room_ban_message">"Sei stato bandito da questa stanza"</string>
<string name="screen_join_room_ban_by_message">"Sei stato bannato da %1$s ."</string>
<string name="screen_join_room_ban_message">"Sei stato bannato"</string>
<string name="screen_join_room_ban_reason">"Motivo: %1$s"</string>
<string name="screen_join_room_cancel_knock_action">"Cancella richiesta"</string>
<string name="screen_join_room_cancel_knock_alert_confirmation">"Sì, annulla"</string>
@@ -11,10 +11,11 @@
<string name="screen_join_room_decline_and_block_alert_message">"Sei sicuro di voler rifiutare l\'invito a entrare in questa stanza? Ciò impedirà a %1$s di contattarti o invitarti nuovamente in una stanza."</string>
<string name="screen_join_room_decline_and_block_alert_title">"Rifiuta invito e blocca"</string>
<string name="screen_join_room_decline_and_block_button_title">"Rifiuta e blocca"</string>
<string name="screen_join_room_fail_message">"L\'accesso alla stanza non è riuscito."</string>
<string name="screen_join_room_fail_reason">"Questa stanza è solo su invito o potrebbero esserci delle restrizioni all\'accesso al livello dello spazio."</string>
<string name="screen_join_room_forget_action">"Dimentica questa stanza"</string>
<string name="screen_join_room_invite_required_message">"Hai bisogno di un invito per entrare in questa stanza"</string>
<string name="screen_join_room_fail_message">"Partecipazione non riuscita"</string>
<string name="screen_join_room_fail_reason">"Devi essere invitato per partecipare o potrebbero esserci delle restrizioni di accesso."</string>
<string name="screen_join_room_forget_action">"Dimentica"</string>
<string name="screen_join_room_invite_required_message">"Per partecipare è necessario un invito"</string>
<string name="screen_join_room_invited_by">"Invitato da"</string>
<string name="screen_join_room_join_action">"Entra"</string>
<string name="screen_join_room_join_restricted_message">"Potrebbe essere necessario essere invitati o essere membro di uno spazio per partecipare."</string>
<string name="screen_join_room_knock_action">"Bussa per partecipare"</string>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_join_room_ban_by_message">"Você foi banido desta sala por %1$s."</string>
<string name="screen_join_room_ban_message">"Você foi banido desta sala"</string>
<string name="screen_join_room_ban_by_message">"Você foi banido por %1$s."</string>
<string name="screen_join_room_ban_message">"Você foi banido"</string>
<string name="screen_join_room_ban_reason">"Motivo: %1$s."</string>
<string name="screen_join_room_cancel_knock_action">"Cancelar pedido"</string>
<string name="screen_join_room_cancel_knock_alert_confirmation">"Sim, cancelar"</string>
@@ -11,10 +11,11 @@
<string name="screen_join_room_decline_and_block_alert_message">"Tem certeza de que quer recusar o convite para entrar nesta sala? Isso também impedirá que %1$s entre em contato com você ou o convide para salas."</string>
<string name="screen_join_room_decline_and_block_alert_title">"Recusar convite e bloquear"</string>
<string name="screen_join_room_decline_and_block_button_title">"Recusar e bloquear"</string>
<string name="screen_join_room_fail_message">"A entrada na sala falhou."</string>
<string name="screen_join_room_fail_reason">"Esta sala é apenas para convidados ou pode haver restrições de acesso a nível do espaço."</string>
<string name="screen_join_room_forget_action">"Esquecer esta sala"</string>
<string name="screen_join_room_invite_required_message">"Você precisa de um convite para entrar nesta sala"</string>
<string name="screen_join_room_fail_message">"Falha ao entrar"</string>
<string name="screen_join_room_fail_reason">"Você precisa ser convidado ou pode haver restrições ao acesso."</string>
<string name="screen_join_room_forget_action">"Esquecer"</string>
<string name="screen_join_room_invite_required_message">"Você precisa de um convite para entrar"</string>
<string name="screen_join_room_invited_by">"Convidado por"</string>
<string name="screen_join_room_join_action">"Entrar"</string>
<string name="screen_join_room_join_restricted_message">"Talvez você precise ser convidado ou ser membro de um espaço para participar."</string>
<string name="screen_join_room_knock_action">"Enviar solicitação para entrar"</string>

View File

@@ -1,15 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_join_room_ban_by_message">"Siz %1$s tomonidan ushbu xonadan ban qilingansiz."</string>
<string name="screen_join_room_ban_message">"Siz bu xonadan chetlashtirilgansiz"</string>
<string name="screen_join_room_ban_reason">"Sababi: %1$s ."</string>
<string name="screen_join_room_cancel_knock_action">"Sorovni bekor qilish"</string>
<string name="screen_join_room_cancel_knock_alert_confirmation">"Ha, bekor qiling"</string>
<string name="screen_join_room_cancel_knock_alert_description">"Bu xonaga qoshilish sorovingizni bekor qilishni xohlayotganingizga ishonchingiz komilmi?"</string>
<string name="screen_join_room_cancel_knock_alert_title">"Qoshilish sorovini bekor qilish"</string>
<string name="screen_join_room_decline_and_block_alert_confirmation">"Ha, rad etish va bloklash"</string>
<string name="screen_join_room_decline_and_block_alert_message">"Ushbu xonaga qoshilish taklifini rad etishga ishonchingiz komilmi? Bu %1$sning siz bilan boglanishiga yoki sizni xonalarga taklif qilishiga ham tosqinlik qiladi."</string>
<string name="screen_join_room_decline_and_block_alert_title">"Taklifni rad etish va bloklash"</string>
<string name="screen_join_room_decline_and_block_button_title">"Rad etish va bloklash"</string>
<string name="screen_join_room_fail_message">"Xonaga qoshilish amalga oshmadi"</string>
<string name="screen_join_room_fail_reason">"Bu xona faqat taklif etilganlar uchun yoki bu maydonga kirish huquqi cheklangan bolishi mumkin."</string>
<string name="screen_join_room_forget_action">"Bu xonani esdan chiqarish"</string>
<string name="screen_join_room_invite_required_message">"Bu xonaga kirish uchun taklifnoma kerak"</string>
<string name="screen_join_room_join_action">"Qo\'shilish"</string>
<string name="screen_join_room_join_restricted_message">"Qoshilish uchun sizga taklif kerak yoki siz maydonga azo bolishingiz kerak."</string>
<string name="screen_join_room_knock_action">"Qoʻshilish soʻrovini yuborish"</string>
<string name="screen_join_room_knock_message_characters_count">"Ruxsat etilgan belgilar: %1$d / %2$d"</string>
<string name="screen_join_room_knock_message_description">"Xabar (ixtiyoriy)"</string>
<string name="screen_join_room_knock_sent_description">"Agar sorovingiz qabul qilinsa, xonaga qoshilish taklifini olasiz."</string>
<string name="screen_join_room_knock_sent_title">"Qoshilish sorovi yuborildi"</string>
<string name="screen_join_room_loading_alert_message">"Xona korinishini namoyish eta olmadik. Bu tarmoq yoki server muammolari tufayli yuz bergan bolishi mumkin."</string>
<string name="screen_join_room_loading_alert_title">"Biz bu xonani oldindan korishni korsata olmadik "</string>
<string name="screen_join_room_space_not_supported_description">"%1$s hali maydon xizmatini qoʻllab-quvvatlamaydi. maydonga veb-sayt orqali kirishingiz mumkin."</string>
<string name="screen_join_room_space_not_supported_title">"Maydonlar hali qoʻllab-quvvatlanmaydi"</string>
<string name="screen_join_room_subtitle_knock">"Quyidagi tugmani bosing va xona administratoriga xabar beriladi. Ruxsat berilgandan soʻng suhbatga qoʻshilishingiz mumkin boʻladi."</string>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_join_room_ban_by_message">"你被 %1$s 从此房间封禁。"</string>
<string name="screen_join_room_ban_message">"你已被此房间封禁"</string>
<string name="screen_join_room_ban_by_message">"您已被禁止访问%1$s。"</string>
<string name="screen_join_room_ban_message">"你已被禁止访问"</string>
<string name="screen_join_room_ban_reason">"理由:%1$s。"</string>
<string name="screen_join_room_cancel_knock_action">"取消请求"</string>
<string name="screen_join_room_cancel_knock_alert_confirmation">"是的,取消"</string>
@@ -11,10 +11,10 @@
<string name="screen_join_room_decline_and_block_alert_message">"您确定要拒绝加入此房间的邀请吗?这也将阻止%1$s 与您联系或邀请您加入房间。"</string>
<string name="screen_join_room_decline_and_block_alert_title">"拒绝邀请并屏蔽"</string>
<string name="screen_join_room_decline_and_block_button_title">"拒绝并屏蔽"</string>
<string name="screen_join_room_fail_message">"加入房间失败"</string>
<string name="screen_join_room_fail_reason">"要么此房间仅限受邀者,要么可能在空间层级有加入限制。"</string>
<string name="screen_join_room_forget_action">"忘记这个房间"</string>
<string name="screen_join_room_invite_required_message">"需要邀请才能加入这个房间"</string>
<string name="screen_join_room_fail_message">"加入失败"</string>
<string name="screen_join_room_fail_reason">"您需要被邀请加入,否则可能会受到访问限制。"</string>
<string name="screen_join_room_forget_action">"忘记"</string>
<string name="screen_join_room_invite_required_message">"需要邀请才能加入"</string>
<string name="screen_join_room_invited_by">"受邀于"</string>
<string name="screen_join_room_join_action">"加入"</string>
<string name="screen_join_room_join_restricted_message">"您可能需要受到邀请或成为某个空间的成员才能加入。"</string>

View File

@@ -1,5 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_knock_requests_list_accept_all_alert_confirm_button_title">"Ha, hammasini qabul qiling"</string>
<string name="screen_knock_requests_list_accept_all_alert_description">"Barcha qoshilish sorovlarini qabul qilishga ishonchingiz komilmi?"</string>
<string name="screen_knock_requests_list_accept_all_alert_title">"Barcha sorovlarni qabul qilish"</string>
<string name="screen_knock_requests_list_accept_all_button_title">"Hammasini qabul qiling"</string>
<string name="screen_knock_requests_list_accept_all_failed_alert_description">"Biz barcha sorovlarni qabul qila olmadik. Qayta urinib koʻrmoqchimisiz?"</string>
<string name="screen_knock_requests_list_accept_all_failed_alert_title">"Barcha sorovlar qabul qilinmadi"</string>
<string name="screen_knock_requests_list_accept_all_loading_title">"Qoshilish sorovi qabul qilinmoqda"</string>
<string name="screen_knock_requests_list_accept_failed_alert_description">"Biz bu sorovni qabul qila olmadik. Yana bir bor urinib korishni xohlaysizmi?"</string>
<string name="screen_knock_requests_list_accept_failed_alert_title">"Sorovni qabul qilib bolmadi"</string>
<string name="screen_knock_requests_list_accept_loading_title">"Qoshilish sorovi qabul qilinmoqda"</string>
<string name="screen_knock_requests_list_ban_alert_confirm_button_title">"Ha, rad eting va taqiqlang"</string>
<string name="screen_knock_requests_list_ban_alert_description">"Siz %1$sʼni rad etib, taqiqlashni xohlayotganingizga ishonchingiz komilmi? Bu foydalanuvchi ushbu xonaga qayta kirish uchun ruxsat soray olmaydi."</string>
<string name="screen_knock_requests_list_ban_alert_title">"Rad etish va kirishni taqiqlash"</string>
<string name="screen_knock_requests_list_ban_loading_title">"Kirishni rad etish va taqiqlash"</string>
<string name="screen_knock_requests_list_decline_alert_confirm_button_title">"Ha, rad etish"</string>
<string name="screen_knock_requests_list_decline_alert_description">"%1$sning bu xonaga qoshilish sorovini rad etasizmi?"</string>
<string name="screen_knock_requests_list_decline_alert_title">"Kirishni rad etish"</string>
<string name="screen_knock_requests_list_decline_and_ban_action_title">"Rad etish va taqiqlash"</string>
<string name="screen_knock_requests_list_decline_failed_alert_description">"Biz bu iltimosni rad etolmasdik. Yana bir bor urinib korishni xohlaysizmi?"</string>
<string name="screen_knock_requests_list_decline_failed_alert_title">"Sorovni rad etib bolmadi"</string>
<string name="screen_knock_requests_list_decline_loading_title">"Qoshilish sorovi rad etilayapti"</string>
<string name="screen_knock_requests_list_empty_state_description">"Kimdir xonaga qoshilishni soraganda, uning iltimosini shu yerda korishingiz mumkin."</string>
<string name="screen_knock_requests_list_empty_state_title">"Qoshilish sorovi kutilmayapti"</string>
<string name="screen_knock_requests_list_initial_loading_title">"Qoshilish uchun sorovlar yuklanmoqda…"</string>
<string name="screen_knock_requests_list_title">"Qoshilish uchun sorovlar"</string>
<plurals name="screen_room_multiple_knock_requests_title">
<item quantity="one">"%1$s + %2$d kishi bu xonaga qoshilmoqchi"</item>
<item quantity="other">"%1$s + %2$d kishi bu xonaga qoshilmoqchi"</item>
</plurals>
<string name="screen_room_multiple_knock_requests_view_all_button_title">"Hammasini ko\'rish"</string>
<string name="screen_room_single_knock_request_accept_button_title">"Qabul qiling"</string>
<string name="screen_room_single_knock_request_title">"%1$s bu xonaga qoshilmoqchi"</string>
<string name="screen_room_single_knock_request_view_button_title">"Ko\'rish"</string>
</resources>

View File

@@ -3,5 +3,8 @@
<string name="leave_conversation_alert_subtitle">"Bu suhbatni tark etmoqchi ekanligingizga ishonchingiz komilmi? Bu suhbat hammaga ochiq emas va siz taklifsiz qayta qoshila olmaysiz."</string>
<string name="leave_room_alert_empty_subtitle">"Bu xonani tark etmoqchi ekanligingizga ishonchingiz komilmi? Siz bu yerda yagona odamsiz. Agar siz tark etsangiz, kelajakda hech kim qo\'shila olmaydi, jumladan siz ham."</string>
<string name="leave_room_alert_private_subtitle">"Bu xonani tark etmoqchi ekanligingizga ishonchingiz komilmi? Bu xona ochiq emas va siz taklifsiz qayta qoshila olmaysiz."</string>
<string name="leave_room_alert_select_new_owner_action">"Egalarni tanlang"</string>
<string name="leave_room_alert_select_new_owner_subtitle">"Siz bu xonaning yagona egasisiz. Xonadan chiqishdan oldin egalikni boshqaga topshirishingiz kerak."</string>
<string name="leave_room_alert_select_new_owner_title">"Egalikni topshirish"</string>
<string name="leave_room_alert_subtitle">"Xonani tark etmoqchi ekanligingizga ishonchingiz komilmi?"</string>
</resources>

View File

@@ -24,6 +24,14 @@
<string name="screen_app_lock_setup_pin_mismatch_dialog_title">"پین‌ها مطابق نیستند"</string>
<string name="screen_app_lock_signout_alert_message">"برای ادامه باید دوباره وارد شده و پینی جدید ایجاد کنید"</string>
<string name="screen_app_lock_signout_alert_title">"دارید خارج می‌شوید"</string>
<plurals name="screen_app_lock_subtitle">
<item quantity="one">"شما %1$d تلاش برای باز کردن قفل دارید"</item>
<item quantity="other">"شما %1$d تلاش برای باز کردن قفل دارید"</item>
</plurals>
<plurals name="screen_app_lock_subtitle_wrong_pin">
<item quantity="one">"پین اشتباه است. شما %1$d شانس دیگر دارید"</item>
<item quantity="other">"پین اشتباه است. شما %1$d شانس دیگر دارید"</item>
</plurals>
<string name="screen_app_lock_use_biometric_android">"استفاده از زیست‌سنجی"</string>
<string name="screen_app_lock_use_pin_android">"استفاده از پین"</string>
<string name="screen_signout_in_progress_dialog_content">"خارج شدن…"</string>

View File

@@ -3,6 +3,7 @@
<string name="screen_app_lock_biometric_authentication">"biometrik autentifikatsiya"</string>
<string name="screen_app_lock_biometric_unlock">"biometrik qulf ochish"</string>
<string name="screen_app_lock_biometric_unlock_title_android">"Biometrik bilan qulfni oching"</string>
<string name="screen_app_lock_confirm_biometric_authentication_android">"Biometrikni tasdiqlang"</string>
<string name="screen_app_lock_forgot_pin">"PIN kodni unutdingizmi?"</string>
<string name="screen_app_lock_settings_change_pin">"PIN kodni o\'zgartirish"</string>
<string name="screen_app_lock_settings_enable_biometric_unlock">"Biometrik qulfni ochishga ruxsat bering"</string>

View File

@@ -13,9 +13,17 @@
<string name="screen_change_account_provider_other">"Boshqa"</string>
<string name="screen_change_account_provider_subtitle">"Shaxsiy serveringiz yoki ishchi hisob qaydnomangiz kabi boshqa hisob provayderidan foydalaning."</string>
<string name="screen_change_account_provider_title">"Hisob provayderini o\'zgartiring"</string>
<string name="screen_change_server_error_element_pro_required_action_android">"Google Play"</string>
<string name="screen_change_server_error_element_pro_required_message">"%1$s da Element Pro ilovasi talab qilinadi. Iltimos, dokondan yuklab oling."</string>
<string name="screen_change_server_error_element_pro_required_title">"Element Pro talab qilinadi"</string>
<string name="screen_change_server_error_invalid_homeserver">"Bu uy serveriga kira olmadik. Iltimos, uy serverining URL manzilini to\'ri kiritganingizni tekshiring. Agar URL toʻgʻri boʻlsa, qoʻshimcha yordam olish uchun uy serveri administratoriga murojaat qiling."</string>
<string name="screen_change_server_error_invalid_well_known">".well-known faylidagi muammo tufayli server mavjud emas: %1$s"</string>
<string name="screen_change_server_error_no_sliding_sync_message">"Tanlangan hisob provayderi siljitish sinxronizatsiyasini qollab-quvvatlamaydi. %1$s ishlatish uchun serverni yangilash zarur."</string>
<string name="screen_change_server_error_unauthorized_homeserver">"%1$s uchun %2$s bilan ulanishga ruxsat berilmagan."</string>
<string name="screen_change_server_error_unauthorized_homeserver_content">"Bu ilova quyidagilarga ruxsat berish uchun sozlangan: %1$s ."</string>
<string name="screen_change_server_error_unauthorized_homeserver_title">"Hisob provayderi %1$s ga ruxsat berilmagan."</string>
<string name="screen_change_server_form_header">"Uy serverining URL manzili"</string>
<string name="screen_change_server_form_notice">"Domen manzilini kiriting."</string>
<string name="screen_change_server_subtitle">"Serveringizning manzili nima?"</string>
<string name="screen_change_server_title">"Serveringizni tanlang"</string>
<string name="screen_create_account_title">"Hisob yaratish"</string>
@@ -28,6 +36,7 @@
<string name="screen_login_subtitle">"Matrix xavfsiz, markazlashmagan aloqa uchun ochiq tarmoqdir."</string>
<string name="screen_login_title">"Qaytib kelganingizdan xursandmiz!"</string>
<string name="screen_login_title_with_homeserver">"Kirish%1$s"</string>
<string name="screen_onboarding_app_version">"%1$s versiya"</string>
<string name="screen_onboarding_sign_in_manually">"Qo\'lda tizimga kiring"</string>
<string name="screen_onboarding_sign_in_to">"Kirish%1$s"</string>
<string name="screen_onboarding_sign_in_with_qr_code">"QR kod bilan tizimga kiring"</string>
@@ -83,5 +92,6 @@ Oddiy usulda kiring yoki boshqa qurilma bilan QR kodni skanerlang."</string>
<string name="screen_server_confirmation_message_login_matrix_dot_org">"Matrix xavfsiz, markazlashmagan aloqa uchun ochiq tarmoqdir."</string>
<string name="screen_server_confirmation_message_register">"Bu sizning suhbatlaringiz yashaydigan joy - xuddi siz elektron pochta xabarlaringizni saqlash uchun elektron pochta provayderidan foydalanganingiz kabi."</string>
<string name="screen_server_confirmation_title_login">"Siz tizimga kirmoqchisiz%1$s"</string>
<string name="screen_server_confirmation_title_picker_mode">"Hisob provayderini tanlang"</string>
<string name="screen_server_confirmation_title_register">"Hisob yaratmoqchisiz%1$s"</string>
</resources>

View File

@@ -6,6 +6,7 @@
<string name="screen_signout_in_progress_dialog_content">"خارج شدن…"</string>
<string name="screen_signout_key_backup_disabled_subtitle">"دارید از واپسین نشستتان خارج می‌شوید. اگر اکنون خارج شوید پیام‌های رمزنگاشته‌تان را از دست خواهید داد."</string>
<string name="screen_signout_key_backup_disabled_title">"پشتیبان را خاموش کرده‌اید"</string>
<string name="screen_signout_key_backup_offline_subtitle">"در هنگامی که آفلاین شدید، کلیدهای شما هنوز در حال پشتیبان‌گیری بودند. دوباره متصل شوید ، تا قبل از خروج از کلیدهایتان نسخه پشتیبان‌ گرفته شود."</string>
<string name="screen_signout_key_backup_offline_title">"کلیدهایتان هنوز در حال پشتیبان گیریند"</string>
<string name="screen_signout_key_backup_ongoing_subtitle">"لطفاً پیش از خروج منتظر پایانش شوید."</string>
<string name="screen_signout_key_backup_ongoing_title">"کلیدهایتان هنوز در حال پشتیبان گیریند"</string>

View File

@@ -12,17 +12,17 @@ import androidx.lifecycle.Lifecycle
import io.element.android.libraries.textcomposer.model.VoiceMessagePlayerEvent
import io.element.android.libraries.textcomposer.model.VoiceMessageRecorderEvent
sealed interface VoiceMessageComposerEvents {
sealed interface VoiceMessageComposerEvent {
data class RecorderEvent(
val recorderEvent: VoiceMessageRecorderEvent
) : VoiceMessageComposerEvents
) : VoiceMessageComposerEvent
data class PlayerEvent(
val playerEvent: VoiceMessagePlayerEvent,
) : VoiceMessageComposerEvents
data object SendVoiceMessage : VoiceMessageComposerEvents
data object DeleteVoiceMessage : VoiceMessageComposerEvents
data object AcceptPermissionRationale : VoiceMessageComposerEvents
data object DismissPermissionsRationale : VoiceMessageComposerEvents
data class LifecycleEvent(val event: Lifecycle.Event) : VoiceMessageComposerEvents
data object DismissSendFailureDialog : VoiceMessageComposerEvents
) : VoiceMessageComposerEvent
data object SendVoiceMessage : VoiceMessageComposerEvent
data object DeleteVoiceMessage : VoiceMessageComposerEvent
data object AcceptPermissionRationale : VoiceMessageComposerEvent
data object DismissPermissionsRationale : VoiceMessageComposerEvent
data class LifecycleEvent(val event: Lifecycle.Event) : VoiceMessageComposerEvent
data object DismissSendFailureDialog : VoiceMessageComposerEvent
}

View File

@@ -17,5 +17,5 @@ data class VoiceMessageComposerState(
val showPermissionRationaleDialog: Boolean,
val showSendFailureDialog: Boolean,
val keepScreenOn: Boolean,
val eventSink: (VoiceMessageComposerEvents) -> Unit,
val eventSink: (VoiceMessageComposerEvent) -> Unit,
)

View File

@@ -49,7 +49,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerEvents
import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerEvent
import io.element.android.features.messages.impl.actionlist.ActionListEvents
import io.element.android.features.messages.impl.actionlist.ActionListView
import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction
@@ -126,7 +126,7 @@ fun MessagesView(
knockRequestsBannerView: @Composable () -> Unit,
) {
OnLifecycleEvent { _, event ->
state.voiceMessageComposerState.eventSink(VoiceMessageComposerEvents.LifecycleEvent(event))
state.voiceMessageComposerState.eventSink(VoiceMessageComposerEvent.LifecycleEvent(event))
}
KeepScreenOn(state.voiceMessageComposerState.keepScreenOn)
@@ -413,17 +413,17 @@ private fun MessagesViewContent(
if (state.voiceMessageComposerState.showPermissionRationaleDialog) {
VoiceMessagePermissionRationaleDialog(
onContinue = {
state.voiceMessageComposerState.eventSink(VoiceMessageComposerEvents.AcceptPermissionRationale)
state.voiceMessageComposerState.eventSink(VoiceMessageComposerEvent.AcceptPermissionRationale)
},
onDismiss = {
state.voiceMessageComposerState.eventSink(VoiceMessageComposerEvents.DismissPermissionsRationale)
state.voiceMessageComposerState.eventSink(VoiceMessageComposerEvent.DismissPermissionsRationale)
},
appName = state.appName
)
}
if (state.voiceMessageComposerState.showSendFailureDialog) {
VoiceMessageSendingFailedDialog(
onDismiss = { state.voiceMessageComposerState.eventSink(VoiceMessageComposerEvents.DismissSendFailureDialog) },
onDismiss = { state.voiceMessageComposerState.eventSink(VoiceMessageComposerEvent.DismissSendFailureDialog) },
)
}

View File

@@ -18,7 +18,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerEvents
import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerEvent
import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerState
import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerStateProvider
import io.element.android.features.messages.api.timeline.voicemessages.composer.aVoiceMessageComposerState
@@ -78,19 +78,19 @@ internal fun MessageComposerView(
}
val onVoiceRecorderEvent = { press: VoiceMessageRecorderEvent ->
voiceMessageState.eventSink(VoiceMessageComposerEvents.RecorderEvent(press))
voiceMessageState.eventSink(VoiceMessageComposerEvent.RecorderEvent(press))
}
val onSendVoiceMessage = {
voiceMessageState.eventSink(VoiceMessageComposerEvents.SendVoiceMessage)
voiceMessageState.eventSink(VoiceMessageComposerEvent.SendVoiceMessage)
}
val onDeleteVoiceMessage = {
voiceMessageState.eventSink(VoiceMessageComposerEvents.DeleteVoiceMessage)
voiceMessageState.eventSink(VoiceMessageComposerEvent.DeleteVoiceMessage)
}
val onVoicePlayerEvent = { event: VoiceMessagePlayerEvent ->
voiceMessageState.eventSink(VoiceMessageComposerEvents.PlayerEvent(event))
voiceMessageState.eventSink(VoiceMessageComposerEvent.PlayerEvent(event))
}
TextComposer(

View File

@@ -65,6 +65,7 @@ import kotlinx.collections.immutable.persistentListOf
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
@@ -261,6 +262,7 @@ class TimelinePresenter(
items
}
.onEach(redactedVoiceMessageManager::onEachMatrixTimelineItem)
.flowOn(dispatchers.computation)
.launchIn(this)
}

View File

@@ -26,7 +26,7 @@ import dev.zacsweers.metro.AssistedInject
import dev.zacsweers.metro.ContributesBinding
import im.vector.app.features.analytics.plan.Composer
import io.element.android.features.messages.api.MessageComposerContext
import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerEvents
import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerEvent
import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerPresenter
import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerState
import io.element.android.libraries.di.RoomScope
@@ -164,25 +164,25 @@ class DefaultVoiceMessageComposerPresenter(
}
}
fun handleEvent(event: VoiceMessageComposerEvents) {
fun handleEvent(event: VoiceMessageComposerEvent) {
when (event) {
is VoiceMessageComposerEvents.RecorderEvent -> handleVoiceMessageRecorderEvent(event.recorderEvent)
is VoiceMessageComposerEvents.PlayerEvent -> handleVoiceMessagePlayerEvent(event.playerEvent)
is VoiceMessageComposerEvents.SendVoiceMessage -> localCoroutineScope.launch {
is VoiceMessageComposerEvent.RecorderEvent -> handleVoiceMessageRecorderEvent(event.recorderEvent)
is VoiceMessageComposerEvent.PlayerEvent -> handleVoiceMessagePlayerEvent(event.playerEvent)
is VoiceMessageComposerEvent.SendVoiceMessage -> localCoroutineScope.launch {
sendVoiceMessage()
}
VoiceMessageComposerEvents.DeleteVoiceMessage -> {
VoiceMessageComposerEvent.DeleteVoiceMessage -> {
player.pause()
localCoroutineScope.deleteRecording()
}
VoiceMessageComposerEvents.DismissPermissionsRationale -> {
VoiceMessageComposerEvent.DismissPermissionsRationale -> {
permissionState.eventSink(PermissionsEvents.CloseDialog)
}
VoiceMessageComposerEvents.AcceptPermissionRationale -> {
VoiceMessageComposerEvent.AcceptPermissionRationale -> {
permissionState.eventSink(PermissionsEvents.OpenSystemSettingAndCloseDialog)
}
is VoiceMessageComposerEvents.LifecycleEvent -> handleLifecycleEvent(event.event)
VoiceMessageComposerEvents.DismissSendFailureDialog -> {
is VoiceMessageComposerEvent.LifecycleEvent -> handleLifecycleEvent(event.event)
VoiceMessageComposerEvent.DismissSendFailureDialog -> {
showSendFailureDialog = false
}
}
@@ -192,7 +192,10 @@ class DefaultVoiceMessageComposerPresenter(
voiceMessageState = when (val state = recorderState) {
is VoiceRecorderState.Recording -> VoiceMessageState.Recording(
duration = state.elapsedTime,
levels = state.levels.toImmutableList(),
levels = state.levels
// Keep only the last 128 samples for display, else we can have a crash
.takeLast(128)
.toImmutableList(),
)
is VoiceRecorderState.Finished ->
previewState(

View File

@@ -42,6 +42,10 @@
<string name="screen_room_timeline_reactions_show_more">"نمایش بیش‌تر"</string>
<string name="screen_room_timeline_reactions_show_reactions_summary">"نمایش خلاصهٔ واکنش‌ها"</string>
<string name="screen_room_timeline_read_marker_title">"جدید"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="one">"%1$dتغییر اتاق"</item>
<item quantity="other">"%1$dتغییر اتاق"</item>
</plurals>
<string name="screen_room_timeline_tombstoned_room_action">"پرش به اتاق جدید"</string>
<string name="screen_room_timeline_tombstoned_room_message">"این اتاق جایگزین شده و دیگر فعّال نیست"</string>
<string name="screen_room_timeline_upgraded_room_action">"دیدن پیام‌های قدیمی"</string>

View File

@@ -7,6 +7,7 @@
<string name="emoji_picker_category_objects">"Oggetti"</string>
<string name="emoji_picker_category_people">"Faccine &amp; Persone"</string>
<string name="emoji_picker_category_places">"Viaggi &amp; Luoghi"</string>
<string name="emoji_picker_category_recent">"Emoji recenti"</string>
<string name="emoji_picker_category_symbols">"Simboli"</string>
<string name="screen_media_upload_preview_caption_warning">"Le didascalie potrebbero non essere visibili agli utenti di app meno recenti."</string>
<string name="screen_media_upload_preview_change_video_quality_prompt">"Tocca per modificare la qualità di caricamento del video"</string>
@@ -15,6 +16,7 @@
<string name="screen_media_upload_preview_error_failed_sending">"Caricamento del file multimediale fallito, riprova."</string>
<string name="screen_media_upload_preview_error_too_large_message">"La dimensione massima consentita del file è %1$s ."</string>
<string name="screen_media_upload_preview_error_too_large_title">"Il file è troppo grande per essere caricato"</string>
<string name="screen_media_upload_preview_item_count">"Elemento %1$d di %2$d"</string>
<string name="screen_media_upload_preview_optimize_image_quality_title">"Ottimizza la qualità delle immagini"</string>
<string name="screen_media_upload_preview_processing">"Elaborazione…"</string>
<string name="screen_report_content_block_user">"Blocca utente"</string>

View File

@@ -7,13 +7,18 @@
<string name="emoji_picker_category_objects">"Objetos"</string>
<string name="emoji_picker_category_people">"Sorrisos &amp; Pessoas"</string>
<string name="emoji_picker_category_places">"Viagens &amp; Lugares"</string>
<string name="emoji_picker_category_recent">"Emojis recentes"</string>
<string name="emoji_picker_category_symbols">"Símbolos"</string>
<string name="screen_media_upload_preview_caption_warning">"As legendas podem não ser visíveis para pessoas que usam apps mais antigos."</string>
<string name="screen_media_upload_preview_change_video_quality_prompt">"Toque para alterar a qualidade do envio do vídeo"</string>
<string name="screen_media_upload_preview_error_could_not_be_uploaded">"O arquivo não pôde ser enviado."</string>
<string name="screen_media_upload_preview_error_failed_processing">"Falha ao processar a mídia para o envio. Tente novamente."</string>
<string name="screen_media_upload_preview_error_failed_sending">"Falha ao enviar mídia. Tente novamente."</string>
<string name="screen_media_upload_preview_error_too_large_message">"O tamanho de arquivo máximo permitido é %1$s."</string>
<string name="screen_media_upload_preview_error_too_large_title">"O arquivo é muito grande para enviar"</string>
<string name="screen_media_upload_preview_item_count">"%1$d de %2$d itens"</string>
<string name="screen_media_upload_preview_optimize_image_quality_title">"Otimizar qualidade da imagem"</string>
<string name="screen_media_upload_preview_processing">"Processando…"</string>
<string name="screen_report_content_block_user">"Bloquear usuário"</string>
<string name="screen_report_content_block_user_hint">"Marque se você deseja ocultar todas as mensagens atuais e futuras desse usuário"</string>
<string name="screen_report_content_explanation">"Essa mensagem será reportada ao administrador do seu servidor-casa. Eles não conseguirão ler nenhuma mensagem criptografada."</string>

View File

@@ -8,8 +8,15 @@
<string name="emoji_picker_category_people">"Smayllar va odamlar"</string>
<string name="emoji_picker_category_places">"Sayohat va Joylar"</string>
<string name="emoji_picker_category_symbols">"Belgilar"</string>
<string name="screen_media_upload_preview_caption_warning">"Taglavhalar eski ilovalardan foydalanuvchilarga korinmasligi mumkin."</string>
<string name="screen_media_upload_preview_change_video_quality_prompt">"Video yuklash sifatini oʻzgartirish uchun bosing"</string>
<string name="screen_media_upload_preview_error_could_not_be_uploaded">"Faylni yuklab boʻlmadi."</string>
<string name="screen_media_upload_preview_error_failed_processing">"Mediani yuklab bolmadi, qayta urinib koring."</string>
<string name="screen_media_upload_preview_error_failed_sending">"Media yuklanmadi, qayta urinib koring."</string>
<string name="screen_media_upload_preview_error_too_large_message">"Ruxsat etilgan maksimal fayl hajmi %1$s ."</string>
<string name="screen_media_upload_preview_error_too_large_title">"Fayl yuklash uchun juda katta"</string>
<string name="screen_media_upload_preview_optimize_image_quality_title">"Tasvir sifatini optimallashtirish"</string>
<string name="screen_media_upload_preview_processing">"Qayta ishlanmoqda…"</string>
<string name="screen_report_content_block_user">"Foydalanuvchini bloklash"</string>
<string name="screen_report_content_block_user_hint">"Ushbu foydalanuvchidan barcha joriy va kelajakdagi xabarlarni yashirishni xohlayotganingizni tekshiring"</string>
<string name="screen_report_content_explanation">"Bu xabar uy serveringiz administratoriga xabar qilinadi. Ular hech qanday shifrlangan xabarlarni o\'qiy olmaydi."</string>
@@ -33,16 +40,31 @@
<string name="screen_room_timeline_add_reaction">"Emoji qo\'shmoq"</string>
<string name="screen_room_timeline_beginning_of_room">"Bu %1$sni boshlanishi"</string>
<string name="screen_room_timeline_beginning_of_room_no_name">"Bu suhbatning boshlanishi."</string>
<string name="screen_room_timeline_legacy_call">"Chaqiruv qabul qilinmaydi. Chaqiruvchidan yangi Element X ilovasidan foydalanishi mumkinligini sorang."</string>
<string name="screen_room_timeline_less_reactions">"Kamroq ko\'rsatish"</string>
<string name="screen_room_timeline_message_copied">"Xabar nusxalandi"</string>
<string name="screen_room_timeline_no_permission_to_post">"Sizda bu xonaga post yozishga ruxsat yoq"</string>
<plurals name="screen_room_timeline_reaction_a11y">
<item quantity="one">"%1$d ta azo %2$s bilan munosabat bildirdi"</item>
<item quantity="other">"%1$d ta azo %2$s bilan munosabat bildirdi"</item>
</plurals>
<plurals name="screen_room_timeline_reaction_including_you_a11y">
<item quantity="one">"Siz va %1$d ta azo %2$s bilan munosabat bildirdi"</item>
<item quantity="other">"Siz va %1$d ta azo %2$s bilan munosabat bildirdi"</item>
</plurals>
<string name="screen_room_timeline_reaction_you_a11y">"%1$s bilan munosabat bildirdingiz"</string>
<string name="screen_room_timeline_reactions_show_less">"Kamroq ko\'rsatish"</string>
<string name="screen_room_timeline_reactions_show_more">"Ko\'proq ko\'rsatish"</string>
<string name="screen_room_timeline_reactions_show_reactions_summary">"Reaksiyalar xulosasini chiqarish"</string>
<string name="screen_room_timeline_read_marker_title">"Yangi"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="one">"%1$dxonani almashtirish"</item>
<item quantity="other">"%1$dxona o\'zgarishi"</item>
</plurals>
<string name="screen_room_timeline_tombstoned_room_action">"Yangi xonaga otish"</string>
<string name="screen_room_timeline_tombstoned_room_message">"Bu room almashtirildi va endi faol emas"</string>
<string name="screen_room_timeline_upgraded_room_action">"Eski xabarlarni korish"</string>
<string name="screen_room_timeline_upgraded_room_message">"Bu xona boshqa xonaning davomi"</string>
<plurals name="screen_room_typing_many_members">
<item quantity="one">"%1$s, %2$s va %3$d boshqalar"</item>
<item quantity="other">"%1$s, %2$s va %3$d boshqalar"</item>

View File

@@ -12,13 +12,10 @@ package io.element.android.features.messages.impl.voicemessages.composer
import android.Manifest
import androidx.lifecycle.Lifecycle
import app.cash.molecule.RecompositionMode
import app.cash.molecule.moleculeFlow
import app.cash.turbine.TurbineTestContext
import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat
import im.vector.app.features.analytics.plan.Composer
import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerEvents
import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerEvent
import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerState
import io.element.android.features.messages.impl.messagecomposer.aReplyMode
import io.element.android.features.messages.test.FakeMessageComposerContext
@@ -42,10 +39,12 @@ import io.element.android.libraries.textcomposer.model.VoiceMessagePlayerEvent
import io.element.android.libraries.textcomposer.model.VoiceMessageRecorderEvent
import io.element.android.libraries.textcomposer.model.VoiceMessageState
import io.element.android.libraries.voiceplayer.api.VoiceMessageException
import io.element.android.libraries.voicerecorder.api.VoiceRecorder
import io.element.android.libraries.voicerecorder.test.FakeVoiceRecorder
import io.element.android.services.analytics.test.FakeAnalyticsService
import io.element.android.tests.testutils.WarmUpRule
import io.element.android.tests.testutils.lambda.lambdaRecorder
import io.element.android.tests.testutils.test
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestScope
@@ -57,7 +56,7 @@ import java.io.File
import kotlin.time.Duration
import kotlin.time.Duration.Companion.seconds
class VoiceMessageComposerPresenterTest {
class DefaultVoiceMessageComposerPresenterTest {
@get:Rule
val warmUpRule = WarmUpRule()
@@ -91,9 +90,7 @@ class VoiceMessageComposerPresenterTest {
@Test
fun `present - initial state`() = runTest {
val presenter = createDefaultVoiceMessageComposerPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
presenter.test {
val initialState = awaitItem()
assertThat(initialState.voiceMessageState).isEqualTo(VoiceMessageState.Idle)
voiceRecorder.assertCalls(started = 0)
@@ -105,10 +102,8 @@ class VoiceMessageComposerPresenterTest {
@Test
fun `present - recording state`() = runTest {
val presenter = createDefaultVoiceMessageComposerPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
presenter.test {
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
val finalState = awaitItem()
assertThat(finalState.voiceMessageState).isEqualTo(RECORDING_STATE)
@@ -118,20 +113,42 @@ class VoiceMessageComposerPresenterTest {
}
}
@Test
fun `present - recording state - number of levels is limited`() = runTest {
val numberOfLevels = 200
val levels = List(numberOfLevels) { it / numberOfLevels.toFloat() }
val voiceRecorder = FakeVoiceRecorder(
levels = levels,
recordingDuration = RECORDING_DURATION,
)
val presenter = createDefaultVoiceMessageComposerPresenter(
voiceRecorder = voiceRecorder,
)
presenter.test {
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
skipItems(numberOfLevels / 2 - 1)
val finalState = awaitItem()
assertThat(finalState.voiceMessageState).isInstanceOf(VoiceMessageState.Recording::class.java)
val recordingState = finalState.voiceMessageState as VoiceMessageState.Recording
// The number of levels should be limited to 128 items
assertThat(recordingState.levels.size).isEqualTo(128)
assertThat(recordingState.levels).isEqualTo(levels.takeLast(128))
testPauseAndDestroy(finalState)
}
}
@Test
fun `present - recording keeps screen on`() = runTest {
val presenter = createDefaultVoiceMessageComposerPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
presenter.test {
awaitItem().apply {
eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
assertThat(keepScreenOn).isFalse()
}
awaitItem().apply {
assertThat(keepScreenOn).isTrue()
eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Stop))
eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Stop))
}
val finalState = awaitItem().apply {
@@ -145,11 +162,9 @@ class VoiceMessageComposerPresenterTest {
@Test
fun `present - abort recording`() = runTest {
val presenter = createDefaultVoiceMessageComposerPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Cancel))
presenter.test {
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Cancel))
val finalState = awaitItem()
assertThat(finalState.voiceMessageState).isEqualTo(VoiceMessageState.Idle)
voiceRecorder.assertCalls(started = 1, stopped = 1, deleted = 1)
@@ -160,11 +175,9 @@ class VoiceMessageComposerPresenterTest {
@Test
fun `present - finish recording`() = runTest {
val presenter = createDefaultVoiceMessageComposerPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Stop))
presenter.test {
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Stop))
val finalState = awaitItem()
assertThat(finalState.voiceMessageState).isEqualTo(aPreviewState())
@@ -177,12 +190,10 @@ class VoiceMessageComposerPresenterTest {
@Test
fun `present - play recording before it is ready`() = runTest {
val presenter = createDefaultVoiceMessageComposerPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
presenter.test {
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
val finalState = awaitItem().apply {
this.eventSink(VoiceMessageComposerEvents.PlayerEvent(VoiceMessagePlayerEvent.Play))
this.eventSink(VoiceMessageComposerEvent.PlayerEvent(VoiceMessagePlayerEvent.Play))
}
// Nothing should happen
@@ -196,12 +207,10 @@ class VoiceMessageComposerPresenterTest {
@Test
fun `present - play recording`() = runTest {
val presenter = createDefaultVoiceMessageComposerPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().eventSink(VoiceMessageComposerEvents.PlayerEvent(VoiceMessagePlayerEvent.Play))
presenter.test {
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().eventSink(VoiceMessageComposerEvent.PlayerEvent(VoiceMessagePlayerEvent.Play))
val finalState = awaitItem().also {
assertThat(it.voiceMessageState).isEqualTo(aPlayingState())
}
@@ -214,13 +223,11 @@ class VoiceMessageComposerPresenterTest {
@Test
fun `present - pause recording`() = runTest {
val presenter = createDefaultVoiceMessageComposerPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().eventSink(VoiceMessageComposerEvents.PlayerEvent(VoiceMessagePlayerEvent.Play))
awaitItem().eventSink(VoiceMessageComposerEvents.PlayerEvent(VoiceMessagePlayerEvent.Pause))
presenter.test {
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().eventSink(VoiceMessageComposerEvent.PlayerEvent(VoiceMessagePlayerEvent.Play))
awaitItem().eventSink(VoiceMessageComposerEvent.PlayerEvent(VoiceMessagePlayerEvent.Pause))
val finalState = awaitItem().also {
assertThat(it.voiceMessageState).isEqualTo(aPausedState())
}
@@ -233,18 +240,16 @@ class VoiceMessageComposerPresenterTest {
@Test
fun `present - seek recording`() = runTest {
val presenter = createDefaultVoiceMessageComposerPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().eventSink(VoiceMessageComposerEvents.PlayerEvent(VoiceMessagePlayerEvent.Seek(0.5f)))
presenter.test {
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().eventSink(VoiceMessageComposerEvent.PlayerEvent(VoiceMessagePlayerEvent.Seek(0.5f)))
awaitItem().apply {
assertThat(voiceMessageState).isEqualTo(aPreviewState(playbackProgress = 0.5f, time = 0.seconds, showCursor = true))
}
awaitItem().apply {
assertThat(voiceMessageState).isEqualTo(aPreviewState(playbackProgress = 0.5f, time = 5.seconds, showCursor = true))
eventSink(VoiceMessageComposerEvents.PlayerEvent(VoiceMessagePlayerEvent.Seek(0.2f)))
eventSink(VoiceMessageComposerEvent.PlayerEvent(VoiceMessagePlayerEvent.Seek(0.2f)))
}
awaitItem().apply {
assertThat(voiceMessageState).isEqualTo(aPreviewState(playbackProgress = 0.2f, time = 5.seconds, showCursor = true))
@@ -260,12 +265,10 @@ class VoiceMessageComposerPresenterTest {
@Test
fun `present - delete recording`() = runTest {
val presenter = createDefaultVoiceMessageComposerPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().eventSink(VoiceMessageComposerEvents.DeleteVoiceMessage)
presenter.test {
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().eventSink(VoiceMessageComposerEvent.DeleteVoiceMessage)
val finalState = awaitItem()
assertThat(finalState.voiceMessageState).isEqualTo(VoiceMessageState.Idle)
@@ -278,13 +281,11 @@ class VoiceMessageComposerPresenterTest {
@Test
fun `present - delete while playing`() = runTest {
val presenter = createDefaultVoiceMessageComposerPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().eventSink(VoiceMessageComposerEvents.PlayerEvent(VoiceMessagePlayerEvent.Play))
awaitItem().eventSink(VoiceMessageComposerEvents.DeleteVoiceMessage)
presenter.test {
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().eventSink(VoiceMessageComposerEvent.PlayerEvent(VoiceMessagePlayerEvent.Play))
awaitItem().eventSink(VoiceMessageComposerEvent.DeleteVoiceMessage)
awaitItem().apply {
assertThat(voiceMessageState).isEqualTo(aPausedState())
}
@@ -300,12 +301,10 @@ class VoiceMessageComposerPresenterTest {
@Test
fun `present - send recording`() = runTest {
val presenter = createDefaultVoiceMessageComposerPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().eventSink(VoiceMessageComposerEvents.SendVoiceMessage)
presenter.test {
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().eventSink(VoiceMessageComposerEvent.SendVoiceMessage)
assertThat(awaitItem().voiceMessageState).isEqualTo(aPreviewState().toSendingState())
val finalState = awaitItem()
assertThat(finalState.voiceMessageState).isEqualTo(VoiceMessageState.Idle)
@@ -319,21 +318,19 @@ class VoiceMessageComposerPresenterTest {
@Test
fun `present - sending is tracked`() = runTest {
val presenter = createDefaultVoiceMessageComposerPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
presenter.test {
// Send a normal voice message
messageComposerContext.composerMode = MessageComposerMode.Normal
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().eventSink(VoiceMessageComposerEvents.SendVoiceMessage)
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().eventSink(VoiceMessageComposerEvent.SendVoiceMessage)
skipItems(1) // Sending state
advanceUntilIdle()
// Now reply with a voice message
messageComposerContext.composerMode = aReplyMode()
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().eventSink(VoiceMessageComposerEvents.SendVoiceMessage)
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().eventSink(VoiceMessageComposerEvent.SendVoiceMessage)
val finalState = awaitItem() // Sending state
assertThat(analyticsService.capturedEvents).containsExactly(
@@ -348,13 +345,11 @@ class VoiceMessageComposerPresenterTest {
@Test
fun `present - send while playing`() = runTest {
val presenter = createDefaultVoiceMessageComposerPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().eventSink(VoiceMessageComposerEvents.PlayerEvent(VoiceMessagePlayerEvent.Play))
awaitItem().eventSink(VoiceMessageComposerEvents.SendVoiceMessage)
presenter.test {
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().eventSink(VoiceMessageComposerEvent.PlayerEvent(VoiceMessagePlayerEvent.Play))
awaitItem().eventSink(VoiceMessageComposerEvent.SendVoiceMessage)
assertThat(awaitItem().voiceMessageState).isEqualTo(aPlayingState().toSendingState())
skipItems(1) // Duplicate sending state
@@ -370,14 +365,12 @@ class VoiceMessageComposerPresenterTest {
@Test
fun `present - send recording before previous completed, waits`() = runTest {
val presenter = createDefaultVoiceMessageComposerPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Stop))
presenter.test {
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().run {
eventSink(VoiceMessageComposerEvents.SendVoiceMessage)
eventSink(VoiceMessageComposerEvents.SendVoiceMessage)
eventSink(VoiceMessageComposerEvent.SendVoiceMessage)
eventSink(VoiceMessageComposerEvent.SendVoiceMessage)
}
assertThat(awaitItem().voiceMessageState).isEqualTo(aPreviewState().toSendingState())
@@ -395,14 +388,12 @@ class VoiceMessageComposerPresenterTest {
// Let sending fail due to media preprocessing error
mediaPreProcessor.givenResult(Result.failure(Exception()))
val presenter = createDefaultVoiceMessageComposerPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Stop))
presenter.test {
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().apply {
assertThat(voiceMessageState).isEqualTo(aPreviewState())
eventSink(VoiceMessageComposerEvents.SendVoiceMessage)
eventSink(VoiceMessageComposerEvent.SendVoiceMessage)
}
val finalState = awaitItem()
@@ -419,15 +410,13 @@ class VoiceMessageComposerPresenterTest {
fun `present - send failures can be retried`() = runTest {
// Let sending fail due to media preprocessing error
val presenter = createDefaultVoiceMessageComposerPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
presenter.test {
mediaPreProcessor.givenResult(Result.failure(Exception()))
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Stop))
val previewState = awaitItem()
previewState.eventSink(VoiceMessageComposerEvents.SendVoiceMessage)
previewState.eventSink(VoiceMessageComposerEvent.SendVoiceMessage)
assertThat(awaitItem().voiceMessageState).isEqualTo(aPreviewState().toSendingState())
ensureAllEventsConsumed()
@@ -435,7 +424,7 @@ class VoiceMessageComposerPresenterTest {
sendVoiceMessageResult.assertions().isNeverCalled()
mediaPreProcessor.givenAudioResult()
previewState.eventSink(VoiceMessageComposerEvents.SendVoiceMessage)
previewState.eventSink(VoiceMessageComposerEvent.SendVoiceMessage)
val finalState = awaitItem()
assertThat(finalState.voiceMessageState).isEqualTo(VoiceMessageState.Idle)
sendVoiceMessageResult.assertions().isCalledOnce()
@@ -448,14 +437,12 @@ class VoiceMessageComposerPresenterTest {
@Test
fun `present - send failures are displayed as an error dialog`() = runTest {
val presenter = createDefaultVoiceMessageComposerPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
presenter.test {
// Let sending fail due to media preprocessing error
mediaPreProcessor.givenResult(Result.failure(Exception()))
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().eventSink(VoiceMessageComposerEvents.SendVoiceMessage)
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Stop))
awaitItem().eventSink(VoiceMessageComposerEvent.SendVoiceMessage)
assertThat(awaitItem().voiceMessageState).isEqualTo(aPreviewState().toSendingState())
@@ -467,7 +454,7 @@ class VoiceMessageComposerPresenterTest {
awaitItem().apply {
assertThat(voiceMessageState).isEqualTo(aPreviewState())
assertThat(showSendFailureDialog).isTrue()
eventSink(VoiceMessageComposerEvents.DismissSendFailureDialog)
eventSink(VoiceMessageComposerEvent.DismissSendFailureDialog)
}
val finalState = awaitItem().apply {
@@ -483,12 +470,10 @@ class VoiceMessageComposerPresenterTest {
@Test
fun `present - send error - missing recording is tracked`() = runTest {
val presenter = createDefaultVoiceMessageComposerPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
presenter.test {
val initialState = awaitItem()
// Send the message before recording anything
initialState.eventSink(VoiceMessageComposerEvents.SendVoiceMessage)
initialState.eventSink(VoiceMessageComposerEvent.SendVoiceMessage)
assertThat(initialState.voiceMessageState).isEqualTo(VoiceMessageState.Idle)
sendVoiceMessageResult.assertions().isNeverCalled()
@@ -504,11 +489,9 @@ class VoiceMessageComposerPresenterTest {
val exception = SecurityException("")
voiceRecorder.givenThrowsSecurityException(exception)
val presenter = createDefaultVoiceMessageComposerPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
presenter.test {
val initialState = awaitItem()
initialState.eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
initialState.eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
sendVoiceMessageResult.assertions().isNeverCalled()
assertThat(analyticsService.trackedErrors).containsExactly(
@@ -528,19 +511,17 @@ class VoiceMessageComposerPresenterTest {
val presenter = createDefaultVoiceMessageComposerPresenter(
permissionsPresenter = permissionsPresenter,
)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
presenter.test {
val initialState = awaitItem()
initialState.eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
initialState.eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
assertThat(awaitItem().voiceMessageState).isEqualTo(VoiceMessageState.Idle)
initialState.eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Stop))
initialState.eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Stop))
voiceRecorder.assertCalls(stopped = 1)
permissionsPresenter.setPermissionGranted()
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
val finalState = awaitItem()
assertThat(finalState.voiceMessageState).isEqualTo(RECORDING_STATE)
voiceRecorder.assertCalls(stopped = 1, started = 1)
@@ -557,16 +538,14 @@ class VoiceMessageComposerPresenterTest {
val presenter = createDefaultVoiceMessageComposerPresenter(
permissionsPresenter = permissionsPresenter,
)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
presenter.test {
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
// See the dialog and accept it
awaitItem().also {
assertThat(it.voiceMessageState).isEqualTo(VoiceMessageState.Idle)
assertThat(it.showPermissionRationaleDialog).isTrue()
it.eventSink(VoiceMessageComposerEvents.AcceptPermissionRationale)
it.eventSink(VoiceMessageComposerEvent.AcceptPermissionRationale)
}
// Dialog is hidden, user accepts permissions
@@ -574,7 +553,7 @@ class VoiceMessageComposerPresenterTest {
permissionsPresenter.setPermissionGranted()
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
val finalState = awaitItem()
assertThat(finalState.voiceMessageState).isEqualTo(RECORDING_STATE)
voiceRecorder.assertCalls(started = 1)
@@ -591,22 +570,20 @@ class VoiceMessageComposerPresenterTest {
val presenter = createDefaultVoiceMessageComposerPresenter(
permissionsPresenter = permissionsPresenter,
)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
awaitItem().eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
presenter.test {
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
// See the dialog and accept it
awaitItem().also {
assertThat(it.voiceMessageState).isEqualTo(VoiceMessageState.Idle)
assertThat(it.showPermissionRationaleDialog).isTrue()
it.eventSink(VoiceMessageComposerEvents.DismissPermissionsRationale)
it.eventSink(VoiceMessageComposerEvent.DismissPermissionsRationale)
}
// Dialog is hidden, user tries to record again
awaitItem().also {
assertThat(it.showPermissionRationaleDialog).isFalse()
it.eventSink(VoiceMessageComposerEvents.RecorderEvent(VoiceMessageRecorderEvent.Start))
it.eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start))
}
// Dialog is shown once again
@@ -624,7 +601,7 @@ class VoiceMessageComposerPresenterTest {
mostRecentState: VoiceMessageComposerState,
) {
mostRecentState.eventSink(
VoiceMessageComposerEvents.LifecycleEvent(event = Lifecycle.Event.ON_PAUSE)
VoiceMessageComposerEvent.LifecycleEvent(event = Lifecycle.Event.ON_PAUSE)
)
val onPauseState = when (val state = mostRecentState.voiceMessageState) {
@@ -645,7 +622,7 @@ class VoiceMessageComposerPresenterTest {
}
onPauseState.eventSink(
VoiceMessageComposerEvents.LifecycleEvent(event = Lifecycle.Event.ON_DESTROY)
VoiceMessageComposerEvent.LifecycleEvent(event = Lifecycle.Event.ON_DESTROY)
)
when (val state = onPauseState.voiceMessageState) {
@@ -662,6 +639,7 @@ class VoiceMessageComposerPresenterTest {
private fun TestScope.createDefaultVoiceMessageComposerPresenter(
permissionsPresenter: PermissionsPresenter = createFakePermissionsPresenter(),
voiceRecorder: VoiceRecorder = this@DefaultVoiceMessageComposerPresenterTest.voiceRecorder,
): DefaultVoiceMessageComposerPresenter {
return DefaultVoiceMessageComposerPresenter(
sessionCoroutineScope = backgroundScope,

View File

@@ -1,5 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<plurals name="a11y_polls_percent_of_total">
<item quantity="one">"Jami ovozlarning %1$d foizi"</item>
<item quantity="other">"Jami ovozlarning %1$d foizi"</item>
</plurals>
<string name="a11y_polls_will_remove_selection">"Oldingi tanlov olib tashlanadi"</string>
<string name="a11y_polls_winning_answer">"Bu g\'alaba qozongan javob"</string>
</resources>

View File

@@ -5,6 +5,7 @@
<string name="screen_create_poll_anonymous_headline">"Ovozlarni yashirish"</string>
<string name="screen_create_poll_answer_hint">"Variant%1$d"</string>
<string name="screen_create_poll_cancel_confirmation_content_android">"Oʻzgarishlar saqlanmadi. Haqiqatan ham orqaga qaytmoqchimisiz?"</string>
<string name="screen_create_poll_delete_option_a11y">"%1$s variantini ochirish"</string>
<string name="screen_create_poll_question_desc">"Savol yoki mavzu"</string>
<string name="screen_create_poll_question_hint">"So\'rovnoma nima haqida?"</string>
<string name="screen_create_poll_title">"Sorovnoma yaratish"</string>

View File

@@ -10,6 +10,7 @@
<string name="screen_advanced_settings_element_call_base_url_validation_error">"URL non valido, assicurati di includere il protocollo (http/https) e l\'indirizzo corretto."</string>
<string name="screen_advanced_settings_hide_invite_avatars_toggle_title">"Nascondi gli avatar nelle richieste di invito alle stanze"</string>
<string name="screen_advanced_settings_hide_timeline_media_toggle_title">"Nascondi le anteprime dei media nelle conversazioni"</string>
<string name="screen_advanced_settings_labs">"Labs"</string>
<string name="screen_advanced_settings_media_compression_description">"Carica foto e video più velocemente e riduci l\'utilizzo dei dati"</string>
<string name="screen_advanced_settings_media_compression_title">"Ottimizza la qualità dei contenuti multimediali"</string>
<string name="screen_advanced_settings_moderation_and_safety_section_title">"Moderazione e Sicurezza"</string>
@@ -43,6 +44,11 @@
<string name="screen_edit_profile_error_title">"Impossibile aggiornare il profilo"</string>
<string name="screen_edit_profile_title">"Modifica profilo"</string>
<string name="screen_edit_profile_updating_details">"Aggiornamento del profilo…"</string>
<string name="screen_labs_enable_threads">"Abilita le risposte alle discussioni"</string>
<string name="screen_labs_enable_threads_description">"L\'app si riavvierà per applicare questa modifica."</string>
<string name="screen_labs_header_description">"Prova le nostre ultime idee in fase di sviluppo. Queste funzionalità non sono definitive; potrebbero essere instabili e soggette a modifiche."</string>
<string name="screen_labs_header_title">"Hai voglia di sperimentare?"</string>
<string name="screen_labs_title">"Labs"</string>
<string name="screen_notification_settings_additional_settings_section_title">"Impostazioni aggiuntive"</string>
<string name="screen_notification_settings_calls_label">"Chiamate audio e video"</string>
<string name="screen_notification_settings_configuration_mismatch">"Mancata corrispondenza di configurazione"</string>

View File

@@ -10,9 +10,17 @@
<string name="screen_advanced_settings_element_call_base_url_validation_error">"URL inválida, por favor verifique se o protocolo (http/https) está incluso e o endereço correto."</string>
<string name="screen_advanced_settings_hide_invite_avatars_toggle_title">"Ocultar avatares em solicitações de convite para salas"</string>
<string name="screen_advanced_settings_hide_timeline_media_toggle_title">"Ocultar pré-visualizações de mídia na linha do tempo"</string>
<string name="screen_advanced_settings_labs">"Experimentos"</string>
<string name="screen_advanced_settings_media_compression_description">"Envie fotos e vídeos com mais rapidez e reduza o uso de dados"</string>
<string name="screen_advanced_settings_media_compression_title">"Otimizar a qualidade da mídia"</string>
<string name="screen_advanced_settings_moderation_and_safety_section_title">"Moderação e segurança"</string>
<string name="screen_advanced_settings_optimise_image_upload_quality_description">"Otimizar automaticamente as imagens para envios mais rápidos e arquivos com tamanhos menores."</string>
<string name="screen_advanced_settings_optimise_image_upload_quality_title">"Otimizar qualidade de envio de imagens"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_description">"%1$s. Toque aqui para alterar."</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_high">"Alta (1080p)"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_low">"Baixa (480p)"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_standard">"Normal (720p)"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_title">"Qualidade de envio de vídeos"</string>
<string name="screen_advanced_settings_push_provider_android">"Provedor de notificações push"</string>
<string name="screen_advanced_settings_rich_text_editor_description">"Desative o editor de rich text para digitar Markdown manualmente."</string>
<string name="screen_advanced_settings_send_read_receipts">"Confirmações de leitura"</string>
@@ -36,6 +44,11 @@
<string name="screen_edit_profile_error_title">"Não foi possível atualizar o perfil"</string>
<string name="screen_edit_profile_title">"Editar perfil"</string>
<string name="screen_edit_profile_updating_details">"Atualizando o perfil…"</string>
<string name="screen_labs_enable_threads">"Ativar respostas de tópicos"</string>
<string name="screen_labs_enable_threads_description">"O app será reiniciado para aplicar esta mudança."</string>
<string name="screen_labs_header_description">"Teste as nossas mais novas ideias em desenvolvimento. Esses recursos não estão finalizados; podem estar instáveis, e podem mudar."</string>
<string name="screen_labs_header_title">"Se sentindo experimental?"</string>
<string name="screen_labs_title">"Experimentos"</string>
<string name="screen_notification_settings_additional_settings_section_title">"Configurações adicionais"</string>
<string name="screen_notification_settings_calls_label">"Chamadas de áudio e vídeo"</string>
<string name="screen_notification_settings_configuration_mismatch">"Não correspondência de configuração"</string>

View File

@@ -8,14 +8,29 @@
<string name="screen_advanced_settings_element_call_base_url">"Maxsus element qongiroqlar bazasi URL manzili"</string>
<string name="screen_advanced_settings_element_call_base_url_description">"Element qo\'ng\'irog\'iga maxsus asosiy url or\'natish"</string>
<string name="screen_advanced_settings_element_call_base_url_validation_error">"URL notogri, iltimos, protokol (http/https) va togri manzilni kiritganingizga ishonch hosil qiling."</string>
<string name="screen_advanced_settings_hide_invite_avatars_toggle_title">"Xonaga taklif sorovlarida avatarlarni berkitish"</string>
<string name="screen_advanced_settings_hide_timeline_media_toggle_title">"Vaqt jadvalida mediaga razm solishlarni berkitish"</string>
<string name="screen_advanced_settings_media_compression_description">"Rasm va videolarni tezroq yuklang va trafik sarfini kamaytiring"</string>
<string name="screen_advanced_settings_media_compression_title">"Media sifatini yaxshilash"</string>
<string name="screen_advanced_settings_moderation_and_safety_section_title">"Moderatsiya va xavfsizlik"</string>
<string name="screen_advanced_settings_optimise_image_upload_quality_description">"Tezroq yuklash va kichikroq fayl hajmi uchun rasmlarni avtomatik optimallashtirish."</string>
<string name="screen_advanced_settings_optimise_image_upload_quality_title">"Rasm yuklash sifatini optimallashtirish"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_description">"%1$s. Oʻzgartirish uchun bu yerga bosing."</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_high">"Yuqori (1080p)"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_low">"Past (480p)"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_standard">"Standart (720p)"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_title">"Video yuklash sifati"</string>
<string name="screen_advanced_settings_push_provider_android">"Push bildirishnoma provayderi"</string>
<string name="screen_advanced_settings_rich_text_editor_description">"Boy matn muharriri o\'chiring Markdown bilan qo\'lda yozish uchun"</string>
<string name="screen_advanced_settings_send_read_receipts">"Kvitansiyalarni oʻqish"</string>
<string name="screen_advanced_settings_send_read_receipts_description">"Agar oʻchirib qoyilsa, sizning oʻqilganlik bildirishnomangiz hech kimga yuborilmaydi. Siz boshqa foydalanuvchilardan oʻqilganlik bildirishnomalarini olishda davom etasiz."</string>
<string name="screen_advanced_settings_share_presence">"Mavjudligini ulashish"</string>
<string name="screen_advanced_settings_share_presence_description">"Agar oʻchirib qoʻyilsa, siz oʻqilganlik haqidagi bildirishnomalarni yoki yozayotganingiz haqidagi xabarlarni yubora olmaysiz va qabul qila olmaysiz."</string>
<string name="screen_advanced_settings_show_media_timeline_always_hide">"Doim berkitilsin"</string>
<string name="screen_advanced_settings_show_media_timeline_always_show">"Har doim korsatish"</string>
<string name="screen_advanced_settings_show_media_timeline_private_rooms">"Shaxsiy xonalarda"</string>
<string name="screen_advanced_settings_show_media_timeline_subtitle">"Yashirin media har doim unga bosish orqali korsatilishi mumkin"</string>
<string name="screen_advanced_settings_show_media_timeline_title">"Vaqt jadvalida media korsatish"</string>
<string name="screen_advanced_settings_view_source_description">"Xabar manbasini vaqt jadvalida korish imkoniyatini yoqing."</string>
<string name="screen_blocked_users_empty">"Sizda bloklangan foydalanuvchi yoq"</string>
<string name="screen_blocked_users_unblock_alert_action">"Blokdan chiqarish"</string>
@@ -55,6 +70,7 @@ Davom ettirsangiz, baʼzi sozlamalaringiz oʻzgarishi mumkin."</string>
<string name="screen_notification_settings_system_notifications_action_required_content_link">"tizim sozlamalari"</string>
<string name="screen_notification_settings_system_notifications_turned_off">"Tizim bildirishnomalari o\'chirilgan"</string>
<string name="screen_notification_settings_title">"Bildirishnomalar"</string>
<string name="troubleshoot_notifications_entry_point_push_history_title">"Bildirishnoma tarixi"</string>
<string name="troubleshoot_notifications_entry_point_section">"Muammolarni bartaraf etish"</string>
<string name="troubleshoot_notifications_entry_point_title">"Bildirishnomalar bilan bogliq muammolarni bartaraf etish"</string>
</resources>

View File

@@ -44,6 +44,10 @@
<string name="screen_edit_profile_error_title">"无法更新个人资料"</string>
<string name="screen_edit_profile_title">"编辑个人资料"</string>
<string name="screen_edit_profile_updating_details">"更新个人资料……"</string>
<string name="screen_labs_enable_threads">"启用主题回复"</string>
<string name="screen_labs_enable_threads_description">"应用将重启以应用此更改。"</string>
<string name="screen_labs_header_description">"尝试我们最新的开发理念。这些功能尚未最终确定,可能不稳定,也可能会发生变化。"</string>
<string name="screen_labs_header_title">"想尝试新功能?"</string>
<string name="screen_labs_title">"实验室"</string>
<string name="screen_notification_settings_additional_settings_section_title">"更多设置"</string>
<string name="screen_notification_settings_calls_label">"音视频通话"</string>

View File

@@ -14,5 +14,7 @@
<string name="screen_bug_report_include_screenshot">"Invia istantanea schermo"</string>
<string name="screen_bug_report_logs_description">"Per verificare che le cose funzionino come previsto, i log verranno inviati con il tuo messaggio. Per inviare solo il tuo messaggio, disattiva questa impostazione."</string>
<string name="screen_bug_report_rash_logs_alert_title">"%1$s si è chiuso inaspettatamente l\'ultima volta che è stato usato. Vuoi condividere con noi un rapporto sull\'arresto anomalo?"</string>
<string name="screen_bug_report_send_notification_settings_description">"Se riscontri problemi con le notifiche, caricare le regole per le notifiche push può aiutarci a individuare la causa principale. Tieni presente che queste regole possono contenere informazioni private, come il tuo nome visualizzato o le parole chiave per cui ricevere notifiche."</string>
<string name="screen_bug_report_send_notification_settings_title">"Invia impostazioni di notifica"</string>
<string name="screen_bug_report_view_logs">"Visualizza i log"</string>
</resources>

View File

@@ -14,5 +14,7 @@
<string name="screen_bug_report_include_screenshot">"Enviar captura de tela"</string>
<string name="screen_bug_report_logs_description">"Os registros serão incluídos com sua mensagem para garantir que tudo esteja funcionando corretamente. Para enviar sua mensagem sem registros, desative essa configuração."</string>
<string name="screen_bug_report_rash_logs_alert_title">"%1$s falhou inesperadamente na última vez que foi usado. Gostaria de compartilhar um relatório de falhas conosco?"</string>
<string name="screen_bug_report_send_notification_settings_description">"Se estiver enfrentando problemas com as notificações, enviar as regras de notificações push pode ajudar-nos a descobrir o que está errado. Observe que as regras podem conter informações privadas, como o seu nome de exibição ou palavras chaves de notificação."</string>
<string name="screen_bug_report_send_notification_settings_title">"Enviar configurações de notificação"</string>
<string name="screen_bug_report_view_logs">"Ver registros"</string>
</resources>

View File

@@ -10,6 +10,7 @@
<string name="screen_bug_report_error_description_too_short">"Tavsif juda qisqa, nima boʻlganligi haqida batafsilroq maʼlumot bering. Rahmat!"</string>
<string name="screen_bug_report_include_crash_logs">"Buzilish jurnallarini yuboring"</string>
<string name="screen_bug_report_include_logs">"Jurnallarga ruxsat bering"</string>
<string name="screen_bug_report_include_logs_error">"Sizning jurnallaringiz juda katta, shuning uchun bu hisobotga kiritilmaydi, iltimos ularni bizga boshqa usulda yuboring."</string>
<string name="screen_bug_report_include_screenshot">"Ekran tasvirini yuboring"</string>
<string name="screen_bug_report_logs_description">"Har bir narsa to\'ri ishlayotganiga ishonch hosil qilish uchun xabaringizga jurnallar kiritiladi. Xabarni jurnallarsiz yuborish uchun ushbu sozlamani oʻchiring."</string>
<string name="screen_bug_report_rash_logs_alert_title">"%1$soxirgi marta ishlatilganda qulab tushdi. Biz bilan nosozlik hisobotini baham ko\'rmoqchimisiz?"</string>

View File

@@ -1,4 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_report_room_leave_failed_alert_message">"Hisobotingiz muvaffaqiyatli yuborildi, ammo xonadan chiqishda muammo yuzaga keldi. Iltimos, qaytadan urinib koring."</string>
<string name="screen_report_room_leave_failed_alert_title">"Xonani tark etish imkonsiz"</string>
<string name="screen_report_room_reason_footer">"Bu xona haqida administratoringizga xabar bering. Agar xabarlar shifrlangan bolsa, administratoringiz ularni oqiy olmaydi."</string>
<string name="screen_report_room_reason_placeholder">"Xabar berish sababini tushuntiring…"</string>
<string name="screen_report_room_title">"Xona ustidan shikoyat qilish"</string>
</resources>

View File

@@ -1,14 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_room_change_permissions_administrators">"Pouze správci"</string>
<string name="screen_room_change_permissions_administrators">"Správce"</string>
<string name="screen_room_change_permissions_ban_people">"Vykázat lidi"</string>
<string name="screen_room_change_permissions_delete_messages">"Odstranit zprávy"</string>
<string name="screen_room_change_permissions_invite_people">"Pozvěte lidi a přijímejte žádosti o připojení"</string>
<string name="screen_room_change_permissions_everyone">"Člen"</string>
<string name="screen_room_change_permissions_invite_people">"Pozvat přátele"</string>
<string name="screen_room_change_permissions_member_moderation">"Spravovat členy"</string>
<string name="screen_room_change_permissions_messages_and_content">"Zprávy a obsah"</string>
<string name="screen_room_change_permissions_moderators">"Správci a moderátoři"</string>
<string name="screen_room_change_permissions_remove_people">"Odeberte lidi a odmítněte žádosti o připojení"</string>
<string name="screen_room_change_permissions_moderators">"Moderátor"</string>
<string name="screen_room_change_permissions_remove_people">"Odebrat osoby"</string>
<string name="screen_room_change_permissions_room_avatar">"Změnit avatar místnosti"</string>
<string name="screen_room_change_permissions_room_details">"Upravit místnost"</string>
<string name="screen_room_change_permissions_room_details">"Upravit podrobnosti"</string>
<string name="screen_room_change_permissions_room_name">"Změnit název místnosti"</string>
<string name="screen_room_change_permissions_room_topic">"Změnit téma místnosti"</string>
<string name="screen_room_change_permissions_send_messages">"Odeslat zprávy"</string>
@@ -32,6 +34,13 @@
<string name="screen_room_change_role_unsaved_changes_description">"Máte neuložené změny."</string>
<string name="screen_room_change_role_unsaved_changes_title">"Uložit změny?"</string>
<string name="screen_room_member_list_banned_empty">"V této místnosti nejsou žádní vykázaní uživatelé."</string>
<plurals name="screen_room_member_list_banned_header_title">
<item quantity="one">"%1$d vykázán(a)"</item>
<item quantity="few">"%1$d vykázáni"</item>
<item quantity="other">"%1$d vykázáných"</item>
</plurals>
<string name="screen_room_member_list_empty_search_subtitle">"Zkontrolujte pravopis nebo zkuste nové vyhledávání"</string>
<string name="screen_room_member_list_empty_search_title">"Žádné výsledky pro “%1$s”"</string>
<plurals name="screen_room_member_list_header_title">
<item quantity="one">"%1$d osoba"</item>
<item quantity="few">"%1$d osoby"</item>
@@ -44,8 +53,14 @@
<string name="screen_room_member_list_manage_member_unban_title">"Zrušit vykázání z místnosti"</string>
<string name="screen_room_member_list_mode_banned">"Vykázaní"</string>
<string name="screen_room_member_list_mode_members">"Členové"</string>
<string name="screen_room_member_list_role_administrator">"Pouze správci"</string>
<string name="screen_room_member_list_role_moderator">"Správci a moderátoři"</string>
<plurals name="screen_room_member_list_pending_header_title">
<item quantity="one">"%1$d pozván(a)"</item>
<item quantity="few">"%1$d pozváni"</item>
<item quantity="other">"%1$d pozvaných"</item>
</plurals>
<string name="screen_room_member_list_pending_status">"Čekající"</string>
<string name="screen_room_member_list_role_administrator">"Správce"</string>
<string name="screen_room_member_list_role_moderator">"Moderátor"</string>
<string name="screen_room_member_list_role_owner">"Vlastník"</string>
<string name="screen_room_member_list_room_members_header_title">"Členové místnosti"</string>
<string name="screen_room_member_list_unbanning_user">"Rušení vykázání %1$s"</string>
@@ -58,10 +73,12 @@
<string name="screen_room_roles_and_permissions_messages_and_content">"Zprávy a obsah"</string>
<string name="screen_room_roles_and_permissions_moderators">"Moderátoři"</string>
<string name="screen_room_roles_and_permissions_owners">"Vlastníci"</string>
<string name="screen_room_roles_and_permissions_permissions_header">"Oprávnění"</string>
<string name="screen_room_roles_and_permissions_reset">"Obnovit oprávnění"</string>
<string name="screen_room_roles_and_permissions_reset_confirm_description">"Po obnovení oprávnění ztratíte aktuální nastavení."</string>
<string name="screen_room_roles_and_permissions_reset_confirm_title">"Obnovit oprávnění?"</string>
<string name="screen_room_roles_and_permissions_roles_header">"Role"</string>
<string name="screen_room_roles_and_permissions_room_details">"Podrobnosti místnosti"</string>
<string name="screen_room_roles_and_permissions_title">"Role a oprávnění"</string>
<string name="screen_room_roles_and_permissions_space_details">"Detaily prostoru"</string>
<string name="screen_room_roles_and_permissions_title">"Role a oprávnění"</string>
</resources>

View File

@@ -33,6 +33,10 @@
<string name="screen_room_change_role_unsaved_changes_description">"تغییراتی ذخیره نشده دارید."</string>
<string name="screen_room_change_role_unsaved_changes_title">"ذخیرهٔ تغییرات؟"</string>
<string name="screen_room_member_list_banned_empty">"هیچ کاربر محرومی در این اتاق نیست."</string>
<plurals name="screen_room_member_list_header_title">
<item quantity="one">"%1$d نفر"</item>
<item quantity="other">"%1$d نفر"</item>
</plurals>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"برداشت و تحریم عضو"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"تنها برداشتن عضو"</string>
<string name="screen_room_member_list_manage_member_unban_action">"رفع انسداد"</string>

View File

@@ -1,14 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_room_change_permissions_administrators">"Vain ylläpitäjät"</string>
<string name="screen_room_change_permissions_administrators">"Ylläpitäjä"</string>
<string name="screen_room_change_permissions_ban_people">"Porttikieltojen antaminen"</string>
<string name="screen_room_change_permissions_delete_messages">"Viestien poistaminen"</string>
<string name="screen_room_change_permissions_everyone">"Jäsen"</string>
<string name="screen_room_change_permissions_invite_people">"Ihmisten kutsuminen ja liittymispyyntöjen hyväksyminen"</string>
<string name="screen_room_change_permissions_member_moderation">"Jäsenien hallinta"</string>
<string name="screen_room_change_permissions_messages_and_content">"Viestit ja sisältö"</string>
<string name="screen_room_change_permissions_moderators">"Ylläpitäjät ja valvojat"</string>
<string name="screen_room_change_permissions_moderators">"Valvoja"</string>
<string name="screen_room_change_permissions_remove_people">"Henkilöiden poistaminen ja liittymispyyntöjen hylkääminen"</string>
<string name="screen_room_change_permissions_room_avatar">"Huoneen avatarin vaihtaminen"</string>
<string name="screen_room_change_permissions_room_details">"Muokkaa huonetta"</string>
<string name="screen_room_change_permissions_room_details">"Muokkaa tietoja"</string>
<string name="screen_room_change_permissions_room_name">"Huoneen nimen vaihtaminen"</string>
<string name="screen_room_change_permissions_room_topic">"Huoneen aiheen vaihtaminen"</string>
<string name="screen_room_change_permissions_send_messages">"Viestien lähettäminen"</string>
@@ -31,7 +33,7 @@
<string name="screen_room_change_role_section_users">"Jäsenet"</string>
<string name="screen_room_change_role_unsaved_changes_description">"Sinulla on tallentamattomia muutoksia"</string>
<string name="screen_room_change_role_unsaved_changes_title">"Tallennetaanko muutokset?"</string>
<string name="screen_room_member_list_banned_empty">"Tässä huoneessa ei ole porttikieltoja"</string>
<string name="screen_room_member_list_banned_empty">"Porttikiellettyjä käyttäjiä ei ole."</string>
<plurals name="screen_room_member_list_header_title">
<item quantity="one">"%1$d henkilö"</item>
<item quantity="other">"%1$d henkilöä"</item>
@@ -43,8 +45,8 @@
<string name="screen_room_member_list_manage_member_unban_title">"Poista porttikielto huoneesta"</string>
<string name="screen_room_member_list_mode_banned">"Porttikiellot"</string>
<string name="screen_room_member_list_mode_members">"Jäsenet"</string>
<string name="screen_room_member_list_role_administrator">"Vain ylläpitäjät"</string>
<string name="screen_room_member_list_role_moderator">"Ylläpitäjät ja valvojat"</string>
<string name="screen_room_member_list_role_administrator">"Ylläpitäjä"</string>
<string name="screen_room_member_list_role_moderator">"Valvoja"</string>
<string name="screen_room_member_list_role_owner">"Omistaja"</string>
<string name="screen_room_member_list_room_members_header_title">"Huoneen jäsenet"</string>
<string name="screen_room_member_list_unbanning_user">"Poistetaan käyttäjän %1$s porttikieltoa"</string>
@@ -57,10 +59,12 @@
<string name="screen_room_roles_and_permissions_messages_and_content">"Viestit ja sisältö"</string>
<string name="screen_room_roles_and_permissions_moderators">"Valvojat"</string>
<string name="screen_room_roles_and_permissions_owners">"Omistajat"</string>
<string name="screen_room_roles_and_permissions_permissions_header">"Oikeudet"</string>
<string name="screen_room_roles_and_permissions_reset">"Nollaa oikeudet"</string>
<string name="screen_room_roles_and_permissions_reset_confirm_description">"Kun nollaat käyttöoikeudet, menetät nykyiset asetukset."</string>
<string name="screen_room_roles_and_permissions_reset_confirm_title">"Nollataanko oikeudet?"</string>
<string name="screen_room_roles_and_permissions_roles_header">"Roolit"</string>
<string name="screen_room_roles_and_permissions_room_details">"Huoneen tiedot"</string>
<string name="screen_room_roles_and_permissions_space_details">"Tilan tiedot"</string>
<string name="screen_room_roles_and_permissions_title">"Roolit ja oikeudet"</string>
</resources>

View File

@@ -34,9 +34,15 @@
<string name="screen_room_change_role_unsaved_changes_description">"Vous avez des modifications non-enregistrées."</string>
<string name="screen_room_change_role_unsaved_changes_title">"Enregistrer les changements ?"</string>
<string name="screen_room_member_list_banned_empty">"Il ny a pas dutilisateur banni."</string>
<plurals name="screen_room_member_list_banned_header_title">
<item quantity="one">"%1$d Banni(e)"</item>
<item quantity="other">"%1$d Banni(e)s"</item>
</plurals>
<string name="screen_room_member_list_empty_search_subtitle">"Vérifiez la saisie ou effectuez une nouvelle recherche"</string>
<string name="screen_room_member_list_empty_search_title">"Aucun résultat pour «%1$s»"</string>
<plurals name="screen_room_member_list_header_title">
<item quantity="one">"%1$d personne"</item>
<item quantity="other">"%1$d personnes"</item>
<item quantity="one">"%1$d Personne"</item>
<item quantity="other">"%1$d Personnes"</item>
</plurals>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Bannir du salon"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Retirer le membre uniquement"</string>
@@ -45,6 +51,11 @@
<string name="screen_room_member_list_manage_member_unban_title">"Débannir du salon"</string>
<string name="screen_room_member_list_mode_banned">"Bannis"</string>
<string name="screen_room_member_list_mode_members">"Membres"</string>
<plurals name="screen_room_member_list_pending_header_title">
<item quantity="one">"%1$d Invité(e)"</item>
<item quantity="other">"%1$d Invité(e)s"</item>
</plurals>
<string name="screen_room_member_list_pending_status">"En attente"</string>
<string name="screen_room_member_list_role_administrator">"Administrateurs"</string>
<string name="screen_room_member_list_role_moderator">"Modérateurs"</string>
<string name="screen_room_member_list_role_owner">"Propriétaire"</string>

View File

@@ -1,14 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_room_change_permissions_administrators">"Solo amministratori"</string>
<string name="screen_room_change_permissions_administrators">"Amministratore"</string>
<string name="screen_room_change_permissions_ban_people">"Escludi membri"</string>
<string name="screen_room_change_permissions_delete_messages">"Rimuovi messaggi"</string>
<string name="screen_room_change_permissions_invite_people">"Invita persone e accetta richieste di partecipazione"</string>
<string name="screen_room_change_permissions_everyone">"Membro"</string>
<string name="screen_room_change_permissions_invite_people">"Invita persone"</string>
<string name="screen_room_change_permissions_member_moderation">"Gestisci membri"</string>
<string name="screen_room_change_permissions_messages_and_content">"Messaggi e contenuti"</string>
<string name="screen_room_change_permissions_moderators">"Amministratori e moderatori"</string>
<string name="screen_room_change_permissions_remove_people">"Rimuovi le persone e rifiuta le richieste di partecipazione"</string>
<string name="screen_room_change_permissions_moderators">"Moderatore"</string>
<string name="screen_room_change_permissions_remove_people">"Rimuovi membri"</string>
<string name="screen_room_change_permissions_room_avatar">"Cambia avatar della stanza"</string>
<string name="screen_room_change_permissions_room_details">"Modifica stanza"</string>
<string name="screen_room_change_permissions_room_details">"Modifica dettagli"</string>
<string name="screen_room_change_permissions_room_name">"Cambia il nome della stanza"</string>
<string name="screen_room_change_permissions_room_topic">"Cambiare l\'argomento della stanza"</string>
<string name="screen_room_change_permissions_send_messages">"Inviare messaggi"</string>
@@ -31,10 +33,16 @@
<string name="screen_room_change_role_section_users">"Membri"</string>
<string name="screen_room_change_role_unsaved_changes_description">"Hai delle modifiche non salvate."</string>
<string name="screen_room_change_role_unsaved_changes_title">"Salvare le modifiche?"</string>
<string name="screen_room_member_list_banned_empty">"Non ci sono utenti esclusi in questa stanza."</string>
<string name="screen_room_member_list_banned_empty">"Non ci sono utenti bannati."</string>
<plurals name="screen_room_member_list_banned_header_title">
<item quantity="one">"%1$d Bannato"</item>
<item quantity="other">"%1$d Bannati"</item>
</plurals>
<string name="screen_room_member_list_empty_search_subtitle">"Controlla l\'ortografia o prova una nuova ricerca"</string>
<string name="screen_room_member_list_empty_search_title">"Nessun risultato per “%1$s ”"</string>
<plurals name="screen_room_member_list_header_title">
<item quantity="one">"%1$d persona"</item>
<item quantity="other">"%1$d persone"</item>
<item quantity="one">"%1$d Persona"</item>
<item quantity="other">"%1$d Persone"</item>
</plurals>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Rimuovi ed escludi"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Rimuovi soltanto"</string>
@@ -43,8 +51,13 @@
<string name="screen_room_member_list_manage_member_unban_title">"Riammetti nella stanza"</string>
<string name="screen_room_member_list_mode_banned">"Esclusi"</string>
<string name="screen_room_member_list_mode_members">"Membri"</string>
<string name="screen_room_member_list_role_administrator">"Solo amministratori"</string>
<string name="screen_room_member_list_role_moderator">"Amministratori e moderatori"</string>
<plurals name="screen_room_member_list_pending_header_title">
<item quantity="one">"%1$d Invitato"</item>
<item quantity="other">"%1$d Invitati"</item>
</plurals>
<string name="screen_room_member_list_pending_status">"In attesa"</string>
<string name="screen_room_member_list_role_administrator">"Amministratore"</string>
<string name="screen_room_member_list_role_moderator">"Moderatore"</string>
<string name="screen_room_member_list_role_owner">"Proprietario"</string>
<string name="screen_room_member_list_room_members_header_title">"Membri della stanza"</string>
<string name="screen_room_member_list_unbanning_user">"Riammissione di %1$s"</string>
@@ -57,10 +70,12 @@
<string name="screen_room_roles_and_permissions_messages_and_content">"Messaggi e contenuti"</string>
<string name="screen_room_roles_and_permissions_moderators">"Moderatori"</string>
<string name="screen_room_roles_and_permissions_owners">"Proprietari"</string>
<string name="screen_room_roles_and_permissions_permissions_header">"Autorizzazioni"</string>
<string name="screen_room_roles_and_permissions_reset">"Reimpostare le autorizzazioni"</string>
<string name="screen_room_roles_and_permissions_reset_confirm_description">"Una volta reimpostate le autorizzazioni, perderai le impostazioni correnti."</string>
<string name="screen_room_roles_and_permissions_reset_confirm_title">"Reimpostare autorizzazioni?"</string>
<string name="screen_room_roles_and_permissions_roles_header">"Ruoli"</string>
<string name="screen_room_roles_and_permissions_room_details">"Dettagli della stanza"</string>
<string name="screen_room_roles_and_permissions_space_details">"Dettagli dello spazio"</string>
<string name="screen_room_roles_and_permissions_title">"Ruoli e autorizzazioni"</string>
</resources>

View File

@@ -1,14 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_room_change_permissions_administrators">"Somente administradores"</string>
<string name="screen_room_change_permissions_administrators">"Administradores"</string>
<string name="screen_room_change_permissions_ban_people">"Banir pessoas"</string>
<string name="screen_room_change_permissions_delete_messages">"Remover mensagens"</string>
<string name="screen_room_change_permissions_invite_people">"Convide pessoas e aceite solicitações de entrada"</string>
<string name="screen_room_change_permissions_everyone">"Membro"</string>
<string name="screen_room_change_permissions_invite_people">"Convidar pessoas"</string>
<string name="screen_room_change_permissions_member_moderation">"Gerenciar membros"</string>
<string name="screen_room_change_permissions_messages_and_content">"Mensagens e conteúdo"</string>
<string name="screen_room_change_permissions_moderators">"Administradores e moderadores"</string>
<string name="screen_room_change_permissions_remove_people">"Remover pessoas e recusar solicitações de entrada"</string>
<string name="screen_room_change_permissions_moderators">"Moderador"</string>
<string name="screen_room_change_permissions_remove_people">"Remover pessoas"</string>
<string name="screen_room_change_permissions_room_avatar">"Alterar avatar da sala"</string>
<string name="screen_room_change_permissions_room_details">"Editar sala"</string>
<string name="screen_room_change_permissions_room_details">"Editar detalhes"</string>
<string name="screen_room_change_permissions_room_name">"Alterar nome da sala"</string>
<string name="screen_room_change_permissions_room_topic">"Alterar tópico da sala"</string>
<string name="screen_room_change_permissions_send_messages">"Enviar mensagens"</string>
@@ -31,7 +33,13 @@
<string name="screen_room_change_role_section_users">"Membros"</string>
<string name="screen_room_change_role_unsaved_changes_description">"Você tem alterações não salvas."</string>
<string name="screen_room_change_role_unsaved_changes_title">"Salvar alterações?"</string>
<string name="screen_room_member_list_banned_empty">"Não há usuários banidos nesta sala."</string>
<string name="screen_room_member_list_banned_empty">"Não há usuários banidos."</string>
<plurals name="screen_room_member_list_banned_header_title">
<item quantity="one">"%1$d banido"</item>
<item quantity="other">"%1$d banidos"</item>
</plurals>
<string name="screen_room_member_list_empty_search_subtitle">"Confira a ortografia ou tente uma nova busca"</string>
<string name="screen_room_member_list_empty_search_title">"Nenhum resultado para “%1$s”"</string>
<plurals name="screen_room_member_list_header_title">
<item quantity="one">"%1$d pessoa"</item>
<item quantity="other">"%1$d pessoas"</item>
@@ -43,8 +51,13 @@
<string name="screen_room_member_list_manage_member_unban_title">"Desbanir da sala"</string>
<string name="screen_room_member_list_mode_banned">"Banidos"</string>
<string name="screen_room_member_list_mode_members">"Membros"</string>
<string name="screen_room_member_list_role_administrator">"Somente administradores"</string>
<string name="screen_room_member_list_role_moderator">"Administradores e moderadores"</string>
<plurals name="screen_room_member_list_pending_header_title">
<item quantity="one">"%1$d convidado"</item>
<item quantity="other">"%1$d convidados"</item>
</plurals>
<string name="screen_room_member_list_pending_status">"Pendente"</string>
<string name="screen_room_member_list_role_administrator">"Administradores"</string>
<string name="screen_room_member_list_role_moderator">"Moderador"</string>
<string name="screen_room_member_list_role_owner">"Proprietário"</string>
<string name="screen_room_member_list_room_members_header_title">"Membros da sala"</string>
<string name="screen_room_member_list_unbanning_user">"Desbanindo %1$s"</string>
@@ -57,10 +70,12 @@
<string name="screen_room_roles_and_permissions_messages_and_content">"Mensagens e conteúdo"</string>
<string name="screen_room_roles_and_permissions_moderators">"Moderadores"</string>
<string name="screen_room_roles_and_permissions_owners">"Proprietários"</string>
<string name="screen_room_roles_and_permissions_permissions_header">"Permissões"</string>
<string name="screen_room_roles_and_permissions_reset">"Redefinir permissões"</string>
<string name="screen_room_roles_and_permissions_reset_confirm_description">"Depois de redefinir as permissões, você perderá as configurações atuais."</string>
<string name="screen_room_roles_and_permissions_reset_confirm_title">"Redefinir permissões?"</string>
<string name="screen_room_roles_and_permissions_roles_header">"Cargos"</string>
<string name="screen_room_roles_and_permissions_room_details">"Detalhes da sala"</string>
<string name="screen_room_roles_and_permissions_space_details">"Detalhes do espaço"</string>
<string name="screen_room_roles_and_permissions_title">"Cargos e permissões"</string>
</resources>

View File

@@ -15,13 +15,17 @@
<string name="screen_room_change_role_administrators_title">"Administratorlarni tahrirlash"</string>
<string name="screen_room_change_role_confirm_add_admin_description">"Bu amalni bekor qila olmaysiz. Siz foydalanuvchini ozingiz bilan bir xil quvvat darajasiga ega bolishga undayapsiz."</string>
<string name="screen_room_change_role_confirm_add_admin_title">"Admin qoshilsinmi?"</string>
<string name="screen_room_change_role_confirm_change_owners_description">"Bu amalni bekor qila olmaysiz. Siz egalikni tanlangan foydalanuvchilarga otkazmoqdasiz. Tark etsangiz, bu doimiy boladi."</string>
<string name="screen_room_change_role_confirm_change_owners_title">"Egalik huquqini otkazasizmi?"</string>
<string name="screen_room_change_role_confirm_demote_self_action">"Pastga tushirish"</string>
<string name="screen_room_change_role_confirm_demote_self_description">"Siz oʻzingizni imtiyozlardan mahrum qilayotganingiz sababli, bu ozgarishni bekor qila olmaysiz. Agar xonadagi songgi imtiyozli foydalanuvchi bolsangiz, imtiyozlarni qayta tiklash imkonsiz boladi."</string>
<string name="screen_room_change_role_confirm_demote_self_title">"Oz darajangizni pasaytirmoqchimisiz?"</string>
<string name="screen_room_change_role_invited_member_name">"%1$s (Jarayonda)"</string>
<string name="screen_room_change_role_invited_member_name_android">"(Kutilmoqda)"</string>
<string name="screen_room_change_role_moderators_admin_section_footer">"Administratorlar avtomatik ravishda moderator imtiyozlariga ega"</string>
<string name="screen_room_change_role_moderators_owner_section_footer">"Egalar avtomatik ravishda administrator huquqlariga ega."</string>
<string name="screen_room_change_role_moderators_title">"Moderatorlarni tahrirlash"</string>
<string name="screen_room_change_role_owners_title">"Egalarni tanlang"</string>
<string name="screen_room_change_role_section_administrators">"Adminlar"</string>
<string name="screen_room_change_role_section_moderators">"Moderatorlar"</string>
<string name="screen_room_change_role_section_users">"Azolar"</string>
@@ -36,19 +40,23 @@
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Faqat aʻzoni olib tashlash"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Taqiqni bekor qilish"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Agar taklif qilinsa, ular bu xonaga qayta qoshilishlari mumkin."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Xonadan taqiqni olib tashlash"</string>
<string name="screen_room_member_list_mode_banned">"Taqiqlangan"</string>
<string name="screen_room_member_list_mode_members">"Azolar"</string>
<string name="screen_room_member_list_role_administrator">"Faqat adminlar"</string>
<string name="screen_room_member_list_role_moderator">"Adminlar va moderatorlar"</string>
<string name="screen_room_member_list_role_owner">"Egasi"</string>
<string name="screen_room_member_list_room_members_header_title">"Xona a\'zolari"</string>
<string name="screen_room_member_list_unbanning_user">"Taqiqni bekor qilish %1$s"</string>
<string name="screen_room_roles_and_permissions_admins">"Adminlar"</string>
<string name="screen_room_roles_and_permissions_admins_and_owners">"Adminlar va egalari"</string>
<string name="screen_room_roles_and_permissions_change_my_role">"Rolimni ozgartirish"</string>
<string name="screen_room_roles_and_permissions_change_role_demote_to_member">"Aʼzolikka tushirish"</string>
<string name="screen_room_roles_and_permissions_change_role_demote_to_moderator">"Moderatorga pasaytirish"</string>
<string name="screen_room_roles_and_permissions_member_moderation">"Aʻzo moderatsiyasi"</string>
<string name="screen_room_roles_and_permissions_messages_and_content">"Xabarlar va kontent"</string>
<string name="screen_room_roles_and_permissions_moderators">"Moderatorlar"</string>
<string name="screen_room_roles_and_permissions_owners">"Egalari"</string>
<string name="screen_room_roles_and_permissions_reset">"Ruxsatlarni tiklash"</string>
<string name="screen_room_roles_and_permissions_reset_confirm_description">"Ruxsatlarni asliga qaytargach, joriy sozlamalarni yoʻqotasiz."</string>
<string name="screen_room_roles_and_permissions_reset_confirm_title">"Ruxsatlar asliga qaytarilsinmi?"</string>

View File

@@ -31,7 +31,7 @@
<string name="screen_room_change_role_section_users">"成员"</string>
<string name="screen_room_change_role_unsaved_changes_description">"您有未保存的更改。"</string>
<string name="screen_room_change_role_unsaved_changes_title">"保存更改?"</string>
<string name="screen_room_member_list_banned_empty">"此聊天室里没有被封禁的用户。"</string>
<string name="screen_room_member_list_banned_empty">"没有被封禁的用户。"</string>
<plurals name="screen_room_member_list_header_title">
<item quantity="other">"%1$d 人"</item>
</plurals>
@@ -61,5 +61,6 @@
<string name="screen_room_roles_and_permissions_reset_confirm_title">"重置权限?"</string>
<string name="screen_room_roles_and_permissions_roles_header">"角色"</string>
<string name="screen_room_roles_and_permissions_room_details">"聊天室详情"</string>
<string name="screen_room_roles_and_permissions_space_details">"空间详情"</string>
<string name="screen_room_roles_and_permissions_title">"角色与权限"</string>
</resources>

View File

@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_join_room_loading_alert_title">"Biz bu xonani oldindan korishni korsata olmadik "</string>
<string name="screen_room_alias_resolver_resolve_alias_failure">"Xona taxalluslari yechilmadi."</string>
</resources>

View File

@@ -90,8 +90,8 @@
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Хората могат да се присъединят само ако са поканени"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Само с покана"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Достъп до стаята"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Пространствата в момента не се поддържат"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Членове на пространството"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Пространствата в момента не се поддържат"</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_title">"Видима в директорията на обществените стаи"</string>
<string name="screen_security_and_privacy_room_history_anyone_option_title">"Всеки"</string>
<string name="screen_security_and_privacy_room_history_section_header">"Кой може да чете историята"</string>

View File

@@ -1,19 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_edit_room_address_room_address_section_footer">"Aby byla místnost v adresáři viditelná, je třeba zadat její adresu."</string>
<string name="screen_edit_room_address_title">"Adresa místnosti"</string>
<string name="screen_edit_room_address_room_address_section_footer">"Budete potřebovat adresu místnosti, aby byla viditelná v adresáři místností."</string>
<string name="screen_edit_room_address_title">"Upravit adresu"</string>
<string name="screen_notification_settings_edit_failed_updating_default_mode">"Při aktualizaci nastavení oznámení došlo k chybě."</string>
<string name="screen_notification_settings_mentions_only_disclaimer">"Váš domovský server tuto možnost v zašifrovaných místnostech nepodporuje, v některých místnostech nemusíte být upozorněni."</string>
<string name="screen_polls_history_title">"Hlasování"</string>
<string name="screen_room_change_permissions_administrators">"Pouze správci"</string>
<string name="screen_room_change_permissions_administrators">"Správce"</string>
<string name="screen_room_change_permissions_ban_people">"Vykázat lidi"</string>
<string name="screen_room_change_permissions_delete_messages">"Odstranit zprávy"</string>
<string name="screen_room_change_permissions_invite_people">"Pozvěte lidi a přijímejte žádosti o připojení"</string>
<string name="screen_room_change_permissions_everyone">"Člen"</string>
<string name="screen_room_change_permissions_invite_people">"Pozvat přátele"</string>
<string name="screen_room_change_permissions_member_moderation">"Spravovat členy"</string>
<string name="screen_room_change_permissions_messages_and_content">"Zprávy a obsah"</string>
<string name="screen_room_change_permissions_moderators">"Správci a moderátoři"</string>
<string name="screen_room_change_permissions_remove_people">"Odeberte lidi a odmítněte žádosti o připojení"</string>
<string name="screen_room_change_permissions_moderators">"Moderátor"</string>
<string name="screen_room_change_permissions_remove_people">"Odebrat osoby"</string>
<string name="screen_room_change_permissions_room_avatar">"Změnit avatar místnosti"</string>
<string name="screen_room_change_permissions_room_details">"Upravit místnost"</string>
<string name="screen_room_change_permissions_room_details">"Upravit podrobnosti"</string>
<string name="screen_room_change_permissions_room_name">"Změnit název místnosti"</string>
<string name="screen_room_change_permissions_room_topic">"Změnit téma místnosti"</string>
<string name="screen_room_change_permissions_send_messages">"Odeslat zprávy"</string>
@@ -40,7 +42,7 @@
<string name="screen_room_details_badge_encrypted">"Šifrováno"</string>
<string name="screen_room_details_badge_not_encrypted">"Není šifrováno"</string>
<string name="screen_room_details_badge_public">"Veřejná místnost"</string>
<string name="screen_room_details_edit_room_title">"Upravit místnost"</string>
<string name="screen_room_details_edit_room_title">"Upravit podrobnosti"</string>
<string name="screen_room_details_edition_error">"Došlo k neznámé chybě a informace nebylo možné změnit."</string>
<string name="screen_room_details_edition_error_title">"Nelze aktualizovat místnost"</string>
<string name="screen_room_details_encryption_enabled_subtitle">"Zprávy jsou zabezpečeny zámky. Pouze vy a příjemci máte jedinečné klíče k jejich odemčení."</string>
@@ -60,7 +62,7 @@
<string name="screen_room_details_pinned_events_row_title">"Připnuté zprávy"</string>
<string name="screen_room_details_profile_row_title">"Profil"</string>
<string name="screen_room_details_requests_to_join_title">"Žádosti o vstup"</string>
<string name="screen_room_details_roles_and_permissions">"Role a oprávnění"</string>
<string name="screen_room_details_roles_and_permissions">"Role a oprávnění"</string>
<string name="screen_room_details_room_name_label">"Název místnosti"</string>
<string name="screen_room_details_security_and_privacy_title">"Zabezpečení a soukromí"</string>
<string name="screen_room_details_security_title">"Zabezpečení"</string>
@@ -69,6 +71,13 @@
<string name="screen_room_details_topic_title">"Téma"</string>
<string name="screen_room_details_updating_room">"Aktualizace místnosti…"</string>
<string name="screen_room_member_list_banned_empty">"V této místnosti nejsou žádní vykázaní uživatelé."</string>
<plurals name="screen_room_member_list_banned_header_title">
<item quantity="one">"%1$d vykázán(a)"</item>
<item quantity="few">"%1$d vykázáni"</item>
<item quantity="other">"%1$d vykázáných"</item>
</plurals>
<string name="screen_room_member_list_empty_search_subtitle">"Zkontrolujte pravopis nebo zkuste nové vyhledávání"</string>
<string name="screen_room_member_list_empty_search_title">"Žádné výsledky pro “%1$s”"</string>
<plurals name="screen_room_member_list_header_title">
<item quantity="one">"%1$d osoba"</item>
<item quantity="few">"%1$d osoby"</item>
@@ -81,8 +90,14 @@
<string name="screen_room_member_list_manage_member_unban_title">"Zrušit vykázání z místnosti"</string>
<string name="screen_room_member_list_mode_banned">"Vykázaní"</string>
<string name="screen_room_member_list_mode_members">"Členové"</string>
<string name="screen_room_member_list_role_administrator">"Pouze správci"</string>
<string name="screen_room_member_list_role_moderator">"Správci a moderátoři"</string>
<plurals name="screen_room_member_list_pending_header_title">
<item quantity="one">"%1$d pozván(a)"</item>
<item quantity="few">"%1$d pozváni"</item>
<item quantity="other">"%1$d pozvaných"</item>
</plurals>
<string name="screen_room_member_list_pending_status">"Čekající"</string>
<string name="screen_room_member_list_role_administrator">"Správce"</string>
<string name="screen_room_member_list_role_moderator">"Moderátor"</string>
<string name="screen_room_member_list_role_owner">"Vlastník"</string>
<string name="screen_room_member_list_room_members_header_title">"Členové místnosti"</string>
<string name="screen_room_member_list_unbanning_user">"Rušení vykázání %1$s"</string>
@@ -109,14 +124,15 @@
<string name="screen_room_roles_and_permissions_messages_and_content">"Zprávy a obsah"</string>
<string name="screen_room_roles_and_permissions_moderators">"Moderátoři"</string>
<string name="screen_room_roles_and_permissions_owners">"Vlastníci"</string>
<string name="screen_room_roles_and_permissions_permissions_header">"Oprávnění"</string>
<string name="screen_room_roles_and_permissions_reset">"Obnovit oprávnění"</string>
<string name="screen_room_roles_and_permissions_reset_confirm_description">"Po obnovení oprávnění ztratíte aktuální nastavení."</string>
<string name="screen_room_roles_and_permissions_reset_confirm_title">"Obnovit oprávnění?"</string>
<string name="screen_room_roles_and_permissions_roles_header">"Role"</string>
<string name="screen_room_roles_and_permissions_room_details">"Podrobnosti místnosti"</string>
<string name="screen_room_roles_and_permissions_title">"Role a oprávnění"</string>
<string name="screen_security_and_privacy_add_room_address_action">"Přidat adresu místnosti"</string>
<string name="screen_security_and_privacy_ask_to_join_option_description">"Kdokoli může požádat o vstup do místnosti, ale správce nebo moderátor bude muset žádost přijmout."</string>
<string name="screen_room_roles_and_permissions_title">"Role a oprávnění"</string>
<string name="screen_security_and_privacy_add_room_address_action">"Přidat adresu"</string>
<string name="screen_security_and_privacy_ask_to_join_option_description">"Všichni musí požádat o přístup."</string>
<string name="screen_security_and_privacy_ask_to_join_option_title">"Požádat o připojení"</string>
<string name="screen_security_and_privacy_enable_encryption_alert_confirm_button_title">"Ano, povolit šifrování"</string>
<string name="screen_security_and_privacy_enable_encryption_alert_description">"Po aktivaci nelze šifrování místnosti deaktivovat. Historie zpráv bude viditelná pouze pro členy místnosti od doby, kdy byli pozváni nebo od té doby, co do místnosti vstoupili.
@@ -126,17 +142,21 @@ Nedoporučujeme povolovat šifrování pro místnosti, které může kdokoli naj
<string name="screen_security_and_privacy_encryption_section_footer">"Jakmile je povoleno, šifrování nelze zakázat."</string>
<string name="screen_security_and_privacy_encryption_section_header">"Šifrování"</string>
<string name="screen_security_and_privacy_encryption_toggle_title">"Povolit koncové šifrování"</string>
<string name="screen_security_and_privacy_room_access_anyone_option_description">"Každý může najít a vstoupit"</string>
<string name="screen_security_and_privacy_room_access_anyone_option_description">"Vstoupit může kdokoli."</string>
<string name="screen_security_and_privacy_room_access_anyone_option_title">"Kdokoliv"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Lidé mohou vstoupit, pouze pokud jsou pozváni"</string>
<string name="screen_security_and_privacy_room_access_footer">"Vyberte, kteří členové prostorů se k této místnosti mohou připojit bez pozvánky. %1$s"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Vstoupit mohou pouze pozvaní lidé."</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Pouze pro zvané"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Přístup do místnosti"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Prostory nejsou aktuálně podporovány"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Přístup"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_multiple_parents_description">"Vstoupit může kdokoli z autorizovaných prostorů."</string>
<string name="screen_security_and_privacy_room_access_space_members_option_single_parent_description">"Vstoupit může kdokoli v %1$s."</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Členové prostoru"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Aby byla místnost v adresáři viditelná, je třeba zadat její adresu."</string>
<string name="screen_security_and_privacy_room_address_section_header">"Adresa místnosti"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Prostory nejsou aktuálně podporovány"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Budete potřebovat adresu místnosti, aby byla viditelná v adresáři místností."</string>
<string name="screen_security_and_privacy_room_address_section_header">"Adresa"</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Umožněte nalezení této místnosti prohledáním adresáře veřejných místností na %1$s"</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_title">"Viditelné v adresáři veřejných místností"</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_description">"Umožnit nalezení vyhledáváním ve veřejném adresáři."</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_title">"Viditelné ve veřejném adresáři"</string>
<string name="screen_security_and_privacy_room_history_anyone_option_title">"Kdokoliv"</string>
<string name="screen_security_and_privacy_room_history_section_header">"Kdo může číst historii"</string>
<string name="screen_security_and_privacy_room_history_since_invite_option_title">"Pouze členové od té doby, co byli pozváni"</string>
@@ -144,6 +164,7 @@ Nedoporučujeme povolovat šifrování pro místnosti, které může kdokoli naj
<string name="screen_security_and_privacy_room_publishing_section_footer">"Adresy místností představují způsoby, jak najít místnosti a získat k nim přístup. Díky tomu můžete svoji místnost snadno sdílet s ostatními.
Můžete se rozhodnout publikovat svou místnost ve veřejném adresáři místnosti vašeho domovského serveru."</string>
<string name="screen_security_and_privacy_room_publishing_section_header">"Publikování místnosti"</string>
<string name="screen_security_and_privacy_room_visibility_section_header">"Viditelnost místnosti"</string>
<string name="screen_security_and_privacy_room_visibility_section_footer">"Adresy slouží k vyhledávání a přístupu do místností a prostorů. Díky tomu je také můžete snadno sdílet s ostatními."</string>
<string name="screen_security_and_privacy_room_visibility_section_header">"Viditelnost"</string>
<string name="screen_security_and_privacy_title">"Zabezpečení a soukromí"</string>
</resources>

View File

@@ -136,8 +136,8 @@ Nid ydym yn argymell galluogi amgryptio ar gyfer ystafelloedd y gall unrhyw un d
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Dim ond os cawn nhw wahoddiad gall pobl ymuno"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Gwahoddiad yn unig"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Mynediad ystafell"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Nid yw gofodau\'n cael eu cefnogi ar hyn o bryd"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Aelodau gofod"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Nid yw gofodau\'n cael eu cefnogi ar hyn o bryd"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Bydd angen cyfeiriad ystafell arnoch i\'w wneud yn weladwy yn y cyfeiriadur."</string>
<string name="screen_security_and_privacy_room_address_section_header">"Cyfeiriad yr ystafell"</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Caniatáu i\'r ystafell hon gael ei chanfod trwy chwilio cyfeiriadur ystafelloedd cyhoeddus %1$s"</string>

View File

@@ -130,8 +130,8 @@ Vi anbefaler ikke at aktivere kryptering for rum, som alle kan finde og deltage
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Andre kan kun deltage, hvis de bliver inviteret"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Kun med invitation"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Adgang til rummet"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Grupper understøttes ikke i øjeblikket"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Medlemmer af gruppen"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Grupper understøttes ikke i øjeblikket"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Du skal bruge en rum-adresse for at gøre den synlig i kataloget."</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Tillad, at dette rum kan findes ved at søge i %1$s fortegnelse over offentlige rum"</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_title">"Synlig i det offentlige register over rum"</string>

View File

@@ -130,8 +130,8 @@ Wir empfehlen keine Verschlüsselung für Chats zu aktivieren, die jeder finden
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Personen können nur beitreten, wenn sie eingeladen werden."</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Nur auf Einladung"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Chat Zugang"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Spaces werden zur Zeit nicht unterstützt."</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Spacemitglieder"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Spaces werden zur Zeit nicht unterstützt."</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Du benötigst eine Chat-Adresse, um den Chat im Verzeichnis sichtbar zu machen."</string>
<string name="screen_security_and_privacy_room_address_section_header">"Chatroomadresse"</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Erlaube das Auffinden dieses Chats durch Suche im öffentlichen Verzeichnis von %1$s"</string>

View File

@@ -121,8 +121,8 @@
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Τα άτομα μπορούν να συμμετάσχουν μόνο εάν έχουν προσκληθεί"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Μόνο πρόσκληση"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Πρόσβαση στην αίθουσα"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Οι χώροι δεν υποστηρίζονται προς το παρόν"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Μέλη χώρου"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Οι χώροι δεν υποστηρίζονται προς το παρόν"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Θα χρειαστείτε μια διεύθυνση αίθουσας για να την κάνετε ορατή στον κατάλογο."</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Επιστρέψτε την εύρεση αυτής της αίθουσας με αναζήτηση στον κατάλογο %1$s δημοσίων αιθουσών"</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_title">"Ορατή στον κατάλογο δημόσιων αιθουσών"</string>

View File

@@ -121,8 +121,8 @@ No recomendamos habilitar el cifrado para las salas que cualquiera pueda encontr
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Las personas solo pueden unirse si están invitadas"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Solo por invitación"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Acceso a la sala"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"No se admiten los espacios por el momento."</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Miembros del espacio"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"No se admiten los espacios por el momento."</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Necesitarás una dirección de sala para que sea visible en el directorio."</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Permite encontrar esta sala buscando en el directorio de salas públicas de %1$s"</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_title">"Visible en el directorio de salas públicas"</string>

View File

@@ -136,8 +136,8 @@ Me ei soovita krüptimise kasutamist selliste avalike jututubade puhul, millega
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Liituda saab vaid kutse olemasolul"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Vaid kutsega"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Ligipääs"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Kogukondade tugi veel puudub"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Kogukonna liikmed"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Kogukondade tugi veel puudub"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Selleks, et jututuba oleks nähtav jututubade avalikus kataloogis, vajab ta aadressi."</string>
<string name="screen_security_and_privacy_room_address_section_header">"Aadress"</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Võimalda leida seda jututuba avalikust kataloogist otsides „%1$s“"</string>

View File

@@ -108,8 +108,8 @@
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Gonbidatutako pertsonak bakarrik sartu ahal izango dira"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Gonbidapen bidez"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Gelarako sarbidea"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Gaur-gaurkoz ez da guneekin bateragarria"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Guneko kideak"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Gaur-gaurkoz ez da guneekin bateragarria"</string>
<string name="screen_security_and_privacy_room_address_section_header">"Gelaren helbidea"</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_title">"Gela publikoen direktorioan ikusgai"</string>
<string name="screen_security_and_privacy_room_history_anyone_option_title">"Edonork"</string>

View File

@@ -69,6 +69,10 @@
<string name="screen_room_details_topic_title">"موضوع"</string>
<string name="screen_room_details_updating_room">"به‌روز کردن اتاق…"</string>
<string name="screen_room_member_list_banned_empty">"هیچ کاربر محرومی در این اتاق نیست."</string>
<plurals name="screen_room_member_list_header_title">
<item quantity="one">"%1$d نفر"</item>
<item quantity="other">"%1$d نفر"</item>
</plurals>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"برداشت و تحریم عضو"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"تنها برداشتن عضو"</string>
<string name="screen_room_member_list_manage_member_unban_action">"رفع انسداد"</string>
@@ -120,8 +124,8 @@
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"افراد فقط در صورت دعوت می‌توانند بپیوندند"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"فقط دعوتی"</string>
<string name="screen_security_and_privacy_room_access_section_header">"دسترسی اتاق"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"در حال حاضر فضاها پشتیبانی نمی‌شوند"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"اعضای فضا"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"در حال حاضر فضاها پشتیبانی نمی‌شوند"</string>
<string name="screen_security_and_privacy_room_address_section_header">"نشانی اتاق"</string>
<string name="screen_security_and_privacy_room_history_anyone_option_title">"هرکسی"</string>
<string name="screen_security_and_privacy_room_publishing_section_header">"انتشار اتاق"</string>

View File

@@ -1,19 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_edit_room_address_room_address_section_footer">"Tarvitset huoneen osoitteen, jotta se näkyy hakemistossa."</string>
<string name="screen_edit_room_address_title">"Huoneen osoite"</string>
<string name="screen_edit_room_address_room_address_section_footer">"Tarvitset osoitteen, jotta se näkyy julkisessa hakemistossa."</string>
<string name="screen_edit_room_address_title">"Muokkaa osoitetta"</string>
<string name="screen_notification_settings_edit_failed_updating_default_mode">"Ilmoitusasetusten muokkaamisessa tapahtui virhe."</string>
<string name="screen_notification_settings_mentions_only_disclaimer">"Kotipalvelimesi ei tue tätä vaihtoehtoa salatuissa huoneissa, joten et ehkä saa ilmoitusta joissakin huoneissa."</string>
<string name="screen_polls_history_title">"Kyselyt"</string>
<string name="screen_room_change_permissions_administrators">"Vain ylläpitäjät"</string>
<string name="screen_room_change_permissions_administrators">"Ylläpitäjä"</string>
<string name="screen_room_change_permissions_ban_people">"Porttikieltojen antaminen"</string>
<string name="screen_room_change_permissions_delete_messages">"Viestien poistaminen"</string>
<string name="screen_room_change_permissions_everyone">"Jäsen"</string>
<string name="screen_room_change_permissions_invite_people">"Ihmisten kutsuminen ja liittymispyyntöjen hyväksyminen"</string>
<string name="screen_room_change_permissions_member_moderation">"Jäsenien hallinta"</string>
<string name="screen_room_change_permissions_messages_and_content">"Viestit ja sisältö"</string>
<string name="screen_room_change_permissions_moderators">"Ylläpitäjät ja valvojat"</string>
<string name="screen_room_change_permissions_moderators">"Valvoja"</string>
<string name="screen_room_change_permissions_remove_people">"Henkilöiden poistaminen ja liittymispyyntöjen hylkääminen"</string>
<string name="screen_room_change_permissions_room_avatar">"Huoneen avatarin vaihtaminen"</string>
<string name="screen_room_change_permissions_room_details">"Muokkaa huonetta"</string>
<string name="screen_room_change_permissions_room_details">"Muokkaa tietoja"</string>
<string name="screen_room_change_permissions_room_name">"Huoneen nimen vaihtaminen"</string>
<string name="screen_room_change_permissions_room_topic">"Huoneen aiheen vaihtaminen"</string>
<string name="screen_room_change_permissions_send_messages">"Viestien lähettäminen"</string>
@@ -40,7 +42,7 @@
<string name="screen_room_details_badge_encrypted">"Salattu"</string>
<string name="screen_room_details_badge_not_encrypted">"Ei salattu"</string>
<string name="screen_room_details_badge_public">"Julkinen huone"</string>
<string name="screen_room_details_edit_room_title">"Muokkaa huonetta"</string>
<string name="screen_room_details_edit_room_title">"Muokkaa tietoja"</string>
<string name="screen_room_details_edition_error">"Tuntematon virhe tapahtui, eikä tietoja voitu muuttaa."</string>
<string name="screen_room_details_edition_error_title">"Huoneen muokkaaminen ei onnistunut"</string>
<string name="screen_room_details_encryption_enabled_subtitle">"Viestisi suojataan lukoilla. Vain sinulla ja viesiten vastaanottajilla on uniikit avaimet niiden avaamiseen."</string>
@@ -50,7 +52,7 @@
<string name="screen_room_details_error_unmuting">"Tämän huoneen mykistyksen poistaminen epäonnistui, yritä uudelleen."</string>
<string name="screen_room_details_invite_people_dont_close">"Älä sulje sovellusta ennen kuin se on valmis."</string>
<string name="screen_room_details_invite_people_preparing">"Valmistellaan kutsuja…"</string>
<string name="screen_room_details_invite_people_title">"Kutsu ihmisiä"</string>
<string name="screen_room_details_invite_people_title">"Kutsu henkilöitä"</string>
<string name="screen_room_details_leave_conversation_title">"Poistu keskustelusta"</string>
<string name="screen_room_details_leave_room_title">"Poistu huoneesta"</string>
<string name="screen_room_details_media_gallery_title">"Media ja tiedostot"</string>
@@ -68,7 +70,7 @@
<string name="screen_room_details_title">"Huoneen tiedot"</string>
<string name="screen_room_details_topic_title">"Aihe"</string>
<string name="screen_room_details_updating_room">"Muokataan huonetta…"</string>
<string name="screen_room_member_list_banned_empty">"Tässä huoneessa ei ole porttikieltoja"</string>
<string name="screen_room_member_list_banned_empty">"Porttikiellettyjä käyttäjiä ei ole."</string>
<plurals name="screen_room_member_list_header_title">
<item quantity="one">"%1$d henkilö"</item>
<item quantity="other">"%1$d henkilöä"</item>
@@ -80,8 +82,8 @@
<string name="screen_room_member_list_manage_member_unban_title">"Poista porttikielto huoneesta"</string>
<string name="screen_room_member_list_mode_banned">"Porttikiellot"</string>
<string name="screen_room_member_list_mode_members">"Jäsenet"</string>
<string name="screen_room_member_list_role_administrator">"Vain ylläpitäjät"</string>
<string name="screen_room_member_list_role_moderator">"Ylläpitäjät ja valvojat"</string>
<string name="screen_room_member_list_role_administrator">"Ylläpitäjä"</string>
<string name="screen_room_member_list_role_moderator">"Valvoja"</string>
<string name="screen_room_member_list_role_owner">"Omistaja"</string>
<string name="screen_room_member_list_room_members_header_title">"Huoneen jäsenet"</string>
<string name="screen_room_member_list_unbanning_user">"Poistetaan käyttäjän %1$s porttikieltoa"</string>
@@ -108,14 +110,15 @@
<string name="screen_room_roles_and_permissions_messages_and_content">"Viestit ja sisältö"</string>
<string name="screen_room_roles_and_permissions_moderators">"Valvojat"</string>
<string name="screen_room_roles_and_permissions_owners">"Omistajat"</string>
<string name="screen_room_roles_and_permissions_permissions_header">"Oikeudet"</string>
<string name="screen_room_roles_and_permissions_reset">"Nollaa oikeudet"</string>
<string name="screen_room_roles_and_permissions_reset_confirm_description">"Kun nollaat käyttöoikeudet, menetät nykyiset asetukset."</string>
<string name="screen_room_roles_and_permissions_reset_confirm_title">"Nollataanko oikeudet?"</string>
<string name="screen_room_roles_and_permissions_roles_header">"Roolit"</string>
<string name="screen_room_roles_and_permissions_room_details">"Huoneen tiedot"</string>
<string name="screen_room_roles_and_permissions_title">"Roolit ja oikeudet"</string>
<string name="screen_security_and_privacy_add_room_address_action">"Lisää huoneen osoite"</string>
<string name="screen_security_and_privacy_ask_to_join_option_description">"Kuka tahansa voi pyytää saada liittyä huoneeseen, mutta ylläpitäjän tai valvojan on hyväksyttävä pyyntö."</string>
<string name="screen_security_and_privacy_add_room_address_action">"Lisää osoite"</string>
<string name="screen_security_and_privacy_ask_to_join_option_description">"Kaikkien on pyydettävä pääsyä."</string>
<string name="screen_security_and_privacy_ask_to_join_option_title">"Pyydä liittymistä"</string>
<string name="screen_security_and_privacy_enable_encryption_alert_confirm_button_title">"Kyllä, ota salaus käyttöön"</string>
<string name="screen_security_and_privacy_enable_encryption_alert_description">"Kun salaus on kerran otettu käyttöön, sitä ei voi poistaa käytöstä. Viestihistoria näkyy vain huoneen jäsenille kutsusta tai liittymisestä lähtien.
@@ -125,17 +128,18 @@ Emme suosittele salauksen ottamista käyttöön huoneissa, jotka kuka tahansa vo
<string name="screen_security_and_privacy_encryption_section_footer">"Kun salaus on kerran otettu käyttöön, sitä ei voi poistaa käytöstä."</string>
<string name="screen_security_and_privacy_encryption_section_header">"Salaus"</string>
<string name="screen_security_and_privacy_encryption_toggle_title">"Ota päästä päähän -salaus käyttöön"</string>
<string name="screen_security_and_privacy_room_access_anyone_option_description">"Kuka tahansa voi löytää ja liittyä."</string>
<string name="screen_security_and_privacy_room_access_anyone_option_description">"Kuka tahansa voi liittyä."</string>
<string name="screen_security_and_privacy_room_access_anyone_option_title">"Kuka tahansa"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Vain kutsutut henkilöt voivat liittyä"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Vain kutsutut henkilöt voivat liittyä."</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Vain kutsutut"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Huoneeseen pääsy"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Tiloja ei tällä hetkellä tueta"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Pääsy"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Tilan jäsenet"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Tarvitset huoneen osoitteen, jotta se näkyy hakemistossa."</string>
<string name="screen_security_and_privacy_room_address_section_header">"Huoneen osoite"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Tiloja ei tällä hetkellä tueta"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Tarvitset osoitteen, jotta se näkyy julkisessa hakemistossa."</string>
<string name="screen_security_and_privacy_room_address_section_header">"Osoite"</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Salli tämän huoneen löytäminen hakemalla %1$s -palvelimen julkisesta huonehakemistosta."</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_title">"Näkyy julkisessa huonehakemistossa"</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_description">"Anna muiden löytää tämä julkisen hakemiston kautta."</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_title">"Näkyy julkisessa hakemistossa"</string>
<string name="screen_security_and_privacy_room_history_anyone_option_title">"Kuka tahansa"</string>
<string name="screen_security_and_privacy_room_history_section_header">"Kuka voi lukea viestihistoriaa"</string>
<string name="screen_security_and_privacy_room_history_since_invite_option_title">"Jäsenet vasta kutsusta lähtien"</string>
@@ -143,6 +147,6 @@ Emme suosittele salauksen ottamista käyttöön huoneissa, jotka kuka tahansa vo
<string name="screen_security_and_privacy_room_publishing_section_footer">"Huoneosoitteet ovat tapoja löytää ja käyttää huoneita. Näin voit myös helposti jakaa huoneesi muiden kanssa.
Voit halutessasi julkaista huoneesi kotipalvelimesi julkisessa huonehakemistossa."</string>
<string name="screen_security_and_privacy_room_publishing_section_header">"Huoneen julkaiseminen"</string>
<string name="screen_security_and_privacy_room_visibility_section_header">"Huoneen näkyvyys"</string>
<string name="screen_security_and_privacy_room_visibility_section_header">"Näkyvyys"</string>
<string name="screen_security_and_privacy_title">"Turvallisuus ja yksityisyys"</string>
</resources>

View File

@@ -71,9 +71,15 @@
<string name="screen_room_details_topic_title">"Sujet"</string>
<string name="screen_room_details_updating_room">"Mise à jour du salon…"</string>
<string name="screen_room_member_list_banned_empty">"Il ny a pas dutilisateur banni."</string>
<plurals name="screen_room_member_list_banned_header_title">
<item quantity="one">"%1$d Banni(e)"</item>
<item quantity="other">"%1$d Banni(e)s"</item>
</plurals>
<string name="screen_room_member_list_empty_search_subtitle">"Vérifiez la saisie ou effectuez une nouvelle recherche"</string>
<string name="screen_room_member_list_empty_search_title">"Aucun résultat pour «%1$s»"</string>
<plurals name="screen_room_member_list_header_title">
<item quantity="one">"%1$d personne"</item>
<item quantity="other">"%1$d personnes"</item>
<item quantity="one">"%1$d Personne"</item>
<item quantity="other">"%1$d Personnes"</item>
</plurals>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Bannir du salon"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Retirer le membre uniquement"</string>
@@ -82,6 +88,11 @@
<string name="screen_room_member_list_manage_member_unban_title">"Débannir du salon"</string>
<string name="screen_room_member_list_mode_banned">"Bannis"</string>
<string name="screen_room_member_list_mode_members">"Membres"</string>
<plurals name="screen_room_member_list_pending_header_title">
<item quantity="one">"%1$d Invité(e)"</item>
<item quantity="other">"%1$d Invité(e)s"</item>
</plurals>
<string name="screen_room_member_list_pending_status">"En attente"</string>
<string name="screen_room_member_list_role_administrator">"Administrateurs"</string>
<string name="screen_room_member_list_role_moderator">"Modérateurs"</string>
<string name="screen_room_member_list_role_owner">"Propriétaire"</string>
@@ -133,8 +144,8 @@ Nous ne recommandons pas dactiver le chiffrement pour les salons que tout le
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Seules les personnes invitées peuvent rejoindre."</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Sur invitation uniquement"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Accès"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Les Espaces ne sont pas encore supportés"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Membres de lespace"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Les Espaces ne sont pas encore supportés"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Vous aurez besoin dune adresse pour le rendre visible dans lannuaire public."</string>
<string name="screen_security_and_privacy_room_address_section_header">"Adresse"</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Autoriser le salon à apparaître dans les résultats de recherche dans le répertoire %1$s des salons publics"</string>
@@ -147,6 +158,7 @@ Nous ne recommandons pas dactiver le chiffrement pour les salons que tout le
<string name="screen_security_and_privacy_room_publishing_section_footer">"Les adresses de salon sont un moyen de trouver et daccéder aux salons. Cela vous permet également de partager facilement votre salon avec dautres personnes.
Vous pouvez choisir de publier votre salon dans lannuaire des salons publics de votre serveur daccueil."</string>
<string name="screen_security_and_privacy_room_publishing_section_header">"Publication du salon"</string>
<string name="screen_security_and_privacy_room_visibility_section_footer">"Les adresses permettent de trouver et daccéder aux salons et aux espaces. Elles facilitent également leur partage avec dautres personnes."</string>
<string name="screen_security_and_privacy_room_visibility_section_header">"Visibilité"</string>
<string name="screen_security_and_privacy_title">"Sécurité &amp; confidentialité"</string>
</resources>

View File

@@ -134,8 +134,8 @@ Nem javasoljuk a titkosítás engedélyezését az olyan szobákban, amelyeket b
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Csak a meghívott emberek léphetnek be."</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Csak meghívásos"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Hozzáférés"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"A terek jelenleg nem támogatottak"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"A tér tagjai"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"A terek jelenleg nem támogatottak"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Szüksége lesz egy szobacímre, hogy láthatóvá tegye a szobakatalógusban."</string>
<string name="screen_security_and_privacy_room_address_section_header">"Cím"</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"A szoba megtalálhatóvá tétele a(z) %1$s nyilvános szobakatalógusában való kereséssel."</string>

View File

@@ -120,8 +120,8 @@ Kami tidak menyarankan untuk mengaktifkan enkripsi untuk ruangan yang dapat dite
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Orang hanya dapat bergabung jika mereka diundang"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Hanya undangan"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Akses ruangan"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Space saat ini tidak didukung"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Anggota space"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Space saat ini tidak didukung"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Anda akan memerlukan alamat ruangan untuk membuatnya terlihat dalam direktori."</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Izinkan ruangan ini ditemukan dengan mencari direktori ruangan %1$s publik"</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_title">"Terlihat di direktori ruangan publik"</string>

View File

@@ -1,19 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_edit_room_address_room_address_section_footer">"Avrai bisogno di un indirizzo della stanza per renderla visibile nell\'elenco."</string>
<string name="screen_edit_room_address_title">"Indirizzo della stanza"</string>
<string name="screen_edit_room_address_room_address_section_footer">"Per renderlo visibile nell\'elenco pubblico, avrai bisogno di un indirizzo."</string>
<string name="screen_edit_room_address_title">"Modifica indirizzo"</string>
<string name="screen_notification_settings_edit_failed_updating_default_mode">"Si è verificato un errore durante l\'aggiornamento delle impostazioni di notifica."</string>
<string name="screen_notification_settings_mentions_only_disclaimer">"Il tuo homeserver non supporta questa opzione nelle stanze crifrate, quindi potresti non ricevere notifiche in alcune stanze."</string>
<string name="screen_polls_history_title">"Sondaggi"</string>
<string name="screen_room_change_permissions_administrators">"Solo amministratori"</string>
<string name="screen_room_change_permissions_administrators">"Amministratore"</string>
<string name="screen_room_change_permissions_ban_people">"Escludi membri"</string>
<string name="screen_room_change_permissions_delete_messages">"Rimuovi messaggi"</string>
<string name="screen_room_change_permissions_invite_people">"Invita persone e accetta richieste di partecipazione"</string>
<string name="screen_room_change_permissions_everyone">"Membro"</string>
<string name="screen_room_change_permissions_invite_people">"Invita persone"</string>
<string name="screen_room_change_permissions_member_moderation">"Gestisci membri"</string>
<string name="screen_room_change_permissions_messages_and_content">"Messaggi e contenuti"</string>
<string name="screen_room_change_permissions_moderators">"Amministratori e moderatori"</string>
<string name="screen_room_change_permissions_remove_people">"Rimuovi le persone e rifiuta le richieste di partecipazione"</string>
<string name="screen_room_change_permissions_moderators">"Moderatore"</string>
<string name="screen_room_change_permissions_remove_people">"Rimuovi membri"</string>
<string name="screen_room_change_permissions_room_avatar">"Cambia avatar della stanza"</string>
<string name="screen_room_change_permissions_room_details">"Modifica stanza"</string>
<string name="screen_room_change_permissions_room_details">"Modifica dettagli"</string>
<string name="screen_room_change_permissions_room_name">"Cambia il nome della stanza"</string>
<string name="screen_room_change_permissions_room_topic">"Cambiare l\'argomento della stanza"</string>
<string name="screen_room_change_permissions_send_messages">"Inviare messaggi"</string>
@@ -40,7 +42,7 @@
<string name="screen_room_details_badge_encrypted">"Cifrata"</string>
<string name="screen_room_details_badge_not_encrypted">"Non cifrata"</string>
<string name="screen_room_details_badge_public">"Stanza pubblica"</string>
<string name="screen_room_details_edit_room_title">"Modifica stanza"</string>
<string name="screen_room_details_edit_room_title">"Modifica dettagli"</string>
<string name="screen_room_details_edition_error">"Si è verificato un errore sconosciuto e non è stato possibile modificare le informazioni."</string>
<string name="screen_room_details_edition_error_title">"Impossibile aggiornare la stanza"</string>
<string name="screen_room_details_encryption_enabled_subtitle">"I messaggi sono protetti da lucchetti. Solo tu e i destinatari avete le chiavi univoche per sbloccarli."</string>
@@ -48,6 +50,8 @@
<string name="screen_room_details_error_loading_notification_settings">"Si è verificato un errore durante il caricamento delle impostazioni di notifica."</string>
<string name="screen_room_details_error_muting">"Impostazione del silenzioso fallita per questa stanza, riprova."</string>
<string name="screen_room_details_error_unmuting">"Disattivazione del silenzioso di questa stanza fallita, riprova."</string>
<string name="screen_room_details_invite_people_dont_close">"Non chiudere l\'app fino al completamento."</string>
<string name="screen_room_details_invite_people_preparing">"Preparazione degli inviti…"</string>
<string name="screen_room_details_invite_people_title">"Invita persone"</string>
<string name="screen_room_details_leave_conversation_title">"Abbandona la conversazione"</string>
<string name="screen_room_details_leave_room_title">"Esci dalla stanza"</string>
@@ -66,10 +70,16 @@
<string name="screen_room_details_title">"Informazioni sulla stanza"</string>
<string name="screen_room_details_topic_title">"Argomento"</string>
<string name="screen_room_details_updating_room">"Aggiornamento della stanza…"</string>
<string name="screen_room_member_list_banned_empty">"Non ci sono utenti esclusi in questa stanza."</string>
<string name="screen_room_member_list_banned_empty">"Non ci sono utenti bannati."</string>
<plurals name="screen_room_member_list_banned_header_title">
<item quantity="one">"%1$d Bannato"</item>
<item quantity="other">"%1$d Bannati"</item>
</plurals>
<string name="screen_room_member_list_empty_search_subtitle">"Controlla l\'ortografia o prova una nuova ricerca"</string>
<string name="screen_room_member_list_empty_search_title">"Nessun risultato per “%1$s ”"</string>
<plurals name="screen_room_member_list_header_title">
<item quantity="one">"%1$d persona"</item>
<item quantity="other">"%1$d persone"</item>
<item quantity="one">"%1$d Persona"</item>
<item quantity="other">"%1$d Persone"</item>
</plurals>
<string name="screen_room_member_list_manage_member_remove_confirmation_ban">"Rimuovi ed escludi"</string>
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Rimuovi soltanto"</string>
@@ -78,8 +88,13 @@
<string name="screen_room_member_list_manage_member_unban_title">"Riammetti nella stanza"</string>
<string name="screen_room_member_list_mode_banned">"Esclusi"</string>
<string name="screen_room_member_list_mode_members">"Membri"</string>
<string name="screen_room_member_list_role_administrator">"Solo amministratori"</string>
<string name="screen_room_member_list_role_moderator">"Amministratori e moderatori"</string>
<plurals name="screen_room_member_list_pending_header_title">
<item quantity="one">"%1$d Invitato"</item>
<item quantity="other">"%1$d Invitati"</item>
</plurals>
<string name="screen_room_member_list_pending_status">"In attesa"</string>
<string name="screen_room_member_list_role_administrator">"Amministratore"</string>
<string name="screen_room_member_list_role_moderator">"Moderatore"</string>
<string name="screen_room_member_list_role_owner">"Proprietario"</string>
<string name="screen_room_member_list_room_members_header_title">"Membri della stanza"</string>
<string name="screen_room_member_list_unbanning_user">"Riammissione di %1$s"</string>
@@ -106,14 +121,15 @@
<string name="screen_room_roles_and_permissions_messages_and_content">"Messaggi e contenuti"</string>
<string name="screen_room_roles_and_permissions_moderators">"Moderatori"</string>
<string name="screen_room_roles_and_permissions_owners">"Proprietari"</string>
<string name="screen_room_roles_and_permissions_permissions_header">"Autorizzazioni"</string>
<string name="screen_room_roles_and_permissions_reset">"Reimpostare le autorizzazioni"</string>
<string name="screen_room_roles_and_permissions_reset_confirm_description">"Una volta reimpostate le autorizzazioni, perderai le impostazioni correnti."</string>
<string name="screen_room_roles_and_permissions_reset_confirm_title">"Reimpostare autorizzazioni?"</string>
<string name="screen_room_roles_and_permissions_roles_header">"Ruoli"</string>
<string name="screen_room_roles_and_permissions_room_details">"Dettagli della stanza"</string>
<string name="screen_room_roles_and_permissions_title">"Ruoli e autorizzazioni"</string>
<string name="screen_security_and_privacy_add_room_address_action">"Aggiungi l\'indirizzo della stanza"</string>
<string name="screen_security_and_privacy_ask_to_join_option_description">"Chiunque può chiedere di entrare nella stanza, ma un amministratore o un moderatore dovrà accettare la richiesta."</string>
<string name="screen_security_and_privacy_add_room_address_action">"Aggiungi indirizzo"</string>
<string name="screen_security_and_privacy_ask_to_join_option_description">"Chiunque deve richiedere l\'accesso."</string>
<string name="screen_security_and_privacy_ask_to_join_option_title">"Chiedi di entrare"</string>
<string name="screen_security_and_privacy_enable_encryption_alert_confirm_button_title">"Sì, attiva la crittografia"</string>
<string name="screen_security_and_privacy_enable_encryption_alert_description">"Una volta attivata, la crittografia di una stanza non può essere disattivata, la cronologia dei messaggi sarà visibile solo ai membri della stanza da quando sono stati invitati o da quando sono entrati nella stanza.
@@ -123,17 +139,18 @@ Non consigliamo di attivare la crittografia per le stanze che chiunque può trov
<string name="screen_security_and_privacy_encryption_section_footer">"Una volta attivata, la crittografia non può essere disattivata."</string>
<string name="screen_security_and_privacy_encryption_section_header">"Crittografia"</string>
<string name="screen_security_and_privacy_encryption_toggle_title">"Attiva la crittografia end-to-end"</string>
<string name="screen_security_and_privacy_room_access_anyone_option_description">"Chiunque può trovare ed entrare"</string>
<string name="screen_security_and_privacy_room_access_anyone_option_description">"Chiunque può partecipare."</string>
<string name="screen_security_and_privacy_room_access_anyone_option_title">"Chiunque"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Le persone possono partecipare solo se invitate"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Solo le persone invitate possono entrare."</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Solo su invito"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Accesso alla stanza"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Gli spazi non sono attualmente supportati"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Accesso"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Membri dello spazio"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Avrai bisogno di un indirizzo della stanza per renderla visibile nell\'elenco."</string>
<string name="screen_security_and_privacy_room_address_section_header">"Indirizzo della stanza"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Gli spazi non sono attualmente supportati"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Per renderlo visibile nell\'elenco pubblico, avrai bisogno di un indirizzo."</string>
<string name="screen_security_and_privacy_room_address_section_header">"Indirizzo"</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Consenti la ricerca di questa stanza effettuando una ricerca nell\'elenco delle stanze pubbliche di %1$s"</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_title">"Visibile nell\'elenco delle stanze pubbliche"</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_description">"Consenti di essere trovato effettuando una ricerca nell\'elenco pubblico."</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_title">"Visibile nell\'elenco pubblico"</string>
<string name="screen_security_and_privacy_room_history_anyone_option_title">"Chiunque"</string>
<string name="screen_security_and_privacy_room_history_section_header">"Chi può leggere la cronologia messaggi"</string>
<string name="screen_security_and_privacy_room_history_since_invite_option_title">"Solo membri da quando sono stati invitati"</string>
@@ -141,6 +158,7 @@ Non consigliamo di attivare la crittografia per le stanze che chiunque può trov
<string name="screen_security_and_privacy_room_publishing_section_footer">"Gli indirizzi delle stanze sono modi per trovare e accedervi. In questo modo puoi anche condividere facilmente la tua stanze con altri.
Puoi scegliere di pubblicare la tua stanza nell\'elenco delle stanza pubbliche dell\'homeserver."</string>
<string name="screen_security_and_privacy_room_publishing_section_header">"Pubblicazione della stanza"</string>
<string name="screen_security_and_privacy_room_visibility_section_header">"Visibilità della stanza"</string>
<string name="screen_security_and_privacy_room_visibility_section_footer">"Gli indirizzi sono un modo per trovare e accedere a stanze e spazi. Questo ti consente anche di condividerli facilmente con altri."</string>
<string name="screen_security_and_privacy_room_visibility_section_header">"Visibilità"</string>
<string name="screen_security_and_privacy_title">"Sicurezza e privacy"</string>
</resources>

View File

@@ -127,8 +127,8 @@
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"초대받은 사용자만 가입할 수 있습니다."</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"초대 전용"</string>
<string name="screen_security_and_privacy_room_access_section_header">"방 액세스"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"스페이스는 현재 지원되지 않습니다"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"스페이스 멤버들"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"스페이스는 현재 지원되지 않습니다"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"디렉토리에 표시하려면 방 주소가 필요합니다."</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"%1$s 공개 방 디렉토리에서 이 방을 검색할 수 있도록 허용합니다"</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_title">"공개 룸 디렉토리에 표시됨"</string>

View File

@@ -130,8 +130,8 @@ Vi anbefaler ikke å aktivere kryptering for rom som hvem som helst kan finne og
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Folk kan bare bli med hvis de er invitert"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Kun for inviterte"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Tilgang til rom"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Områder støttes ikke for øyeblikket"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Medlemmer av område"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Områder støttes ikke for øyeblikket"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Du trenger en adresse til rommet for å gjøre det synlig i katalogen."</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Tillat at dette rommet blir funnet ved å søke %1$s offentlig romkatalog"</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_title">"Synlig i offentlig romkatalog"</string>

View File

@@ -131,8 +131,8 @@ Odradzamy włączanie szyfrowania dla pokoi, które każdy może znaleźć i do
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Tylko osoby z zaproszeniem mogą dołączyć"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Tylko zaproszenie"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Dostęp do pokoju"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Przestrzenie nie są obecnie wspierane"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Członkowie przestrzeni"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Przestrzenie nie są obecnie wspierane"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Aby pokój był widoczny w katalogu, potrzebny jest adres pokoju."</string>
<string name="screen_security_and_privacy_room_address_section_header">"Adres pokoju"</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Zezwól na znalezienie tego pokoju wyszukując %1$s w katalogu pokoi publicznych"</string>

View File

@@ -1,19 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_edit_room_address_room_address_section_footer">"Você precisará de um endereço de sala para torná-la visível no diretório."</string>
<string name="screen_edit_room_address_title">"Endereço da sala"</string>
<string name="screen_edit_room_address_room_address_section_footer">"Você precisará de um endereço para torná-la visível no diretório."</string>
<string name="screen_edit_room_address_title">"Editar endereço"</string>
<string name="screen_notification_settings_edit_failed_updating_default_mode">"Ocorreu um erro ao atualizar a configuração de notificação."</string>
<string name="screen_notification_settings_mentions_only_disclaimer">"Seu servidor-casa não suporta esta opção em salas criptografadas. Você pode não ser notificado em algumas salas."</string>
<string name="screen_polls_history_title">"Enquetes"</string>
<string name="screen_room_change_permissions_administrators">"Somente administradores"</string>
<string name="screen_room_change_permissions_administrators">"Administradores"</string>
<string name="screen_room_change_permissions_ban_people">"Banir pessoas"</string>
<string name="screen_room_change_permissions_delete_messages">"Remover mensagens"</string>
<string name="screen_room_change_permissions_invite_people">"Convide pessoas e aceite solicitações de entrada"</string>
<string name="screen_room_change_permissions_everyone">"Membro"</string>
<string name="screen_room_change_permissions_invite_people">"Convidar pessoas"</string>
<string name="screen_room_change_permissions_member_moderation">"Gerenciar membros"</string>
<string name="screen_room_change_permissions_messages_and_content">"Mensagens e conteúdo"</string>
<string name="screen_room_change_permissions_moderators">"Administradores e moderadores"</string>
<string name="screen_room_change_permissions_remove_people">"Remover pessoas e recusar solicitações de entrada"</string>
<string name="screen_room_change_permissions_moderators">"Moderador"</string>
<string name="screen_room_change_permissions_remove_people">"Remover pessoas"</string>
<string name="screen_room_change_permissions_room_avatar">"Alterar avatar da sala"</string>
<string name="screen_room_change_permissions_room_details">"Editar sala"</string>
<string name="screen_room_change_permissions_room_details">"Editar detalhes"</string>
<string name="screen_room_change_permissions_room_name">"Alterar nome da sala"</string>
<string name="screen_room_change_permissions_room_topic">"Alterar tópico da sala"</string>
<string name="screen_room_change_permissions_send_messages">"Enviar mensagens"</string>
@@ -40,7 +42,7 @@
<string name="screen_room_details_badge_encrypted">"Criptografado"</string>
<string name="screen_room_details_badge_not_encrypted">"Não criptografado"</string>
<string name="screen_room_details_badge_public">"Sala pública"</string>
<string name="screen_room_details_edit_room_title">"Editar sala"</string>
<string name="screen_room_details_edit_room_title">"Editar detalhes"</string>
<string name="screen_room_details_edition_error">"Ocorreu um erro desconhecido e as informações não puderam ser alteradas."</string>
<string name="screen_room_details_edition_error_title">"Não foi possível atualizar a sala"</string>
<string name="screen_room_details_encryption_enabled_subtitle">"As mensagens são protegidas com cadeados. Somente você e os destinatários têm as chaves exclusivas para desbloqueá-los."</string>
@@ -48,6 +50,8 @@
<string name="screen_room_details_error_loading_notification_settings">"Ocorreu um erro ao carregar as configurações de notificação."</string>
<string name="screen_room_details_error_muting">"Falha ao silenciar esta sala, tente novamente."</string>
<string name="screen_room_details_error_unmuting">"Falha ao desilenciar esta sala. Tente novamente."</string>
<string name="screen_room_details_invite_people_dont_close">"Não feche o aplicativo até terminar."</string>
<string name="screen_room_details_invite_people_preparing">"Preparando convites…"</string>
<string name="screen_room_details_invite_people_title">"Convidar pessoas"</string>
<string name="screen_room_details_leave_conversation_title">"Sair da conversa"</string>
<string name="screen_room_details_leave_room_title">"Sair da sala"</string>
@@ -66,7 +70,13 @@
<string name="screen_room_details_title">"Informação da sala"</string>
<string name="screen_room_details_topic_title">"Tópico"</string>
<string name="screen_room_details_updating_room">"Atualizando a sala…"</string>
<string name="screen_room_member_list_banned_empty">"Não há usuários banidos nesta sala."</string>
<string name="screen_room_member_list_banned_empty">"Não há usuários banidos."</string>
<plurals name="screen_room_member_list_banned_header_title">
<item quantity="one">"%1$d banido"</item>
<item quantity="other">"%1$d banidos"</item>
</plurals>
<string name="screen_room_member_list_empty_search_subtitle">"Confira a ortografia ou tente uma nova busca"</string>
<string name="screen_room_member_list_empty_search_title">"Nenhum resultado para “%1$s”"</string>
<plurals name="screen_room_member_list_header_title">
<item quantity="one">"%1$d pessoa"</item>
<item quantity="other">"%1$d pessoas"</item>
@@ -78,8 +88,13 @@
<string name="screen_room_member_list_manage_member_unban_title">"Desbanir da sala"</string>
<string name="screen_room_member_list_mode_banned">"Banidos"</string>
<string name="screen_room_member_list_mode_members">"Membros"</string>
<string name="screen_room_member_list_role_administrator">"Somente administradores"</string>
<string name="screen_room_member_list_role_moderator">"Administradores e moderadores"</string>
<plurals name="screen_room_member_list_pending_header_title">
<item quantity="one">"%1$d convidado"</item>
<item quantity="other">"%1$d convidados"</item>
</plurals>
<string name="screen_room_member_list_pending_status">"Pendente"</string>
<string name="screen_room_member_list_role_administrator">"Administradores"</string>
<string name="screen_room_member_list_role_moderator">"Moderador"</string>
<string name="screen_room_member_list_role_owner">"Proprietário"</string>
<string name="screen_room_member_list_room_members_header_title">"Membros da sala"</string>
<string name="screen_room_member_list_unbanning_user">"Desbanindo %1$s"</string>
@@ -106,14 +121,15 @@
<string name="screen_room_roles_and_permissions_messages_and_content">"Mensagens e conteúdo"</string>
<string name="screen_room_roles_and_permissions_moderators">"Moderadores"</string>
<string name="screen_room_roles_and_permissions_owners">"Proprietários"</string>
<string name="screen_room_roles_and_permissions_permissions_header">"Permissões"</string>
<string name="screen_room_roles_and_permissions_reset">"Redefinir permissões"</string>
<string name="screen_room_roles_and_permissions_reset_confirm_description">"Depois de redefinir as permissões, você perderá as configurações atuais."</string>
<string name="screen_room_roles_and_permissions_reset_confirm_title">"Redefinir permissões?"</string>
<string name="screen_room_roles_and_permissions_roles_header">"Cargos"</string>
<string name="screen_room_roles_and_permissions_room_details">"Detalhes da sala"</string>
<string name="screen_room_roles_and_permissions_title">"Cargos e permissões"</string>
<string name="screen_security_and_privacy_add_room_address_action">"Adicionar endereço da sala"</string>
<string name="screen_security_and_privacy_ask_to_join_option_description">"Qualquer pessoa pode pedir para entrar na sala, mas um administrador ou moderador terá que aceitar o pedido."</string>
<string name="screen_security_and_privacy_add_room_address_action">"Adicionar endereço"</string>
<string name="screen_security_and_privacy_ask_to_join_option_description">"Qualquer um pode pedir acesso, mas um administrador terá que aceitar o pedido."</string>
<string name="screen_security_and_privacy_ask_to_join_option_title">"Pedir para entrar"</string>
<string name="screen_security_and_privacy_enable_encryption_alert_confirm_button_title">"Sim, ativar a criptografia"</string>
<string name="screen_security_and_privacy_enable_encryption_alert_description">"Uma vez ativada, a criptografia de uma sala não pode ser desativada. O histórico de mensagens só será visível para os membros da sala desde que foram convidados ou desde que entraram na sala.
@@ -123,16 +139,18 @@ Não recomendamos que você ative a criptografia para salas que qualquer pessoa
<string name="screen_security_and_privacy_encryption_section_footer">"Uma vez ativada, a criptografia não poderá ser desativada."</string>
<string name="screen_security_and_privacy_encryption_section_header">"Criptografia"</string>
<string name="screen_security_and_privacy_encryption_toggle_title">"Ativar a criptografia de ponta a ponta"</string>
<string name="screen_security_and_privacy_room_access_anyone_option_description">"Qualquer um pode encontrar e entrar"</string>
<string name="screen_security_and_privacy_room_access_anyone_option_description">"Qualquer um pode entrar"</string>
<string name="screen_security_and_privacy_room_access_anyone_option_title">"Qualquer pessoa"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"As pessoas só podem participar se forem convidadas"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Somente para convidados"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Acesso à sala"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"No momento, não há suporte aos espaços"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Apenas pessoas convidadas podem entrar."</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Privado"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Acesso"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Membros do espaço"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Você precisará de um endereço de sala para torná-la visível no diretório."</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"No momento, não há suporte aos espaços"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Você precisará de um endereço para torná-la visível no diretório."</string>
<string name="screen_security_and_privacy_room_address_section_header">"Endereço publicado"</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Permitir que esta sala seja encontrada pesquisando diretório de salas públicas de %1$s"</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_title">"Visível no diretório de salas públicas"</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_description">"Permite que seja encontrada ao buscar no diretório público."</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_title">"Visível no diretório público"</string>
<string name="screen_security_and_privacy_room_history_anyone_option_title">"Qualquer pessoa"</string>
<string name="screen_security_and_privacy_room_history_section_header">"Quem pode ler o histórico"</string>
<string name="screen_security_and_privacy_room_history_since_invite_option_title">"Somente membros, desde que foram convidados"</string>
@@ -140,5 +158,7 @@ Não recomendamos que você ative a criptografia para salas que qualquer pessoa
<string name="screen_security_and_privacy_room_publishing_section_footer">"Os endereços das salas são formas de encontrar e acessar as salas. Isso também garante que você possa compartilhar facilmente sua sala com outras pessoas.
Você pode optar por publicar sua sala no diretório público de salas do seu servidor-casa."</string>
<string name="screen_security_and_privacy_room_publishing_section_header">"Publicação da sala"</string>
<string name="screen_security_and_privacy_room_visibility_section_footer">"Os endereços das salas são formas de encontrar e acessar as salas. Isso também garante que você possa compartilhá-las facilmente com outras pessoas."</string>
<string name="screen_security_and_privacy_room_visibility_section_header">"Visibilidade"</string>
<string name="screen_security_and_privacy_title">"Segurança e privacidade"</string>
</resources>

View File

@@ -130,8 +130,8 @@ Não recomendamos ativar a cifragem em salas que qualquer pessoa possa encontrar
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Só é possível entrar tendo um convite"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Apenas por convite"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Acesso à sala"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Os espaços ainda não estão implementados"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Membros do espaço"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Os espaços ainda não estão implementados"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"É necessário um endereço para tornar a sala visível no diretório."</string>
<string name="screen_security_and_privacy_room_address_section_header">"Endereço da sala"</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Permite que esta sala seja encontrada através do diretório público do %1$s."</string>

View File

@@ -130,8 +130,8 @@ Nu recomandăm activarea criptării pentru camerele pe care oricine le poate gă
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Persoanele se pot alătura numai dacă invitate"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Doar pe bază de invitație"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Acces la cameră"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Spațiile nu sunt momentan suportate."</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Membrii spațiului"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Spațiile nu sunt momentan suportate."</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Veți avea nevoie de o adresă de cameră pentru a o face vizibilă în director."</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Permiteți găsirea acestei camere prin căutarea în directorul de camere publice al %1$s"</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_title">"Vizibilă în directorul de camere publice"</string>

View File

@@ -137,8 +137,8 @@
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Присоединиться могут только приглашенные люди."</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Только по приглашению"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Доступ"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Пространства в настоящее время не поддерживаются."</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Участники пространства"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Пространства в настоящее время не поддерживаются."</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Вам понадобится адрес комнаты, чтобы сделать ее видимой в каталоге."</string>
<string name="screen_security_and_privacy_room_address_section_header">"Адрес"</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Опубликовать %1$s в каталоге публичных комнат"</string>

View File

@@ -131,8 +131,8 @@ To môže brániť správnemu fungovaniu robotov a premostení. Neodporúčame p
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Ľudia sa môžu pripojiť len vtedy, ak sú pozvaní"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Iba na pozvánku"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Prístup do miestnosti"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Priestory momentálne nie sú podporované"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Členovia priestoru"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Priestory momentálne nie sú podporované"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Budete potrebovať adresu miestnosti, aby bola viditeľná v adresári."</string>
<string name="screen_security_and_privacy_room_address_section_header">"Adresa miestnosti"</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Umožniť vyhľadanie tejto miestnosti v adresári verejných miestností %1$s"</string>

View File

@@ -128,8 +128,8 @@ Vi rekommenderar inte att aktivera kryptering för rum som vem som helst kan hit
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Användare kan bara gå med om de är inbjudna"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Endast inbjudan"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Tillgång till rum"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Utrymmen stöds för närvarande inte"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Utrymmesmedlemmar"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Utrymmen stöds för närvarande inte"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Du behöver en rumsadress för att göra den synlig i katalogen."</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Tillåt att detta rum hittas genom att söka i den offentliga rumskatalogen på %1$s"</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_title">"Synlig i katalogen för offentliga rum"</string>

View File

@@ -120,8 +120,8 @@ Herkesin bulabileceği ve katılabileceği odalar için şifrelemenin etkinleşt
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"İnsanlar yalnızca davet edildiklerinde katılabilirler"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Yalnızca davet"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Oda Erişimi"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Alanlar şu anda desteklenmiyor"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Alan üyeleri"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Alanlar şu anda desteklenmiyor"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Dizinde görünür hale getirmek için bir oda adresine ihtiyacınız olacak."</string>
<string name="screen_security_and_privacy_room_address_section_header">"Oda adresi"</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Bu odanın %1$s genel oda dizininde arama yapılarak bulunmasına izin verin"</string>

View File

@@ -129,8 +129,8 @@
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Люди можуть приєднатися, лише якщо їх запросили"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Лише запрошені"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Доступ до кімнати"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Простори наразі не підтримуються"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Учасники простору"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Простори наразі не підтримуються"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Вам знадобиться адреса кімнати, щоб зробити її видимою в каталозі."</string>
<string name="screen_security_and_privacy_room_address_section_header">"Адреса кімнати"</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Дозвольте, щоб цю кімнату можна було знайти за допомогою пошуку в каталозі загальнодоступних кімнат %1$s "</string>

View File

@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_edit_room_address_room_address_section_footer">"Katalogda korinadigan qilish uchun xona manzili kerak boladi."</string>
<string name="screen_edit_room_address_title">"Xona manzili"</string>
<string name="screen_notification_settings_edit_failed_updating_default_mode">"Bildirishnoma sozlamalarini yangilashda xatolik yuz berdi."</string>
<string name="screen_notification_settings_mentions_only_disclaimer">"Uy serveringiz shifrlangan xonalarda ushbu imkoniyatni qoʻllab-quvvatlamaydi, shuning uchun baʼzi xonalardagi xabarlarni olmasligingiz mumkin."</string>
<string name="screen_polls_history_title">"Soʻrovnomalar"</string>
@@ -18,13 +20,17 @@
<string name="screen_room_change_role_administrators_title">"Administratorlarni tahrirlash"</string>
<string name="screen_room_change_role_confirm_add_admin_description">"Bu amalni bekor qila olmaysiz. Siz foydalanuvchini ozingiz bilan bir xil quvvat darajasiga ega bolishga undayapsiz."</string>
<string name="screen_room_change_role_confirm_add_admin_title">"Admin qoshilsinmi?"</string>
<string name="screen_room_change_role_confirm_change_owners_description">"Bu amalni bekor qila olmaysiz. Siz egalikni tanlangan foydalanuvchilarga otkazmoqdasiz. Tark etsangiz, bu doimiy boladi."</string>
<string name="screen_room_change_role_confirm_change_owners_title">"Egalik huquqini otkazasizmi?"</string>
<string name="screen_room_change_role_confirm_demote_self_action">"Pastga tushirish"</string>
<string name="screen_room_change_role_confirm_demote_self_description">"Siz oʻzingizni imtiyozlardan mahrum qilayotganingiz sababli, bu ozgarishni bekor qila olmaysiz. Agar xonadagi songgi imtiyozli foydalanuvchi bolsangiz, imtiyozlarni qayta tiklash imkonsiz boladi."</string>
<string name="screen_room_change_role_confirm_demote_self_title">"Oz darajangizni pasaytirmoqchimisiz?"</string>
<string name="screen_room_change_role_invited_member_name">"%1$s (Jarayonda)"</string>
<string name="screen_room_change_role_invited_member_name_android">"(Kutilmoqda)"</string>
<string name="screen_room_change_role_moderators_admin_section_footer">"Administratorlar avtomatik ravishda moderator imtiyozlariga ega"</string>
<string name="screen_room_change_role_moderators_owner_section_footer">"Egalar avtomatik ravishda administrator huquqlariga ega."</string>
<string name="screen_room_change_role_moderators_title">"Moderatorlarni tahrirlash"</string>
<string name="screen_room_change_role_owners_title">"Egalarni tanlang"</string>
<string name="screen_room_change_role_section_administrators">"Adminlar"</string>
<string name="screen_room_change_role_section_moderators">"Moderatorlar"</string>
<string name="screen_room_change_role_section_users">"Azolar"</string>
@@ -45,13 +51,16 @@
<string name="screen_room_details_invite_people_title">"Odamlarni taklif qiling"</string>
<string name="screen_room_details_leave_conversation_title">"Suhbatni tark etish"</string>
<string name="screen_room_details_leave_room_title">"Xonani tark etish"</string>
<string name="screen_room_details_media_gallery_title">"Media va fayllar"</string>
<string name="screen_room_details_notification_mode_custom">"Maxsus"</string>
<string name="screen_room_details_notification_mode_default">"Standart"</string>
<string name="screen_room_details_notification_title">"Bildirishnomalar"</string>
<string name="screen_room_details_pinned_events_row_title">"Qadalgan xabarlar"</string>
<string name="screen_room_details_profile_row_title">"Profil"</string>
<string name="screen_room_details_requests_to_join_title">"Qoshilish uchun sorovlar"</string>
<string name="screen_room_details_roles_and_permissions">"Rollar va ruxsatlar"</string>
<string name="screen_room_details_room_name_label">"Xona nomi"</string>
<string name="screen_room_details_security_and_privacy_title">"Xavfsizlik va maxfiylik"</string>
<string name="screen_room_details_security_title">"Xavfsizlik"</string>
<string name="screen_room_details_share_room_title">"Xonani baham ko\'ring"</string>
<string name="screen_room_details_title">"Xona haqida maʼlumot"</string>
@@ -66,10 +75,12 @@
<string name="screen_room_member_list_manage_member_remove_confirmation_kick">"Faqat aʻzoni olib tashlash"</string>
<string name="screen_room_member_list_manage_member_unban_action">"Taqiqni bekor qilish"</string>
<string name="screen_room_member_list_manage_member_unban_message">"Agar taklif qilinsa, ular bu xonaga qayta qoshilishlari mumkin."</string>
<string name="screen_room_member_list_manage_member_unban_title">"Xonadan taqiqni olib tashlash"</string>
<string name="screen_room_member_list_mode_banned">"Taqiqlangan"</string>
<string name="screen_room_member_list_mode_members">"Azolar"</string>
<string name="screen_room_member_list_role_administrator">"Faqat adminlar"</string>
<string name="screen_room_member_list_role_moderator">"Adminlar va moderatorlar"</string>
<string name="screen_room_member_list_role_owner">"Egasi"</string>
<string name="screen_room_member_list_room_members_header_title">"Xona a\'zolari"</string>
<string name="screen_room_member_list_unbanning_user">"Taqiqni bekor qilish %1$s"</string>
<string name="screen_room_notification_settings_allow_custom">"Moslashtirilgan sozlamalarga ruxsat bering"</string>
@@ -87,20 +98,46 @@
<string name="screen_room_notification_settings_mode_mentions_and_keywords">"Faqat eslatmalar va kalit so\'zlar"</string>
<string name="screen_room_notification_settings_room_custom_settings_title">"Bu xonada menga xabar bering"</string>
<string name="screen_room_roles_and_permissions_admins">"Adminlar"</string>
<string name="screen_room_roles_and_permissions_admins_and_owners">"Adminlar va egalari"</string>
<string name="screen_room_roles_and_permissions_change_my_role">"Rolimni ozgartirish"</string>
<string name="screen_room_roles_and_permissions_change_role_demote_to_member">"Aʼzolikka tushirish"</string>
<string name="screen_room_roles_and_permissions_change_role_demote_to_moderator">"Moderatorga pasaytirish"</string>
<string name="screen_room_roles_and_permissions_member_moderation">"Aʻzo moderatsiyasi"</string>
<string name="screen_room_roles_and_permissions_messages_and_content">"Xabarlar va kontent"</string>
<string name="screen_room_roles_and_permissions_moderators">"Moderatorlar"</string>
<string name="screen_room_roles_and_permissions_owners">"Egalari"</string>
<string name="screen_room_roles_and_permissions_reset">"Ruxsatlarni tiklash"</string>
<string name="screen_room_roles_and_permissions_reset_confirm_description">"Ruxsatlarni asliga qaytargach, joriy sozlamalarni yoʻqotasiz."</string>
<string name="screen_room_roles_and_permissions_reset_confirm_title">"Ruxsatlar asliga qaytarilsinmi?"</string>
<string name="screen_room_roles_and_permissions_roles_header">"Rollar"</string>
<string name="screen_room_roles_and_permissions_room_details">"Xona tafsilotlari"</string>
<string name="screen_room_roles_and_permissions_title">"Rollar va ruxsatlar"</string>
<string name="screen_security_and_privacy_add_room_address_action">"Xona manzilini kiritish"</string>
<string name="screen_security_and_privacy_ask_to_join_option_description">"Xonaga qoshilishni istalgan kishi sorashi mumkin, lekin administrator yoki moderator sorovni qabul qilishi kerak"</string>
<string name="screen_security_and_privacy_ask_to_join_option_title">"Qoshilishni sorang"</string>
<string name="screen_security_and_privacy_enable_encryption_alert_confirm_button_title">"Ha, shifrlashni yoqish"</string>
<string name="screen_security_and_privacy_enable_encryption_alert_description">"Yoqilgandan song, xona uchun shifrlashni ochirib bolmaydi. Xabarlar tarixi faqat xona azolari taklif qilinganidan yoki xonaga qoshilganidan keyingi davrdan boshlab korinadi. Xona azolaridan tashqari hech kim xabarlarni oqiy olmaydi. Bu botlar va kopriklarning togri ishlashiga tosqinlik qilishi mumkin.
Shu sababli, har kim topishi va qoshilishi mumkin bolgan xonalar uchun shifrlashni yoqishni tavsiya etmaymiz."</string>
<string name="screen_security_and_privacy_enable_encryption_alert_title">"Shifrlash yoqilsinmi?"</string>
<string name="screen_security_and_privacy_encryption_section_footer">"Yoqilgandan keyin shifrlashni faolsizlantirish imkonsiz."</string>
<string name="screen_security_and_privacy_encryption_section_header">"Shifrlash"</string>
<string name="screen_security_and_privacy_encryption_toggle_title">"End-to-end shifrlashni yoqish"</string>
<string name="screen_security_and_privacy_room_access_anyone_option_description">"Istalgan kishi topishi va qoshilishi mumkin"</string>
<string name="screen_security_and_privacy_room_access_anyone_option_title">"Har kim"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Odamlar faqat taklif qilingan taqdirdagina qoshilishi mumkin"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Faqat taklif qilish"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Xonaga kirish huquqi"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Maydon azolari"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Hozirda maydonlar qollab-quvvatlanmaydi"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Katalogda korinadigan qilish uchun xona manzili kerak boladi."</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Bu xonani %1$s umumiy xonalar royxatidan qidirib topish imkoniyatini berish"</string>
<string name="screen_security_and_privacy_room_directory_visibility_toggle_title">"Umumiy xona royxatida korinadi"</string>
<string name="screen_security_and_privacy_room_history_anyone_option_title">"Har kim"</string>
<string name="screen_security_and_privacy_room_history_section_header">"Tarixni kim oqiy oladi"</string>
<string name="screen_security_and_privacy_room_history_since_invite_option_title">"Taklif qilinganidan buyon faqat azolar"</string>
<string name="screen_security_and_privacy_room_history_since_selecting_option_title">"Azolar faqat bu parametr tanlanganidan keyin"</string>
<string name="screen_security_and_privacy_room_publishing_section_footer">"Xona manzillari xonalarni topish va ularga kirish usullaridir. Bu shuningdek xonangizni boshqalar bilan oson ulashish imkonini beradi.
Xonangizni oz homeserveringizning ommaviy xonalar royxatida elon qilishni tanlashingiz mumkin."</string>
<string name="screen_security_and_privacy_room_publishing_section_header">"xona nashriyoti"</string>
<string name="screen_security_and_privacy_title">"Xavfsizlik va maxfiylik"</string>
</resources>

View File

@@ -135,8 +135,8 @@
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"僅受邀者才能加入。"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"僅限邀請"</string>
<string name="screen_security_and_privacy_room_access_section_header">"存取權"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"目前不支援空間"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"空間成員"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"目前不支援空間"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"您需要地址才能在公開目錄中顯示。"</string>
<string name="screen_security_and_privacy_room_address_section_header">"地址"</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"允許透過搜尋 %1$s 公開聊天室目錄找到此聊天室"</string>

View File

@@ -68,7 +68,7 @@
<string name="screen_room_details_title">"聊天室信息"</string>
<string name="screen_room_details_topic_title">"主题"</string>
<string name="screen_room_details_updating_room">"正在更新聊天室……"</string>
<string name="screen_room_member_list_banned_empty">"此聊天室里没有被封禁的用户。"</string>
<string name="screen_room_member_list_banned_empty">"没有被封禁的用户。"</string>
<plurals name="screen_room_member_list_header_title">
<item quantity="other">"%1$d 人"</item>
</plurals>
@@ -129,8 +129,8 @@
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"只有受邀者才能加入"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"仅限邀请"</string>
<string name="screen_security_and_privacy_room_access_section_header">"房间访问权限"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"目前不支持空间"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"空间成员"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"目前不支持空间"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"你需要房间地址才能使其在目录中可见。"</string>
<string name="screen_security_and_privacy_room_address_section_header">"房间地址"</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"允许通过搜索 %1$s 的公共房间目录来发现此房间"</string>

View File

@@ -141,11 +141,15 @@ We do not recommend enabling encryption for rooms that anyone can find and join.
<string name="screen_security_and_privacy_encryption_toggle_title">"Enable end-to-end encryption"</string>
<string name="screen_security_and_privacy_room_access_anyone_option_description">"Anyone can join."</string>
<string name="screen_security_and_privacy_room_access_anyone_option_title">"Anyone"</string>
<string name="screen_security_and_privacy_room_access_footer">"Choose which spaces members can join this room without an invitation. %1$s"</string>
<string name="screen_security_and_privacy_room_access_footer_manage_spaces_action">"Manage spaces"</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_description">"Only invited people can join."</string>
<string name="screen_security_and_privacy_room_access_invite_only_option_title">"Invite only"</string>
<string name="screen_security_and_privacy_room_access_section_header">"Access"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_description">"Spaces are not currently supported"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_multiple_parents_description">"Anyone in authorized spaces can join."</string>
<string name="screen_security_and_privacy_room_access_space_members_option_single_parent_description">"Anyone in %1$s can join."</string>
<string name="screen_security_and_privacy_room_access_space_members_option_title">"Space members"</string>
<string name="screen_security_and_privacy_room_access_space_members_option_unavailable_description">"Spaces are not currently supported"</string>
<string name="screen_security_and_privacy_room_address_section_footer">"Youll need an address in order to make it visible in the public directory."</string>
<string name="screen_security_and_privacy_room_address_section_header">"Address"</string>
<string name="screen_security_and_privacy_room_directory_visibility_section_footer">"Allow for this room to be found by searching %1$s public room directory"</string>

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