Merge branch 'develop' into feature/fga/csam_preferences_server

This commit is contained in:
ganfra 2025-06-30 21:42:06 +02:00
commit 773fa1657a
623 changed files with 4661 additions and 2049 deletions

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="error_no_compatible_app_found">"Der blev ikke fundet nogen kompatibel app til at håndtere denne handling."</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="common_date_this_month">"Този месец"</string>
</resources>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="common_date_date_at_time">"%1$s kl. %2$s"</string>
<string name="common_date_this_month">"Denne måned"</string>
</resources>

View file

@ -17,7 +17,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.rememberTextMeasurer
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
@ -36,18 +36,21 @@ private const val MAX_COUNT_STRING = "+$MAX_COUNT"
* @param count The number to display. If the number is greater than [MAX_COUNT], the counter will display [MAX_COUNT_STRING].
* If the number is less than 1, the counter will not be displayed.
* @param modifier The modifier to apply to this layout.
* @param textStyle The style to apply to the text inside the counter.
* @param isCritical If true, the counter will use a critical color scheme, otherwise it will use an accent color scheme.
*/
@Composable
fun CounterAtom(
count: Int,
modifier: Modifier = Modifier,
textStyle: TextStyle = CounterAtomDefaults.textStyle,
isCritical: Boolean = false,
) {
if (count < 1) return
val countAsText = when (count) {
in 0..MAX_COUNT -> count.toString()
else -> MAX_COUNT_STRING
}
val textStyle = ElementTheme.typography.fontBodyMdMedium
val textMeasurer = rememberTextMeasurer()
// Measure the maximum count string size
val textLayoutResult = textMeasurer.measure(
@ -58,19 +61,30 @@ fun CounterAtom(
val squareSize = maxOf(textSize.width, textSize.height)
Box(
modifier = modifier
.size(squareSize.toDp() + 1.dp)
.clip(CircleShape)
.background(ElementTheme.colors.iconSuccessPrimary)
.size(squareSize.toDp() + 1.dp)
.clip(CircleShape)
.background(
if (isCritical) {
ElementTheme.colors.iconCriticalPrimary
} else {
ElementTheme.colors.iconAccentPrimary
}
)
) {
Text(
modifier = Modifier.align(Alignment.Center),
text = countAsText,
style = textStyle,
color = Color.White,
color = ElementTheme.colors.textOnSolidPrimary,
)
}
}
object CounterAtomDefaults {
val textStyle: TextStyle
@Composable get() = ElementTheme.typography.fontBodyMdMedium
}
@PreviewsDayNight
@Composable
internal fun CounterAtomPreview() = ElementPreview {
@ -79,5 +93,6 @@ internal fun CounterAtomPreview() = ElementPreview {
CounterAtom(count = 4)
CounterAtom(count = 99)
CounterAtom(count = 100)
CounterAtom(count = 4, isCritical = true)
}
}

View file

@ -23,13 +23,16 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.CompositingStrategy
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.LayoutDirection
import io.element.android.libraries.designsystem.modifiers.a11yClickLabel
import io.element.android.libraries.designsystem.preview.ElementThemedPreview
import io.element.android.libraries.designsystem.preview.PreviewGroup
import io.element.android.libraries.designsystem.text.toPx
import io.element.android.libraries.testtags.TestTags
import io.element.android.libraries.testtags.testTag
import io.element.android.libraries.ui.strings.CommonStrings
/** Ratio between the box size (120 on Figma) and the avatar size (75 on Figma). */
private const val SIZE_RATIO = 1.6f
@ -49,6 +52,7 @@ fun DmAvatars(
val boxSizePx = boxSize.toPx()
val otherAvatarRadius = otherUserAvatarData.size.dp.toPx() / 2
val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
val actionView = stringResource(CommonStrings.action_view)
Box(
modifier = modifier.size(boxSize),
) {
@ -56,6 +60,7 @@ fun DmAvatars(
Avatar(
avatarData = userAvatarData,
avatarType = AvatarType.User,
contentDescription = userAvatarData.url?.let { stringResource(CommonStrings.a11y_your_avatar) },
modifier = Modifier
.align(Alignment.BottomStart)
.graphicsLayer {
@ -82,11 +87,13 @@ fun DmAvatars(
.clickable(enabled = userAvatarData.url != null) {
userAvatarData.url?.let { openAvatarPreview(it) }
}
.a11yClickLabel(userAvatarData.url?.let { actionView })
)
// Draw other user avatar
Avatar(
avatarData = otherUserAvatarData,
avatarType = AvatarType.User,
contentDescription = otherUserAvatarData.url?.let { stringResource(CommonStrings.a11y_other_user_avatar) },
modifier = Modifier
.align(Alignment.TopEnd)
.clip(CircleShape)
@ -94,6 +101,7 @@ fun DmAvatars(
otherUserAvatarData.url?.let { openOtherAvatarPreview(it) }
}
.testTag(TestTags.memberDetailAvatar)
.a11yClickLabel(otherUserAvatarData.url?.let { actionView })
)
}
}

View file

@ -12,6 +12,8 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.semantics.onClick
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.unit.dp
fun Modifier.clickableIfNotNull(onClick: (() -> Unit)? = null): Modifier = this.then(
@ -29,3 +31,18 @@ fun Modifier.niceClickable(
.clickable { onClick() }
.padding(horizontal = 4.dp)
}
fun Modifier.a11yClickLabel(
label: String?,
): Modifier = then(
if (label != null) {
Modifier.semantics {
onClick(
label = label,
action = null,
)
}
} else {
Modifier
}
)

View file

@ -0,0 +1,111 @@
/*
* Copyright 2025 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.libraries.designsystem.theme.components
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.NavigationBarDefaults
import androidx.compose.material3.contentColorFor
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.libraries.designsystem.preview.ElementThemedPreview
import io.element.android.libraries.designsystem.preview.PreviewGroup
@Composable
fun NavigationBar(
modifier: Modifier = Modifier,
containerColor: Color = ElementNavigationBarDefaults.containerColor,
contentColor: Color = MaterialTheme.colorScheme.contentColorFor(containerColor),
tonalElevation: Dp = ElementNavigationBarDefaults.tonalElevation,
windowInsets: WindowInsets = ElementNavigationBarDefaults.windowInsets,
content: @Composable RowScope.() -> Unit
) {
androidx.compose.material3.NavigationBar(
modifier = modifier,
containerColor = containerColor,
contentColor = contentColor,
tonalElevation = tonalElevation,
windowInsets = windowInsets,
content = content
)
}
object ElementNavigationBarDefaults {
val containerColor: Color
@Composable get() = if (ElementTheme.isLightTheme) {
ElementTheme.colors.bgSubtlePrimary
} else {
ElementTheme.colors.textOnSolidPrimary
}
val tonalElevation: Dp = NavigationBarDefaults.Elevation
val windowInsets: WindowInsets
@Composable get() = NavigationBarDefaults.windowInsets
}
@Preview(group = PreviewGroup.AppBars)
@Composable
internal fun NavigationBarPreview() = ElementThemedPreview {
NavigationBar {
NavigationBarItem(
icon = {
NavigationBarIcon(
imageVector = CompoundIcons.ChatSolid(),
count = 5,
isCritical = false,
)
},
label = {
NavigationBarText(
text = "Chats"
)
},
selected = true,
onClick = {},
)
NavigationBarItem(
icon = {
NavigationBarIcon(
imageVector = CompoundIcons.ChatSolid(),
count = 5,
isCritical = true,
)
},
label = {
NavigationBarText(
text = "Teams"
)
},
selected = false,
onClick = {},
)
NavigationBarItem(
icon = {
NavigationBarIcon(
imageVector = CompoundIcons.ChatSolid(),
count = 0,
isCritical = false,
)
},
label = {
NavigationBarText(
text = "Other"
)
},
selected = false,
onClick = {},
)
}
}

View file

@ -0,0 +1,38 @@
/*
* Copyright 2025 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.libraries.designsystem.theme.components
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.offset
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
import io.element.android.libraries.designsystem.atomic.atoms.CounterAtom
@Composable
fun NavigationBarIcon(
imageVector: ImageVector,
modifier: Modifier = Modifier,
count: Int = 0,
isCritical: Boolean = false,
) {
Box(modifier) {
Icon(
imageVector = imageVector,
contentDescription = null,
)
CounterAtom(
modifier = Modifier.offset(11.dp, (-11).dp),
textStyle = ElementTheme.typography.fontBodyXsMedium,
count = count,
isCritical = isCritical,
)
}
}

View file

@ -0,0 +1,54 @@
/*
* Copyright 2025 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.libraries.designsystem.theme.components
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.RowScope
import androidx.compose.material3.NavigationBarItem
import androidx.compose.material3.NavigationBarItemColors
import androidx.compose.material3.NavigationBarItemDefaults
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import io.element.android.compound.theme.ElementTheme
@Composable
fun RowScope.NavigationBarItem(
selected: Boolean,
onClick: () -> Unit,
icon: @Composable () -> Unit,
modifier: Modifier = Modifier,
enabled: Boolean = true,
label: @Composable (() -> Unit)? = null,
alwaysShowLabel: Boolean = true,
colors: NavigationBarItemColors = ElementNavigationBarItemDefaults.colors(),
interactionSource: MutableInteractionSource? = null
) {
NavigationBarItem(
selected = selected,
onClick = onClick,
icon = icon,
modifier = modifier,
enabled = enabled,
label = label,
alwaysShowLabel = alwaysShowLabel,
colors = colors,
interactionSource = interactionSource,
)
}
object ElementNavigationBarItemDefaults {
@Composable
fun colors() = NavigationBarItemDefaults.colors().copy(
selectedIconColor = ElementTheme.colors.iconPrimary,
selectedTextColor = ElementTheme.colors.textPrimary,
unselectedIconColor = ElementTheme.colors.iconTertiary,
unselectedTextColor = ElementTheme.colors.textDisabled,
selectedIndicatorColor = Color.Companion.Transparent,
)
}

View file

@ -0,0 +1,24 @@
/*
* Copyright 2025 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.libraries.designsystem.theme.components
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import io.element.android.compound.theme.ElementTheme
@Composable
fun NavigationBarText(
text: String,
modifier: Modifier = Modifier,
) {
Text(
modifier = modifier,
text = text,
style = ElementTheme.typography.fontBodySmMedium,
)
}

View file

@ -22,9 +22,9 @@
<string name="state_event_room_invite_you">"%1$s ви покани"</string>
<string name="state_event_room_join">"%1$s се присъедини към стаята"</string>
<string name="state_event_room_join_by_you">"Вие се присъединихте към стаята"</string>
<string name="state_event_room_knock">"%1$s поиска да се присъедини"</string>
<string name="state_event_room_knock_accepted">"%1$s позволи на %2$s да се присъедини"</string>
<string name="state_event_room_knock_accepted_by_you">"%1$s ви позволи да се присъедините"</string>
<string name="state_event_room_knock">"%1$s иска да се присъедини"</string>
<string name="state_event_room_knock_accepted">"%1$s получи достъп до %2$s"</string>
<string name="state_event_room_knock_accepted_by_you">"Вие позволихте на %1$s да се присъедини"</string>
<string name="state_event_room_knock_by_you">"Вие поискахте да се присъедините"</string>
<string name="state_event_room_knock_retracted">"%1$s вече не се интересува от присъединяване"</string>
<string name="state_event_room_leave">"%1$s напусна стаята"</string>
@ -35,6 +35,10 @@
<string name="state_event_room_name_removed_by_you">"Вие премахнахте името на стаята"</string>
<string name="state_event_room_none">"%1$s не направи промени"</string>
<string name="state_event_room_none_by_you">"Не направихте промени"</string>
<string name="state_event_room_pinned_events_changed">"%1$s промени закачените съобщения"</string>
<string name="state_event_room_pinned_events_changed_by_you">"Вие променихте закачените съобщения"</string>
<string name="state_event_room_pinned_events_pinned">"%1$s закачи съобщение"</string>
<string name="state_event_room_pinned_events_pinned_by_you">"Вие закачихте съобщение"</string>
<string name="state_event_room_reject">"%1$s отхвърли поканата"</string>
<string name="state_event_room_reject_by_you">"Вие отхвърлихте поканата"</string>
<string name="state_event_room_remove">"%1$s премахна %2$s"</string>

View file

@ -0,0 +1,73 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="state_event_avatar_changed_too">"(avataren blev også ændret)"</string>
<string name="state_event_avatar_url_changed">"%1$s ændrede sin avatar"</string>
<string name="state_event_avatar_url_changed_by_you">"Du har ændret din avatar"</string>
<string name="state_event_demoted_to_member">"%1$s blev nedgraderet til medlem"</string>
<string name="state_event_demoted_to_moderator">"%1$s blev nedgraderet til moderator"</string>
<string name="state_event_display_name_changed_from">"%1$s ændrede sit viste navn fra %2$s til %3$s"</string>
<string name="state_event_display_name_changed_from_by_you">"Du har ændret dit viste navn fra %1$s til %2$s"</string>
<string name="state_event_display_name_removed">"%1$s fjernede sit viste navn (det var %2$s )"</string>
<string name="state_event_display_name_removed_by_you">"Du fjernede dit viste navn (det var%1$s)"</string>
<string name="state_event_display_name_set">"%1$s har sat deres visningsnavn til %2$s"</string>
<string name="state_event_display_name_set_by_you">"Du har indstillet dit viste navn til %1$s"</string>
<string name="state_event_promoted_to_administrator">"%1$s blev forfremmet til admin"</string>
<string name="state_event_promoted_to_moderator">"%1$s blev forfremmet til moderator"</string>
<string name="state_event_room_avatar_changed">"%1$s ændrede rummets avatar"</string>
<string name="state_event_room_avatar_changed_by_you">"Du ændrede rummets avatar"</string>
<string name="state_event_room_avatar_removed">"%1$s fjernede rummets avatar"</string>
<string name="state_event_room_avatar_removed_by_you">"Du fjernede rummets avatar"</string>
<string name="state_event_room_ban">"%1$s bortviste %2$s"</string>
<string name="state_event_room_ban_by_you">"Du bortviste %1$s"</string>
<string name="state_event_room_ban_by_you_with_reason">"Du spærrede %1$s: %2$s"</string>
<string name="state_event_room_ban_with_reason">"%1$s spærrede %2$s: %3$s"</string>
<string name="state_event_room_created">"%1$s skabte rummet"</string>
<string name="state_event_room_created_by_you">"Du skabte rummet"</string>
<string name="state_event_room_invite">"%1$sinviterede %2$s"</string>
<string name="state_event_room_invite_accepted">"%1$s accepterede invitationen"</string>
<string name="state_event_room_invite_accepted_by_you">"Du har accepteret invitationen"</string>
<string name="state_event_room_invite_by_you">"Du inviterede %1$s"</string>
<string name="state_event_room_invite_you">"%1$s inviterede dig"</string>
<string name="state_event_room_join">"%1$s sluttede sig til rummet"</string>
<string name="state_event_room_join_by_you">"Du sluttede dig til rummet"</string>
<string name="state_event_room_knock">"%1$s anmoder om at deltage"</string>
<string name="state_event_room_knock_accepted">"%1$s har givet adgang til %2$s"</string>
<string name="state_event_room_knock_accepted_by_you">"Du tillod %1$s at være med"</string>
<string name="state_event_room_knock_by_you">"Du har anmodet om at deltage"</string>
<string name="state_event_room_knock_denied">"%1$s har afvist %2$ss anmodning om at deltage"</string>
<string name="state_event_room_knock_denied_by_you">"Du har afvist %1$ss anmodning om at deltage"</string>
<string name="state_event_room_knock_denied_you">"%1$s afviste din anmodning om at deltage"</string>
<string name="state_event_room_knock_retracted">"%1$s er ikke længere interesseret i at deltage"</string>
<string name="state_event_room_knock_retracted_by_you">"Du har annulleret din anmodning om at deltage"</string>
<string name="state_event_room_leave">"%1$s forlod rummet"</string>
<string name="state_event_room_leave_by_you">"Du forlod rummet"</string>
<string name="state_event_room_name_changed">"%1$s ændrede rummets navn til: %2$s"</string>
<string name="state_event_room_name_changed_by_you">"Du ændrede rummets navn til: %1$s"</string>
<string name="state_event_room_name_removed">"%1$s fjernede rummets navn"</string>
<string name="state_event_room_name_removed_by_you">"Du fjernede rummets navn"</string>
<string name="state_event_room_none">"%1$s foretog ingen ændringer"</string>
<string name="state_event_room_none_by_you">"Du har ikke foretaget nogen ændringer"</string>
<string name="state_event_room_pinned_events_changed">"%1$s ændrede de fastgjorte beskeder"</string>
<string name="state_event_room_pinned_events_changed_by_you">"Du har ændret de fastgjorte beskeder"</string>
<string name="state_event_room_pinned_events_pinned">"%1$s fastgjorde en besked"</string>
<string name="state_event_room_pinned_events_pinned_by_you">"Du har fastgjort en besked"</string>
<string name="state_event_room_pinned_events_unpinned">"%1$s frigjorde en besked"</string>
<string name="state_event_room_pinned_events_unpinned_by_you">"Du frigjorde en besked"</string>
<string name="state_event_room_reject">"%1$s afviste invitationen"</string>
<string name="state_event_room_reject_by_you">"Du afviste invitationen"</string>
<string name="state_event_room_remove">"%1$s fjernede %2$s"</string>
<string name="state_event_room_remove_by_you">"Du fjernede %1$s"</string>
<string name="state_event_room_remove_by_you_with_reason">"Du fjernede %1$s :%2$s"</string>
<string name="state_event_room_remove_with_reason">"%1$s fjernede %2$s: %3$s"</string>
<string name="state_event_room_third_party_invite">"%1$s har sendt en invitation til %2$s om at deltage i rummet"</string>
<string name="state_event_room_third_party_invite_by_you">"Du har sendt en invitation til %1$s om at deltage i rummet"</string>
<string name="state_event_room_third_party_revoked_invite">"%1$s tilbagekaldte invitationen til %2$s om at være med i rummet"</string>
<string name="state_event_room_third_party_revoked_invite_by_you">"Du tilbagekaldte invitationen til %1$s om at være med i rummet"</string>
<string name="state_event_room_topic_changed">"%1$s ændrede emnet til: %2$s"</string>
<string name="state_event_room_topic_changed_by_you">"Du har ændret emnet til: %1$s"</string>
<string name="state_event_room_topic_removed">"%1$s fjernede rummets emne"</string>
<string name="state_event_room_topic_removed_by_you">"Du har fjernet rummets emne"</string>
<string name="state_event_room_unban">"%1$s ophævede bortvisningen af %2$s"</string>
<string name="state_event_room_unban_by_you">"Du har fjernet bortvisningen af %1$s"</string>
<string name="state_event_room_unknown_membership_change">"%1$s har foretaget en ukendt ændring af deres medlemskab"</string>
</resources>

View file

@ -13,21 +13,23 @@
<string name="state_event_display_name_set_by_you">"Όρισες το εμφανιζόμενο όνομά σου σε %1$s"</string>
<string name="state_event_promoted_to_administrator">"Ο χρήστης %1$s προήχθη σε διαχειριστής"</string>
<string name="state_event_promoted_to_moderator">"Ο χρήστης %1$s προήχθη σε συντονιστής"</string>
<string name="state_event_room_avatar_changed">"Ο χρήστης %1$s άλλαξε το άβαταρ του δωματίου"</string>
<string name="state_event_room_avatar_changed_by_you">"Άλλαξες το άβαταρ του δωματίου"</string>
<string name="state_event_room_avatar_removed">"Ο χρήστης %1$s αφαίρεσε το άβαταρ του δωματίου"</string>
<string name="state_event_room_avatar_removed_by_you">"Αφαίρεσες το άβαταρ του δωματίου"</string>
<string name="state_event_room_avatar_changed">"%1$s άλλαξε την εικόνα προφίλ της αίθουσας"</string>
<string name="state_event_room_avatar_changed_by_you">"Αλλάξατε την εικόνα προφίλ της αίθουσας"</string>
<string name="state_event_room_avatar_removed">"%1$s αφαίρεσε την εικόνα προφίλ της αίθουσας"</string>
<string name="state_event_room_avatar_removed_by_you">"Αφαιρέσατε την εικόνα προφίλ της αίθουσας"</string>
<string name="state_event_room_ban">"Ο χρήστης %1$s απέκλεισε τον χρήστη %2$s"</string>
<string name="state_event_room_ban_by_you">"Απέκλεισες τον χρήστη %1$s"</string>
<string name="state_event_room_created">"Ο χρήστης %1$s δημιούργησε το δωμάτιο"</string>
<string name="state_event_room_created_by_you">"Εσύ δημιούργησες το δωμάτιο"</string>
<string name="state_event_room_ban_by_you_with_reason">"Απέκλεισες %1$s: %2$s"</string>
<string name="state_event_room_ban_with_reason">"%1$s απέκλεισε %2$s: %3$s"</string>
<string name="state_event_room_created">"%1$s δημιούργησε την αίθουσα"</string>
<string name="state_event_room_created_by_you">"Δημιουργήσατε την αίθουσα"</string>
<string name="state_event_room_invite">"Ο χρήστης %1$s προσκάλεσε τον χρήστη %2$s"</string>
<string name="state_event_room_invite_accepted">"Ο χρήστης %1$s αποδέχτηκε την πρόσκληση"</string>
<string name="state_event_room_invite_accepted_by_you">"Αποδέχτηκες την πρόσκληση"</string>
<string name="state_event_room_invite_by_you">"Προσκάλεσες τον χρήστη %1$s"</string>
<string name="state_event_room_invite_you">"Ο χρήστης %1$s σέ προσκάλεσε"</string>
<string name="state_event_room_join">"Ο χρήστης %1$s συμμετέχει στο δωμάτιο"</string>
<string name="state_event_room_join_by_you">"Μπήκες στο δωμάτιο"</string>
<string name="state_event_room_join">"%1$s εντάχθηκε στην αίθουσα"</string>
<string name="state_event_room_join_by_you">"Ενταχθήκατε στην αίθουσα"</string>
<string name="state_event_room_knock">"Ο χρήστης %1$s ζητάει να συμμετάσχει"</string>
<string name="state_event_room_knock_accepted">"Ο χρήστης %1$s επέτρεψε τον χρήστη %2$s"</string>
<string name="state_event_room_knock_accepted_by_you">"Επέστρεψες στον χρήστη%1$s να συμμετάσχει"</string>
@ -37,12 +39,12 @@
<string name="state_event_room_knock_denied_you">"Ο χρήστης %1$s απέρριψε το αίτημά σου για συμμετοχή"</string>
<string name="state_event_room_knock_retracted">"Ο χρήστης %1$s δεν ενδιαφέρεται πλέον να συμμετάσχει"</string>
<string name="state_event_room_knock_retracted_by_you">"Ακύρωσες το αίτημά σου για συμμετοχή"</string>
<string name="state_event_room_leave">"Ο χρήστης %1$s αποχώρησε από το δωμάτιο"</string>
<string name="state_event_room_leave_by_you">"Έφυγες από το δωμάτιο"</string>
<string name="state_event_room_name_changed">"Ο χρήστης %1$s άλλαξε το όνομα του δωματίου σε: %2$s"</string>
<string name="state_event_room_name_changed_by_you">"Άλλαξες το όνομα του δωματίου σε: %1$s"</string>
<string name="state_event_room_name_removed">"Ο χρήστης %1$s αφαίρεσε το όνομα του δωματίου"</string>
<string name="state_event_room_name_removed_by_you">"Αφαίρεσες το όνομα του δωματίου"</string>
<string name="state_event_room_leave">"%1$s αποχώρησε από την αίθουσα"</string>
<string name="state_event_room_leave_by_you">"Αποχωρήσατε από την αίθουσα"</string>
<string name="state_event_room_name_changed">"%1$s άλλαξε το όνομα της αίθουσας σε: %2$s"</string>
<string name="state_event_room_name_changed_by_you">"Αλλάξατε το όνομα της αίθουσας σε: %1$s"</string>
<string name="state_event_room_name_removed">"%1$s αφαίρεσε το όνομα της αίθουσας"</string>
<string name="state_event_room_name_removed_by_you">"Αφαιρέσατε το όνομα της αίθουσας"</string>
<string name="state_event_room_none">"Ο χρήστης %1$s δεν έκανε καμία αλλαγή"</string>
<string name="state_event_room_none_by_you">"Δεν έκανες καμία αλλαγή"</string>
<string name="state_event_room_pinned_events_changed">"Ο χρήστης %1$s άλλαξε τα καρφιτσωμένα μηνύματα"</string>
@ -55,14 +57,16 @@
<string name="state_event_room_reject_by_you">"Απέρριψες την πρόσκληση"</string>
<string name="state_event_room_remove">"Ο χρήστης %1$s αφαίρεσε τον χρήστη %2$s"</string>
<string name="state_event_room_remove_by_you">"Αφαίρεσες τον χρήστη %1$s"</string>
<string name="state_event_room_third_party_invite">"Ο χρήστης %1$s έστειλε πρόσκληση στον χρήστη %2$s για συμμετοχή στο δωμάτιο"</string>
<string name="state_event_room_third_party_invite_by_you">"Στείλατε μια πρόσκληση στον χρήστη %1$s για να γίνει μέλος στο δωμάτιο"</string>
<string name="state_event_room_third_party_revoked_invite">"Ο χρήστης %1$s ανακάλεσε την πρόσκληση συμμετοχής του χρήστη %2$s στο δωμάτιο"</string>
<string name="state_event_room_third_party_revoked_invite_by_you">"Ανακάλεσες την πρόσκληση για συμμετοχή του χρήστη %1$s στο δωμάτιο"</string>
<string name="state_event_room_remove_by_you_with_reason">"Αφαίρεσες %1$s: %2$s"</string>
<string name="state_event_room_remove_with_reason">"%1$s αφαιρέθηκε %2$s: %3$s"</string>
<string name="state_event_room_third_party_invite">"%1$s έστειλε πρόσκληση στον χρήστη %2$s για ένταξη στην αίθουσα"</string>
<string name="state_event_room_third_party_invite_by_you">"Στείλατε πρόσκληση στον χρήστη %1$s για να ενταχθεί στην αίθουσα"</string>
<string name="state_event_room_third_party_revoked_invite">"%1$s ανακάλεσε την πρόσκληση στον χρήστη %2$s για να ενταχθεί στην αίθουσα"</string>
<string name="state_event_room_third_party_revoked_invite_by_you">"Ανακαλέσατε την πρόσκληση για ένταξη του χρήστη %1$s στην αίθουσα"</string>
<string name="state_event_room_topic_changed">"Ο χρήστης %1$s άλλαξε το θέμα σε: %2$s"</string>
<string name="state_event_room_topic_changed_by_you">"Άλλαξες το θέμα σε: %1$s"</string>
<string name="state_event_room_topic_removed">"Ο χρήστης %1$s αφαίρεσε το θέμα του δωματίου"</string>
<string name="state_event_room_topic_removed_by_you">"Αφαίρεσες το θέμα του δωματίου"</string>
<string name="state_event_room_topic_removed">"%1$s αφαίρεσε το θέμα της αίθουσας"</string>
<string name="state_event_room_topic_removed_by_you">"Αφαιρέσατε το θέμα της αίθουσας"</string>
<string name="state_event_room_unban">"Ο χρήστης %1$s έκανε άρση αποκλεισμού στον χρήστη %2$s"</string>
<string name="state_event_room_unban_by_you">"Έκανες άρση αποκλεισμού στον χρήστη %1$s"</string>
<string name="state_event_room_unknown_membership_change">"Ο χρήστης %1$s έκανε μια άγνωστη αλλαγή στην ιδιότητα μέλους του."</string>

View file

@ -27,5 +27,5 @@ fun BaseRoom.toAnalyticsViewRoom(
}
private fun BaseRoom.toActiveSpace(): ViewRoom.ActiveSpace {
return if (info().isPublic) ViewRoom.ActiveSpace.Public else ViewRoom.ActiveSpace.Private
return if (info().isPublic == true) ViewRoom.ActiveSpace.Public else ViewRoom.ActiveSpace.Private
}

View file

@ -14,10 +14,10 @@ import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.room.history.RoomHistoryVisibility
import io.element.android.libraries.matrix.api.room.join.JoinRule
import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
import io.element.android.libraries.matrix.api.room.tombstone.SuccessorRoom
import io.element.android.libraries.matrix.api.user.MatrixUser
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.ImmutableMap
@Immutable
data class RoomInfo(
@ -28,7 +28,7 @@ data class RoomInfo(
val rawName: String?,
val topic: String?,
val avatarUrl: String?,
val isPublic: Boolean,
val isPublic: Boolean?,
val isDirect: Boolean,
val isEncrypted: Boolean?,
val joinRule: JoinRule?,
@ -48,7 +48,7 @@ data class RoomInfo(
val activeMembersCount: Long,
val invitedMembersCount: Long,
val joinedMembersCount: Long,
val userPowerLevels: ImmutableMap<UserId, Long>,
val roomPowerLevels: RoomPowerLevels?,
val highlightCount: Long,
val notificationCount: Long,
val userDefinedNotificationMode: RoomNotificationMode?,

View file

@ -22,7 +22,7 @@ import kotlinx.coroutines.flow.map
*/
fun BaseRoom.usersWithRole(role: RoomMember.Role): Flow<ImmutableList<RoomMember>> {
return roomInfoFlow
.map { it.userPowerLevels.filter { (_, powerLevel) -> RoomMember.Role.forPowerLevel(powerLevel) == role } }
.map { it.roomPowerLevels?.users.orEmpty().filter { (_, powerLevel) -> RoomMember.Role.forPowerLevel(powerLevel) == role } }
.combine(membersStateFlow) { powerLevels, membersState ->
membersState.activeRoomMembers()
.filter { powerLevels.containsKey(it.userId) }

View file

@ -0,0 +1,16 @@
/*
* Copyright 2025 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.libraries.matrix.api.room.powerlevels
import io.element.android.libraries.matrix.api.core.UserId
import kotlinx.collections.immutable.ImmutableMap
data class RoomPowerLevels(
val values: RoomPowerLevelsValues,
val users: ImmutableMap<UserId, Long>,
)

View file

@ -33,5 +33,5 @@ data class RoomPreviewInfo(
/** the membership of the current user. */
val membership: CurrentUserMembership?,
/** The room's join rule. */
val joinRule: JoinRule,
val joinRule: JoinRule?,
)

View file

@ -131,7 +131,7 @@ class RustMatrixClient(
private val sessionStore: SessionStore,
private val appCoroutineScope: CoroutineScope,
private val sessionDelegate: RustClientSessionDelegate,
innerSyncService: ClientSyncService,
private val innerSyncService: ClientSyncService,
dispatchers: CoroutineDispatchers,
baseCacheDirectory: File,
clock: SystemClock,
@ -541,7 +541,7 @@ class RustMatrixClient(
}
override suspend fun clearCache() {
innerClient.clearCaches()
innerClient.clearCaches(innerSyncService)
destroy()
}

View file

@ -34,6 +34,7 @@ import org.matrix.rustcomponents.sdk.SlidingSyncVersionBuilder
import org.matrix.rustcomponents.sdk.use
import timber.log.Timber
import uniffi.matrix_sdk_crypto.CollectStrategy
import uniffi.matrix_sdk_crypto.DecryptionSettings
import uniffi.matrix_sdk_crypto.TrustRequirement
import java.io.File
import javax.inject.Inject
@ -120,12 +121,14 @@ class RustMatrixClientFactory @Inject constructor(
CollectStrategy.ERROR_ON_VERIFIED_USER_PROBLEM
}
)
.roomDecryptionTrustRequirement(
trustRequirement = if (featureFlagService.isFeatureEnabled(FeatureFlags.OnlySignedDeviceIsolationMode)) {
TrustRequirement.CROSS_SIGNED_OR_LEGACY
} else {
TrustRequirement.UNTRUSTED
}
.decryptionSettings(
DecryptionSettings(
senderDeviceTrustRequirement = if (featureFlagService.isFeatureEnabled(FeatureFlags.OnlySignedDeviceIsolationMode)) {
TrustRequirement.CROSS_SIGNED_OR_LEGACY
} else {
TrustRequirement.UNTRUSTED
}
)
)
.enableShareHistoryOnInvite(featureFlagService.isFeatureEnabled(FeatureFlags.EnableKeyShareOnInvite))
.run {

View file

@ -139,7 +139,7 @@ class JoinedRustRoom(
}
init {
val powerLevelChanges = roomInfoFlow.map { it.userPowerLevels }.distinctUntilChanged()
val powerLevelChanges = roomInfoFlow.map { it.roomPowerLevels }.distinctUntilChanged()
val membershipChanges = liveTimeline.membershipChangeEventReceived.onStart { emit(Unit) }
combine(membershipChanges, powerLevelChanges) { _, _ -> }
// Skip initial one

View file

@ -14,12 +14,13 @@ import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.room.CurrentUserMembership
import io.element.android.libraries.matrix.api.room.RoomInfo
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.impl.room.history.map
import io.element.android.libraries.matrix.impl.room.join.map
import io.element.android.libraries.matrix.impl.room.member.RoomMemberMapper
import io.element.android.libraries.matrix.impl.room.powerlevels.RoomPowerLevelsValuesMapper
import io.element.android.libraries.matrix.impl.room.tombstone.map
import kotlinx.collections.immutable.ImmutableMap
import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toPersistentMap
import org.matrix.rustcomponents.sdk.Membership
@ -28,6 +29,7 @@ import uniffi.matrix_sdk_base.EncryptionState
import org.matrix.rustcomponents.sdk.Membership as RustMembership
import org.matrix.rustcomponents.sdk.RoomInfo as RustRoomInfo
import org.matrix.rustcomponents.sdk.RoomNotificationMode as RustRoomNotificationMode
import org.matrix.rustcomponents.sdk.RoomPowerLevels as RustRoomPowerLevels
class RoomInfoMapper {
fun map(rustRoomInfo: RustRoomInfo): RoomInfo = rustRoomInfo.let {
@ -55,7 +57,7 @@ class RoomInfoMapper {
activeMembersCount = it.activeMembersCount.toLong(),
invitedMembersCount = it.invitedMembersCount.toLong(),
joinedMembersCount = it.joinedMembersCount.toLong(),
userPowerLevels = mapPowerLevels(it.userPowerLevels),
roomPowerLevels = it.powerLevels?.let(::mapPowerLevels),
highlightCount = it.highlightCount.toLong(),
notificationCount = it.notificationCount.toLong(),
userDefinedNotificationMode = it.cachedUserDefinedNotificationMode?.map(),
@ -96,6 +98,9 @@ fun RoomHero.map(): MatrixUser = MatrixUser(
avatarUrl = avatarUrl
)
fun mapPowerLevels(powerLevels: Map<String, Long>): ImmutableMap<UserId, Long> {
return powerLevels.mapKeys { (key, _) -> UserId(key) }.toPersistentMap()
fun mapPowerLevels(roomPowerLevels: RustRoomPowerLevels): RoomPowerLevels {
return RoomPowerLevels(
values = RoomPowerLevelsValuesMapper.map(roomPowerLevels.values()),
users = roomPowerLevels.userPowerLevels().mapKeys { (key, _) -> UserId(key) }.toPersistentMap()
)
}

View file

@ -27,7 +27,7 @@ object RoomPreviewInfoMapper {
roomType = info.roomType.map(),
isHistoryWorldReadable = info.isHistoryWorldReadable.orFalse(),
membership = info.membership?.map(),
joinRule = info.joinRule.map(),
joinRule = info.joinRule?.map(),
)
}
}

View file

@ -28,14 +28,6 @@ internal class MatrixTimelineDiffProcessor(
private val _membershipChangeEventReceived = MutableSharedFlow<Unit>(extraBufferCapacity = 1)
val membershipChangeEventReceived: Flow<Unit> = _membershipChangeEventReceived
suspend fun postItems(items: List<TimelineItem>) {
updateTimelineItems {
Timber.v("Update timeline items from postItems (with ${items.size} items) on ${Thread.currentThread()}")
val mappedItems = items.map { it.asMatrixTimelineItem() }
addAll(0, mappedItems)
}
}
suspend fun postDiffs(diffs: List<TimelineDiff>) {
updateTimelineItems {
Timber.v("Update timeline items from postDiffs (with ${diffs.size} items) on ${Thread.currentThread()}")

View file

@ -48,7 +48,6 @@ import io.element.android.libraries.matrix.impl.timeline.postprocessor.TypingNot
import io.element.android.libraries.matrix.impl.timeline.reply.InReplyToMapper
import io.element.android.libraries.matrix.impl.util.MessageEventContent
import io.element.android.services.toolbox.api.systemclock.SystemClock
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@ -95,9 +94,6 @@ class RustTimeline(
private val featureFlagsService: FeatureFlagService,
onNewSyncedEvent: () -> Unit,
) : Timeline {
private val initLatch = CompletableDeferred<Unit>()
private val isTimelineInitialized = MutableStateFlow(false)
private val _timelineItems: MutableSharedFlow<List<MatrixTimelineItem>> =
MutableSharedFlow(replay = 1, extraBufferCapacity = Int.MAX_VALUE)
@ -119,8 +115,6 @@ class RustTimeline(
timeline = inner,
timelineCoroutineScope = coroutineScope,
timelineDiffProcessor = timelineDiffProcessor,
initLatch = initLatch,
isTimelineInitialized = isTimelineInitialized,
dispatcher = dispatcher,
onNewSyncedEvent = onNewSyncedEvent,
)
@ -181,7 +175,6 @@ class RustTimeline(
// Use NonCancellable to avoid breaking the timeline when the coroutine is cancelled.
override suspend fun paginate(direction: Timeline.PaginationDirection): Result<Boolean> = withContext(NonCancellable) {
withContext(dispatcher) {
initLatch.await()
runCatchingExceptions {
if (!canPaginate(direction)) throw TimelineException.CannotPaginate
updatePaginationStatus(direction) { it.copy(isPaginating = true) }
@ -203,7 +196,6 @@ class RustTimeline(
}
private fun canPaginate(direction: Timeline.PaginationDirection): Boolean {
if (!isTimelineInitialized.value) return false
return when (direction) {
Timeline.PaginationDirection.BACKWARDS -> backwardPaginationStatus.value.canPaginate
Timeline.PaginationDirection.FORWARDS -> forwardPaginationStatus.value.canPaginate
@ -215,12 +207,10 @@ class RustTimeline(
backwardPaginationStatus,
forwardPaginationStatus,
joinedRoom.roomInfoFlow.map { it.creator to it.isDm }.distinctUntilChanged(),
isTimelineInitialized,
) { timelineItems,
backwardPaginationStatus,
forwardPaginationStatus,
(roomCreator, isDm),
isTimelineInitialized ->
(roomCreator, isDm) ->
withContext(dispatcher) {
timelineItems
.let { items ->
@ -234,7 +224,6 @@ class RustTimeline(
.let { items ->
loadingIndicatorsPostProcessor.process(
items = items,
isTimelineInitialized = isTimelineInitialized,
hasMoreToLoadBackward = backwardPaginationStatus.hasMoreToLoad,
hasMoreToLoadForward = forwardPaginationStatus.hasMoreToLoad,
)
@ -244,10 +233,7 @@ class RustTimeline(
}
// Keep lastForwardIndicatorsPostProcessor last
.let { items ->
lastForwardIndicatorsPostProcessor.process(
items = items,
isTimelineInitialized = isTimelineInitialized,
)
lastForwardIndicatorsPostProcessor.process(items = items)
}
}
}.onStart {
@ -262,7 +248,6 @@ class RustTimeline(
}
private fun CoroutineScope.fetchMembers() = launch(dispatcher) {
initLatch.await()
try {
inner.fetchMembers()
} catch (exception: Exception) {

View file

@ -8,37 +8,26 @@
package io.element.android.libraries.matrix.impl.timeline
import io.element.android.libraries.core.coroutine.childScope
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.cancelChildren
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.ensureActive
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import org.matrix.rustcomponents.sdk.Timeline
import org.matrix.rustcomponents.sdk.TimelineChange
import org.matrix.rustcomponents.sdk.TimelineDiff
import org.matrix.rustcomponents.sdk.TimelineItem
import uniffi.matrix_sdk_ui.EventItemOrigin
private const val INITIAL_MAX_SIZE = 50
/**
* This class is responsible for subscribing to a timeline and post the items/diffs to the timelineDiffProcessor.
* It will also trigger a callback when a new synced event is received.
* It will also handle the initial items and make sure they are posted before any diff.
*/
internal class TimelineItemsSubscriber(
timelineCoroutineScope: CoroutineScope,
dispatcher: CoroutineDispatcher,
private val timeline: Timeline,
private val timelineDiffProcessor: MatrixTimelineDiffProcessor,
private val initLatch: CompletableDeferred<Unit>,
private val isTimelineInitialized: MutableStateFlow<Boolean>,
private val onNewSyncedEvent: () -> Unit,
) {
private var subscriptionCount = 0
@ -57,7 +46,7 @@ internal class TimelineItemsSubscriber(
if (diffs.any { diff -> diff.eventOrigin() == EventItemOrigin.SYNC }) {
onNewSyncedEvent()
}
postDiffs(diffs)
timelineDiffProcessor.postDiffs(diffs)
}
.launchIn(coroutineScope)
}
@ -78,35 +67,4 @@ internal class TimelineItemsSubscriber(
}
subscriptionCount--
}
private suspend fun postItems(items: List<TimelineItem>) = coroutineScope {
if (items.isEmpty()) {
// Makes sure to post empty list if there is no item, so you can handle empty state.
timelineDiffProcessor.postItems(emptyList())
} else {
// Split the initial items in multiple list as there is no pagination in the cached data, so we can post timelineItems asap.
items.chunked(INITIAL_MAX_SIZE).reversed().forEach {
ensureActive()
timelineDiffProcessor.postItems(it)
}
}
isTimelineInitialized.value = true
initLatch.complete(Unit)
}
private suspend fun postDiffs(diffs: List<TimelineDiff>) {
val diffsToProcess = diffs.toMutableList()
if (!isTimelineInitialized.value) {
val resetDiff = diffsToProcess.firstOrNull { it.change() == TimelineChange.RESET }
if (resetDiff != null) {
// Keep using the postItems logic so we can post the timelineItems asap.
postItems(resetDiff.reset() ?: emptyList())
diffsToProcess.remove(resetDiff)
}
}
initLatch.await()
if (diffsToProcess.isNotEmpty()) {
timelineDiffProcessor.postDiffs(diffsToProcess)
}
}
}

View file

@ -22,9 +22,7 @@ class LastForwardIndicatorsPostProcessor(
fun process(
items: List<MatrixTimelineItem>,
isTimelineInitialized: Boolean,
): List<MatrixTimelineItem> {
if (!isTimelineInitialized) return items
// We don't need to add the last forward indicator if we are not in the FOCUSED_ON_EVENT mode
if (mode != Timeline.Mode.FOCUSED_ON_EVENT) {
return items

View file

@ -16,11 +16,9 @@ import io.element.android.services.toolbox.api.systemclock.SystemClock
class LoadingIndicatorsPostProcessor(private val systemClock: SystemClock) {
fun process(
items: List<MatrixTimelineItem>,
isTimelineInitialized: Boolean,
hasMoreToLoadBackward: Boolean,
hasMoreToLoadForward: Boolean,
): List<MatrixTimelineItem> {
if (!isTimelineInitialized) return items
val shouldAddForwardLoadingIndicator = hasMoreToLoadForward && items.isNotEmpty()
val currentTimestamp = systemClock.epochMillis()
return buildList {

View file

@ -16,11 +16,12 @@ import io.element.android.libraries.matrix.api.widget.CallWidgetSettingsProvider
import io.element.android.libraries.matrix.api.widget.MatrixWidgetSettings
import io.element.android.services.analytics.api.AnalyticsService
import kotlinx.coroutines.flow.first
import org.matrix.rustcomponents.sdk.EncryptionSystem
import org.matrix.rustcomponents.sdk.VirtualElementCallWidgetOptions
import org.matrix.rustcomponents.sdk.newVirtualElementCallWidget
import uniffi.matrix_sdk.EncryptionSystem
import uniffi.matrix_sdk.HeaderStyle
import uniffi.matrix_sdk.VirtualElementCallWidgetOptions
import javax.inject.Inject
import org.matrix.rustcomponents.sdk.Intent as CallIntent
import uniffi.matrix_sdk.Intent as CallIntent
@ContributesBinding(AppScope::class)
class DefaultCallWidgetSettingsProvider @Inject constructor(
@ -48,8 +49,10 @@ class DefaultCallWidgetSettingsProvider @Inject constructor(
sentryDsn = callAnalyticsCredentialsProvider.sentryDsn.takeIf { isAnalyticsEnabled },
sentryEnvironment = if (buildMeta.buildType == BuildType.RELEASE) "RELEASE" else "DEBUG",
parentUrl = null,
// For backwards compatibility, it'll be ignored in recent versions of Element Call
hideHeader = true,
controlledMediaDevices = true,
header = HeaderStyle.APP_BAR,
)
val rustWidgetSettings = newVirtualElementCallWidget(options)
return MatrixWidgetSettings.fromRustWidgetSettings(rustWidgetSettings)

View file

@ -52,7 +52,6 @@ fun aRustNotificationRoomInfo(
isEncrypted: Boolean? = true,
isDirect: Boolean = false,
joinRule: JoinRule? = null,
isPublic: Boolean = true,
) = NotificationRoomInfo(
displayName = displayName,
avatarUrl = avatarUrl,
@ -61,7 +60,6 @@ fun aRustNotificationRoomInfo(
isEncrypted = isEncrypted,
isDirect = isDirect,
joinRule = joinRule,
isPublic = isPublic,
)
fun aRustNotificationEventTimeline(

View file

@ -8,6 +8,7 @@
package io.element.android.libraries.matrix.impl.fixtures.factories
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiRoomPowerLevels
import io.element.android.libraries.matrix.test.A_ROOM_ID
import io.element.android.libraries.matrix.test.A_ROOM_NAME
import org.matrix.rustcomponents.sdk.JoinRule
@ -17,6 +18,7 @@ import org.matrix.rustcomponents.sdk.RoomHistoryVisibility
import org.matrix.rustcomponents.sdk.RoomInfo
import org.matrix.rustcomponents.sdk.RoomMember
import org.matrix.rustcomponents.sdk.RoomNotificationMode
import org.matrix.rustcomponents.sdk.RoomPowerLevels
import org.matrix.rustcomponents.sdk.SuccessorRoom
import uniffi.matrix_sdk_base.EncryptionState
@ -39,7 +41,7 @@ fun aRustRoomInfo(
activeMembersCount: ULong = 0uL,
invitedMembersCount: ULong = 0uL,
joinedMembersCount: ULong = 0uL,
userPowerLevels: Map<String, Long> = mapOf(),
roomPowerLevels: RoomPowerLevels = FakeFfiRoomPowerLevels(),
highlightCount: ULong = 0uL,
notificationCount: ULong = 0uL,
userDefinedNotificationMode: RoomNotificationMode? = null,
@ -73,7 +75,7 @@ fun aRustRoomInfo(
activeMembersCount = activeMembersCount,
invitedMembersCount = invitedMembersCount,
joinedMembersCount = joinedMembersCount,
userPowerLevels = userPowerLevels,
powerLevels = roomPowerLevels,
highlightCount = highlightCount,
notificationCount = notificationCount,
cachedUserDefinedNotificationMode = userDefinedNotificationMode,

View file

@ -25,6 +25,7 @@ import org.matrix.rustcomponents.sdk.PusherKind
import org.matrix.rustcomponents.sdk.RoomDirectorySearch
import org.matrix.rustcomponents.sdk.Session
import org.matrix.rustcomponents.sdk.SessionVerificationController
import org.matrix.rustcomponents.sdk.SyncService
import org.matrix.rustcomponents.sdk.SyncServiceBuilder
import org.matrix.rustcomponents.sdk.TaskHandle
import org.matrix.rustcomponents.sdk.UnableToDecryptDelegate
@ -62,7 +63,7 @@ class FakeFfiClient(
) = Unit
override suspend fun deletePusher(identifiers: PusherIdentifiers) = Unit
override suspend fun clearCaches() = simulateLongTask { clearCachesResult() }
override suspend fun clearCaches(syncService: SyncService?) = simulateLongTask { clearCachesResult() }
override suspend fun setUtdDelegate(utdDelegate: UnableToDecryptDelegate) = withUtdHook(utdDelegate)
override suspend fun getSessionVerificationController(): SessionVerificationController = FakeFfiSessionVerificationController()
override suspend fun ignoredUsers(): List<String> {

View file

@ -18,7 +18,7 @@ import org.matrix.rustcomponents.sdk.RequestConfig
import org.matrix.rustcomponents.sdk.SlidingSyncVersionBuilder
import uniffi.matrix_sdk.BackupDownloadStrategy
import uniffi.matrix_sdk_crypto.CollectStrategy
import uniffi.matrix_sdk_crypto.TrustRequirement
import uniffi.matrix_sdk_crypto.DecryptionSettings
class FakeFfiClientBuilder : ClientBuilder(NoPointer) {
override fun addRootCertificates(certificates: List<ByteArray>) = this
@ -27,7 +27,7 @@ class FakeFfiClientBuilder : ClientBuilder(NoPointer) {
override fun backupDownloadStrategy(backupDownloadStrategy: BackupDownloadStrategy) = this
override fun disableAutomaticTokenRefresh() = this
override fun disableBuiltInRootCertificates() = this
override fun roomDecryptionTrustRequirement(trustRequirement: TrustRequirement) = this
override fun decryptionSettings(decryptionSettings: DecryptionSettings): ClientBuilder = this
override fun disableSslVerification() = this
override fun homeserverUrl(url: String) = this
override fun sessionPassphrase(passphrase: String?) = this

View file

@ -0,0 +1,33 @@
/*
* Copyright 2025 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.libraries.matrix.impl.fixtures.fakes
import org.matrix.rustcomponents.sdk.NoPointer
import org.matrix.rustcomponents.sdk.RoomPowerLevels
import org.matrix.rustcomponents.sdk.RoomPowerLevelsValues
class FakeFfiRoomPowerLevels(
private val values: RoomPowerLevelsValues = defaultFfiRoomPowerLevelValues(),
private val users: Map<String, Long> = emptyMap(),
) : RoomPowerLevels(NoPointer) {
override fun values(): RoomPowerLevelsValues = values
override fun userPowerLevels(): Map<String, Long> = users
}
fun defaultFfiRoomPowerLevelValues() = RoomPowerLevelsValues(
ban = 50,
invite = 0,
kick = 50,
eventsDefault = 0,
redact = 50,
roomName = 100,
roomAvatar = 100,
roomTopic = 100,
stateDefault = 0,
usersDefault = 0,
)

View file

@ -16,10 +16,12 @@ import io.element.android.libraries.matrix.api.room.RoomInfo
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
import io.element.android.libraries.matrix.api.room.history.RoomHistoryVisibility
import io.element.android.libraries.matrix.api.room.join.JoinRule
import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.impl.fixtures.factories.aRustRoomHero
import io.element.android.libraries.matrix.impl.fixtures.factories.aRustRoomInfo
import io.element.android.libraries.matrix.impl.fixtures.factories.aRustRoomMember
import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiRoomPowerLevels
import io.element.android.libraries.matrix.test.AN_AVATAR_URL
import io.element.android.libraries.matrix.test.AN_EVENT_ID
import io.element.android.libraries.matrix.test.A_ROOM_ALIAS
@ -28,8 +30,9 @@ import io.element.android.libraries.matrix.test.A_USER_ID
import io.element.android.libraries.matrix.test.A_USER_ID_3
import io.element.android.libraries.matrix.test.A_USER_ID_6
import io.element.android.libraries.matrix.test.room.aRoomMember
import io.element.android.libraries.matrix.test.room.defaultRoomPowerLevelValues
import kotlinx.collections.immutable.persistentMapOf
import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toImmutableMap
import kotlinx.collections.immutable.toPersistentList
import org.junit.Test
import org.matrix.rustcomponents.sdk.Membership
@ -64,7 +67,7 @@ class RoomInfoMapperTest {
activeMembersCount = 2uL,
invitedMembersCount = 3uL,
joinedMembersCount = 4uL,
userPowerLevels = mapOf(A_USER_ID_6.value to 50L),
roomPowerLevels = FakeFfiRoomPowerLevels(users = mapOf(A_USER_ID_6.value to 50L)),
highlightCount = 10uL,
notificationCount = 11uL,
userDefinedNotificationMode = RustRoomNotificationMode.MUTE,
@ -99,7 +102,10 @@ class RoomInfoMapperTest {
activeMembersCount = 2L,
invitedMembersCount = 3L,
joinedMembersCount = 4L,
userPowerLevels = mapOf(A_USER_ID_6 to 50L).toImmutableMap(),
roomPowerLevels = RoomPowerLevels(
values = defaultRoomPowerLevelValues(),
users = persistentMapOf(A_USER_ID_6 to 50L)
),
highlightCount = 10L,
notificationCount = 11L,
userDefinedNotificationMode = RoomNotificationMode.MUTE,
@ -149,7 +155,7 @@ class RoomInfoMapperTest {
activeMembersCount = 2uL,
invitedMembersCount = 3uL,
joinedMembersCount = 4uL,
userPowerLevels = emptyMap(),
roomPowerLevels = FakeFfiRoomPowerLevels(),
highlightCount = 10uL,
notificationCount = 11uL,
userDefinedNotificationMode = null,
@ -184,7 +190,10 @@ class RoomInfoMapperTest {
activeMembersCount = 2L,
invitedMembersCount = 3L,
joinedMembersCount = 4L,
userPowerLevels = emptyMap<UserId, Long>().toImmutableMap(),
roomPowerLevels = RoomPowerLevels(
values = defaultRoomPowerLevelValues(),
users = persistentMapOf(),
),
highlightCount = 10L,
notificationCount = 11L,
userDefinedNotificationMode = null,

View file

@ -57,11 +57,6 @@ class RustTimelineTest {
)
)
)
with(awaitItem()) {
assertThat(size).isEqualTo(1)
// Typing notification
assertThat((get(0) as MatrixTimelineItem.Virtual).virtual).isEqualTo(VirtualTimelineItem.TypingNotification)
}
with(awaitItem()) {
assertThat(size).isEqualTo(2)
// The loading

View file

@ -16,10 +16,8 @@ import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiTimelineDi
import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiTimelineItem
import io.element.android.tests.testutils.lambda.lambdaError
import io.element.android.tests.testutils.lambda.lambdaRecorder
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runCurrent
@ -116,8 +114,6 @@ class TimelineItemsSubscriberTest {
private fun TestScope.createTimelineItemsSubscriber(
timeline: Timeline = FakeFfiTimeline(),
timelineItems: MutableSharedFlow<List<MatrixTimelineItem>> = MutableSharedFlow(replay = 1, extraBufferCapacity = Int.MAX_VALUE),
initLatch: CompletableDeferred<Unit> = CompletableDeferred(),
isTimelineInitialized: MutableStateFlow<Boolean> = MutableStateFlow(false),
onNewSyncedEvent: () -> Unit = { lambdaError() },
): TimelineItemsSubscriber {
return TimelineItemsSubscriber(
@ -125,8 +121,6 @@ private fun TestScope.createTimelineItemsSubscriber(
dispatcher = StandardTestDispatcher(testScheduler),
timeline = timeline,
timelineDiffProcessor = createMatrixTimelineDiffProcessor(timelineItems),
initLatch = initLatch,
isTimelineInitialized = isTimelineInitialized,
onNewSyncedEvent = onNewSyncedEvent,
)
}

View file

@ -18,21 +18,14 @@ class LastForwardIndicatorsPostProcessorTest {
@Test
fun `LastForwardIndicatorsPostProcessor does not alter the items with mode not FOCUSED_ON_EVENT`() {
val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.LIVE)
val result = sut.process(listOf(messageEvent), true)
assertThat(result).containsExactly(messageEvent)
}
@Test
fun `LastForwardIndicatorsPostProcessor does not alter the items with mode FOCUSED_ON_EVENT but timeline not initialized`() {
val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.FOCUSED_ON_EVENT)
val result = sut.process(listOf(messageEvent), false)
val result = sut.process(listOf(messageEvent))
assertThat(result).containsExactly(messageEvent)
}
@Test
fun `LastForwardIndicatorsPostProcessor add virtual items`() {
val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.FOCUSED_ON_EVENT)
val result = sut.process(listOf(messageEvent), true)
val result = sut.process(listOf(messageEvent))
assertThat(result).containsExactly(
messageEvent,
MatrixTimelineItem.Virtual(
@ -45,7 +38,7 @@ class LastForwardIndicatorsPostProcessorTest {
@Test
fun `LastForwardIndicatorsPostProcessor add virtual items on empty list`() {
val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.FOCUSED_ON_EVENT)
val result = sut.process(listOf(), true)
val result = sut.process(listOf())
assertThat(result).containsExactly(
MatrixTimelineItem.Virtual(
uniqueId = UniqueId("last_forward_indicator_fake_id"),
@ -58,9 +51,9 @@ class LastForwardIndicatorsPostProcessorTest {
fun `LastForwardIndicatorsPostProcessor add virtual items but does not alter the list if called a second time`() {
val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.FOCUSED_ON_EVENT)
// Process a first time
sut.process(listOf(messageEvent), true)
sut.process(listOf(messageEvent))
// Process a second time with the same Event
val result = sut.process(listOf(messageEvent), true)
val result = sut.process(listOf(messageEvent))
assertThat(result).containsExactly(
messageEvent,
MatrixTimelineItem.Virtual(
@ -74,9 +67,9 @@ class LastForwardIndicatorsPostProcessorTest {
fun `LastForwardIndicatorsPostProcessor add virtual items each time it is called with new Events`() {
val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.FOCUSED_ON_EVENT)
// Process a first time
sut.process(listOf(dayEvent, messageEvent), true)
sut.process(listOf(dayEvent, messageEvent))
// Process a second time with the same Event
val result = sut.process(listOf(dayEvent, messageEvent, messageEvent2), true)
val result = sut.process(listOf(dayEvent, messageEvent, messageEvent2))
assertThat(result).containsExactly(
dayEvent,
messageEvent,

View file

@ -16,25 +16,12 @@ import io.element.android.services.toolbox.test.systemclock.FakeSystemClock
import org.junit.Test
class LoadingIndicatorsPostProcessorTest {
@Test
fun `LoadingIndicatorsPostProcessor does not alter the items is the timeline is not initialized`() {
val sut = LoadingIndicatorsPostProcessor(FakeSystemClock())
val result = sut.process(
items = listOf(messageEvent, messageEvent2),
isTimelineInitialized = false,
hasMoreToLoadBackward = true,
hasMoreToLoadForward = true,
)
assertThat(result).containsExactly(messageEvent, messageEvent2)
}
@Test
fun `LoadingIndicatorsPostProcessor adds Loading indicator at the top of the list if hasMoreToLoadBackward is true`() {
val clock = FakeSystemClock()
val sut = LoadingIndicatorsPostProcessor(clock)
val result = sut.process(
items = listOf(messageEvent, messageEvent2),
isTimelineInitialized = true,
hasMoreToLoadBackward = true,
hasMoreToLoadForward = false,
)
@ -57,7 +44,6 @@ class LoadingIndicatorsPostProcessorTest {
val sut = LoadingIndicatorsPostProcessor(clock)
val result = sut.process(
items = listOf(messageEvent, messageEvent2),
isTimelineInitialized = true,
hasMoreToLoadBackward = false,
hasMoreToLoadForward = true,
)
@ -80,7 +66,6 @@ class LoadingIndicatorsPostProcessorTest {
val sut = LoadingIndicatorsPostProcessor(clock)
val result = sut.process(
items = listOf(messageEvent, messageEvent2),
isTimelineInitialized = true,
hasMoreToLoadBackward = true,
hasMoreToLoadForward = true,
)
@ -110,7 +95,6 @@ class LoadingIndicatorsPostProcessorTest {
val sut = LoadingIndicatorsPostProcessor(clock)
val result = sut.process(
items = listOf(),
isTimelineInitialized = true,
hasMoreToLoadBackward = true,
hasMoreToLoadForward = true,
)

View file

@ -225,7 +225,7 @@ class FakeBaseRoom(
override fun predecessorRoom(): PredecessorRoom? = predecessorRoomResult()
}
fun defaultRoomPowerLevels() = RoomPowerLevelsValues(
fun defaultRoomPowerLevelValues() = RoomPowerLevelsValues(
ban = 50,
invite = 0,
kick = 50,

View file

@ -17,6 +17,7 @@ import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
import io.element.android.libraries.matrix.api.room.history.RoomHistoryVisibility
import io.element.android.libraries.matrix.api.room.join.JoinRule
import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
import io.element.android.libraries.matrix.api.room.tombstone.SuccessorRoom
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.test.AN_AVATAR_URL
@ -24,7 +25,6 @@ import io.element.android.libraries.matrix.test.A_ROOM_ID
import io.element.android.libraries.matrix.test.A_ROOM_NAME
import io.element.android.libraries.matrix.test.A_ROOM_RAW_NAME
import io.element.android.libraries.matrix.test.A_ROOM_TOPIC
import kotlinx.collections.immutable.ImmutableMap
import kotlinx.collections.immutable.persistentMapOf
import kotlinx.collections.immutable.toImmutableList
@ -52,7 +52,10 @@ fun aRoomInfo(
notificationCount: Long = 0,
userDefinedNotificationMode: RoomNotificationMode? = null,
hasRoomCall: Boolean = false,
userPowerLevels: ImmutableMap<UserId, Long> = persistentMapOf(),
roomPowerLevels: RoomPowerLevels = RoomPowerLevels(
values = defaultRoomPowerLevelValues(),
users = persistentMapOf(),
),
activeRoomCallParticipants: List<UserId> = emptyList(),
heroes: List<MatrixUser> = emptyList(),
pinnedEventIds: List<EventId> = emptyList(),
@ -86,7 +89,7 @@ fun aRoomInfo(
notificationCount = notificationCount,
userDefinedNotificationMode = userDefinedNotificationMode,
hasRoomCall = hasRoomCall,
userPowerLevels = userPowerLevels,
roomPowerLevels = roomPowerLevels,
activeRoomCallParticipants = activeRoomCallParticipants.toImmutableList(),
heroes = heroes.toImmutableList(),
pinnedEventIds = pinnedEventIds.toImmutableList(),

View file

@ -18,6 +18,7 @@ import io.element.android.libraries.matrix.api.room.RoomNotificationMode
import io.element.android.libraries.matrix.api.room.history.RoomHistoryVisibility
import io.element.android.libraries.matrix.api.room.join.JoinRule
import io.element.android.libraries.matrix.api.room.message.RoomMessage
import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
import io.element.android.libraries.matrix.api.room.tombstone.SuccessorRoom
import io.element.android.libraries.matrix.api.roomlist.RoomSummary
import io.element.android.libraries.matrix.api.timeline.item.event.EventTimelineItem
@ -29,7 +30,6 @@ import io.element.android.libraries.matrix.test.A_ROOM_RAW_NAME
import io.element.android.libraries.matrix.test.A_ROOM_TOPIC
import io.element.android.libraries.matrix.test.A_USER_ID
import io.element.android.libraries.matrix.test.timeline.anEventTimelineItem
import kotlinx.collections.immutable.ImmutableMap
import kotlinx.collections.immutable.persistentMapOf
import kotlinx.collections.immutable.toPersistentList
@ -65,7 +65,10 @@ fun aRoomSummary(
notificationCount: Long = 0,
userDefinedNotificationMode: RoomNotificationMode? = null,
hasRoomCall: Boolean = false,
userPowerLevels: ImmutableMap<UserId, Long> = persistentMapOf(),
roomPowerLevels: RoomPowerLevels = RoomPowerLevels(
values = defaultRoomPowerLevelValues(),
users = persistentMapOf(),
),
activeRoomCallParticipants: List<UserId> = emptyList(),
heroes: List<MatrixUser> = emptyList(),
pinnedEventIds: List<EventId> = emptyList(),
@ -97,7 +100,7 @@ fun aRoomSummary(
activeMembersCount = activeMembersCount,
invitedMembersCount = invitedMembersCount,
joinedMembersCount = joinedMembersCount,
userPowerLevels = userPowerLevels,
roomPowerLevels = roomPowerLevels,
highlightCount = highlightCount,
notificationCount = notificationCount,
userDefinedNotificationMode = userDefinedNotificationMode,

View file

@ -106,7 +106,7 @@ fun BaseRoom.userPowerLevelAsState(updateKey: Long): State<Long> {
@Composable
fun BaseRoom.isOwnUserAdmin(): Boolean {
val roomInfo by roomInfoFlow.collectAsState()
val powerLevel = roomInfo.userPowerLevels[sessionId] ?: 0L
val powerLevel = roomInfo.roomPowerLevels?.users?.get(sessionId) ?: 0L
return RoomMember.Role.forPowerLevel(powerLevel) == RoomMember.Role.ADMIN
}

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_bottom_sheet_create_dm_confirmation_button_title">"Send invitation"</string>
<string name="screen_bottom_sheet_create_dm_message">"Kunne du tænke dig at starte en samtale med %1$s?"</string>
<string name="screen_bottom_sheet_create_dm_title">"Send invitation?"</string>
<string name="screen_invites_invited_you">"%1$s(%2$s ) inviterede dig"</string>
</resources>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_media_browser_list_mode_files">"Файлове"</string>
<string name="screen_media_browser_list_mode_media">"Медия"</string>
<string name="screen_media_browser_title">"Медия и файлове"</string>
</resources>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_media_browser_delete_confirmation_subtitle">"Denne fil vil blive fjernet fra rummet, og medlemmer vil ikke længere have adgang til den."</string>
<string name="screen_media_browser_delete_confirmation_title">"Vil du slette filen?"</string>
<string name="screen_media_browser_download_error_message">"Tjek din internetforbindelse, og prøv igen."</string>
<string name="screen_media_browser_files_empty_state_subtitle">"Dokumenter, lydfiler og stemmemeddelelser uploadet til dette rum vises her."</string>
<string name="screen_media_browser_files_empty_state_title">"Ingen filer uploadet endnu"</string>
<string name="screen_media_browser_list_loading_files">"Indlæser filer…"</string>
<string name="screen_media_browser_list_loading_media">"Indlæser medier…"</string>
<string name="screen_media_browser_list_mode_files">"Filer"</string>
<string name="screen_media_browser_list_mode_media">"Medier"</string>
<string name="screen_media_browser_media_empty_state_subtitle">"Billeder og videoer uploadet til dette rum vil blive vist her."</string>
<string name="screen_media_browser_media_empty_state_title">"Ingen medier uploadet endnu"</string>
<string name="screen_media_browser_title">"Medier og filer"</string>
<string name="screen_media_details_file_format">"Filformat"</string>
<string name="screen_media_details_filename">"Filnavn"</string>
<string name="screen_media_details_no_more_files_to_show">"Ikke flere filer at vise"</string>
<string name="screen_media_details_no_more_media_to_show">"Ikke flere medier at vise"</string>
<string name="screen_media_details_uploaded_by">"Uploadet af"</string>
<string name="screen_media_details_uploaded_on">"Uploadet på"</string>
</resources>

View file

@ -3,13 +3,13 @@
<string name="screen_media_browser_delete_confirmation_subtitle">"Αυτό το αρχείο θα αφαιρεθεί από την αίθουσα και τα μέλη δεν θα έχουν πρόσβαση σε αυτό."</string>
<string name="screen_media_browser_delete_confirmation_title">"Διαγραφή αρχείου;"</string>
<string name="screen_media_browser_download_error_message">"Ελέγξτε τη σύνδεσή σας στο διαδίκτυο και δοκιμάστε ξανά."</string>
<string name="screen_media_browser_files_empty_state_subtitle">"Έγγραφα, αρχεία ήχου και φωνητικά μηνύματα που έχουν μεταφορτωθεί σε αυτό το δωμάτιο θα εμφανίζονται εδώ."</string>
<string name="screen_media_browser_files_empty_state_subtitle">"Τα έγγραφα, τα αρχεία ήχου και τα φωνητικά μηνύματα που μεταφορτώνονται σε αυτή την αίθουσα θα εμφανίζονται εδώ."</string>
<string name="screen_media_browser_files_empty_state_title">"Δεν έχουν μεταφορτωθεί ακόμα αρχεία"</string>
<string name="screen_media_browser_list_loading_files">"Φόρτωση αρχείων…"</string>
<string name="screen_media_browser_list_loading_media">"Φόρτωση πολυμέσων…"</string>
<string name="screen_media_browser_list_mode_files">"Αρχεία"</string>
<string name="screen_media_browser_list_mode_media">"Πολυμέσα"</string>
<string name="screen_media_browser_media_empty_state_subtitle">"Εικόνες και βίντεο που μεταφορτώνονται σε αυτό το δωμάτιο θα εμφανίζονται εδώ."</string>
<string name="screen_media_browser_media_empty_state_subtitle">"Οι εικόνες και τα βίντεο που μεταφορτώνονται σε αυτή την αίθουσα θα εμφανίζονται εδώ."</string>
<string name="screen_media_browser_media_empty_state_title">"Δεν έχουν μεταφορτωθεί ακόμα πολυμέσα"</string>
<string name="screen_media_browser_title">"Πολυμέσα και αρχεία"</string>
<string name="screen_media_details_file_format">"Μορφή αρχείου"</string>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="dialog_permission_camera">"For at lade applikationen bruge kameraet, skal du give tilladelsen i systemindstillingerne."</string>
<string name="dialog_permission_generic">"Giv venligst tilladelsen i systemindstillingerne."</string>
<string name="dialog_permission_microphone">"For at lade applikationen bruge mikrofonen, skal du give tilladelsen i systemindstillingerne."</string>
<string name="dialog_permission_notification">"For at lade applikationen vise notifikationer, skal du give tilladelsen i systemindstillingerne."</string>
</resources>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="troubleshoot_notifications_test_check_permission_description">"Kontroller, at applikationen kan vise underretninger."</string>
<string name="troubleshoot_notifications_test_check_permission_title">"Kontroller tilladelser"</string>
</resources>

View file

@ -15,7 +15,6 @@
<item quantity="few">"%d апавяшчэнні"</item>
<item quantity="many">"%d апавяшчэнняў"</item>
</plurals>
<string name="notification_fallback_content">"Апавяшчэнне"</string>
<string name="notification_incoming_call">"📹 Уваходны выклік"</string>
<string name="notification_inline_reply_failed">"** Не атрымалася даслаць - калі ласка, адкрыйце пакой"</string>
<string name="notification_invitation_action_join">"Далучыцца"</string>

View file

@ -10,7 +10,6 @@
<item quantity="one">"%d известие"</item>
<item quantity="other">"%d известия"</item>
</plurals>
<string name="notification_fallback_content">"Известие"</string>
<string name="notification_inline_reply_failed">"** Неуспешно изпращане - моля, отворете стаята"</string>
<string name="notification_invitation_action_join">"Присъединяване"</string>
<plurals name="notification_invitations">

View file

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="notification_channel_call">"Opkald"</string>
<string name="notification_channel_listening_for_events">"Lytter efter begivenheder"</string>
<string name="notification_channel_noisy">"Lyd på notifikationer"</string>
<string name="notification_channel_ringing_calls">"Ringende opkald"</string>
<string name="notification_channel_silent">"Lydløse notifikationer"</string>
<plurals name="notification_compat_summary_line_for_room">
<item quantity="one">"%1$s: %2$d besked"</item>
<item quantity="other">"%1$s: %2$d beskeder"</item>
</plurals>
<plurals name="notification_compat_summary_title">
<item quantity="one">"%d notifikation"</item>
<item quantity="other">"%d notifikationer"</item>
</plurals>
<string name="notification_incoming_call">"📹 Indgående opkald"</string>
<string name="notification_inline_reply_failed">"** Kunne ikke sende - åbn venligst rummet"</string>
<string name="notification_invitation_action_join">"Deltag"</string>
<string name="notification_invitation_action_reject">"Afvis"</string>
<plurals name="notification_invitations">
<item quantity="one">"%d invitation"</item>
<item quantity="other">"%d invitationer"</item>
</plurals>
<string name="notification_invite_body">"Inviterede dig til at samtale"</string>
<string name="notification_invite_body_with_sender">"%1$s inviterede dig til at samtale"</string>
<string name="notification_mentioned_you_body">"Nævnte dig: %1$s"</string>
<string name="notification_new_messages">"Nye beskeder"</string>
<plurals name="notification_new_messages_for_room">
<item quantity="one">"%d ny besked"</item>
<item quantity="other">"%d nye beskeder"</item>
</plurals>
<string name="notification_reaction_body">"Reagerede med%1$s"</string>
<string name="notification_room_action_mark_as_read">"Marker som læst"</string>
<string name="notification_room_action_quick_reply">"Hurtigt svar"</string>
<string name="notification_room_invite_body">"Inviterede dig til at deltage i rummet"</string>
<string name="notification_room_invite_body_with_sender">"%1$s inviterede dig til at deltage i rummet"</string>
<string name="notification_sender_me">"Mig"</string>
<string name="notification_sender_mention_reply">"%1$s nævnt eller besvaret"</string>
<string name="notification_test_push_notification_content">"Du ser notifikationen! Klik på mig!"</string>
<string name="notification_ticker_text_dm">"%1$s: %2$s"</string>
<string name="notification_ticker_text_group">"%1$s: %2$s %3$s"</string>
<plurals name="notification_unread_notified_messages">
<item quantity="one">"%d ulæst besked"</item>
<item quantity="other">"%d ulæste beskeder"</item>
</plurals>
<string name="notification_unread_notified_messages_and_invitation">"%1$s og %2$s"</string>
<string name="notification_unread_notified_messages_in_room">"%1$s i %2$s"</string>
<string name="notification_unread_notified_messages_in_room_and_invitation">"%1$s i %2$s og %3$s"</string>
<plurals name="notification_unread_notified_messages_in_room_rooms">
<item quantity="one">"%d rum"</item>
<item quantity="other">"%d rum"</item>
</plurals>
<string name="push_distributor_background_sync_android">"Synkronisering i baggrunden"</string>
<string name="push_distributor_firebase_android">"Google-tjenester"</string>
<string name="push_no_valid_google_play_services_apk_android">"Der blev ikke fundet nogen gyldige Google Play-tjenester. Notifikationer fungerer muligvis ikke korrekt."</string>
<string name="troubleshoot_notifications_test_current_push_provider_description">"Få navnet på den aktuelle udbyder."</string>
<string name="troubleshoot_notifications_test_current_push_provider_failure">"Ingen push-udbydere valgt."</string>
<string name="troubleshoot_notifications_test_current_push_provider_success">"Nuværende push-udbyder: %1$s."</string>
<string name="troubleshoot_notifications_test_current_push_provider_title">"Nuværende push-udbyder"</string>
<string name="troubleshoot_notifications_test_detect_push_provider_description">"Sørg for, at programmet understøtter mindst én push-udbyder."</string>
<string name="troubleshoot_notifications_test_detect_push_provider_failure">"Ingen push-udbyder understøttelse fundet."</string>
<plurals name="troubleshoot_notifications_test_detect_push_provider_success">
<item quantity="one">"Fandt %1$d push-udbyder: %2$s"</item>
<item quantity="other">"Fandt %1$d push-udbydere: %2$s"</item>
</plurals>
<string name="troubleshoot_notifications_test_detect_push_provider_success_2">"Applikationen blev bygget med støtte til: %1$s"</string>
<string name="troubleshoot_notifications_test_detect_push_provider_title">"Understøttelse af push-udbydere"</string>
<string name="troubleshoot_notifications_test_display_notification_description">"Kontrollér, at appen kan vise notifikationer."</string>
<string name="troubleshoot_notifications_test_display_notification_failure">"Der er ikke blevet klikket på meddelelsen."</string>
<string name="troubleshoot_notifications_test_display_notification_permission_failure">"Kan ikke vise notifikationen."</string>
<string name="troubleshoot_notifications_test_display_notification_success">"Der er blevet klikket på notifikationen!"</string>
<string name="troubleshoot_notifications_test_display_notification_title">"Vis notifikation"</string>
<string name="troubleshoot_notifications_test_display_notification_waiting">"Klik venligst på notifikationen for at fortsætte testen."</string>
<string name="troubleshoot_notifications_test_push_loop_back_description">"Sørg for, at applikationen modtager push."</string>
<string name="troubleshoot_notifications_test_push_loop_back_failure_1">"Fejl: pusher har afvist anmodningen."</string>
<string name="troubleshoot_notifications_test_push_loop_back_failure_2">"Fejl: %1$s."</string>
<string name="troubleshoot_notifications_test_push_loop_back_failure_3">"Fejl, kan ikke teste push."</string>
<string name="troubleshoot_notifications_test_push_loop_back_failure_4">"Fejl, timeout venter på push."</string>
<string name="troubleshoot_notifications_test_push_loop_back_success">"Push loop back tog %1$d ms."</string>
<string name="troubleshoot_notifications_test_push_loop_back_title">"Afprøv Push loop back"</string>
</resources>

View file

@ -13,7 +13,6 @@
<item quantity="one">"%d Mitteilung"</item>
<item quantity="other">"%d Mitteilungen"</item>
</plurals>
<string name="notification_fallback_content">"Mitteilung"</string>
<string name="notification_incoming_call">"Eingehender Anruf"</string>
<string name="notification_inline_reply_failed">"** Fehler beim Senden - bitte Raum öffnen"</string>
<string name="notification_invitation_action_join">"Beitreten"</string>

View file

@ -13,9 +13,9 @@
<item quantity="one">"%d ειδοποίηση"</item>
<item quantity="other">"%d ειδοποιήσεις"</item>
</plurals>
<string name="notification_fallback_content">"Γνωστοποίηση"</string>
<string name="notification_fallback_content">"Έχεις νέο(α) μήνυμα(τα)."</string>
<string name="notification_incoming_call">"📹 Εισερχόμενη κλήση"</string>
<string name="notification_inline_reply_failed">"** Αποτυχία αποστολής - παρακαλώ άνοιξε το δωμάτιο"</string>
<string name="notification_inline_reply_failed">"** Αποτυχία αποστολής - παρακαλώ ανοίξτε την αίθουσα"</string>
<string name="notification_invitation_action_join">"Συμμετοχή"</string>
<string name="notification_invitation_action_reject">"Απόρριψη"</string>
<plurals name="notification_invitations">
@ -33,8 +33,8 @@
<string name="notification_reaction_body">"Αντέδρασε με %1$s"</string>
<string name="notification_room_action_mark_as_read">"Επισήμανση ως αναγνωσμένου"</string>
<string name="notification_room_action_quick_reply">"Γρήγορη απάντηση"</string>
<string name="notification_room_invite_body">έ προσκάλεσε να συμμετάσχεις στο δωμάτιο"</string>
<string name="notification_room_invite_body_with_sender">"Ο χρήστης %1$s σε προσκάλεσε να συμμετάσχεις στο δωμάτιο"</string>
<string name="notification_room_invite_body">ας προσκάλεσε να ενταχθείτε στην αίθουσα"</string>
<string name="notification_room_invite_body_with_sender">"%1$s σας προσκάλεσε να συμμετάσχετε στην αίθουσα"</string>
<string name="notification_sender_me">"Εγώ"</string>
<string name="notification_sender_mention_reply">"Ο χρήστης %1$s αναφέρθηκε ή απάντησε"</string>
<string name="notification_test_push_notification_content">"Βλέπεις την ειδοποίηση! Κάνε μου κλικ!"</string>
@ -48,8 +48,8 @@
<string name="notification_unread_notified_messages_in_room">"%1$s σε %2$s"</string>
<string name="notification_unread_notified_messages_in_room_and_invitation">"%1$s σε %2$s και %3$s"</string>
<plurals name="notification_unread_notified_messages_in_room_rooms">
<item quantity="one">"%d δωμάτιο"</item>
<item quantity="other">"%d δωμάτια"</item>
<item quantity="one">"%d αίθουσα"</item>
<item quantity="other">"%d αίθουσες"</item>
</plurals>
<string name="push_distributor_background_sync_android">"Συγχρονισμός στο παρασκήνιο"</string>
<string name="push_distributor_firebase_android">"Υπηρεσίες Google"</string>

View file

@ -13,7 +13,6 @@
<item quantity="one">"%d notificación"</item>
<item quantity="other">"%d notificaciones"</item>
</plurals>
<string name="notification_fallback_content">"Notificación"</string>
<string name="notification_incoming_call">"📹 Llamada entrante"</string>
<string name="notification_inline_reply_failed">"** No se ha podido enviar - por favor, abre la sala"</string>
<string name="notification_invitation_action_join">"Unirse"</string>

View file

@ -13,7 +13,7 @@
<item quantity="one">"%d teavitus"</item>
<item quantity="other">"%d teavitust"</item>
</plurals>
<string name="notification_fallback_content">"Teavitus"</string>
<string name="notification_fallback_content">"Sulle on uusi sõnumeid."</string>
<string name="notification_incoming_call">"📹 Sissetulev kõne"</string>
<string name="notification_inline_reply_failed">"** Saatmine ei õnnestunud - palun ava jututoa täisvaade"</string>
<string name="notification_invitation_action_join">"Liitu"</string>

View file

@ -12,7 +12,6 @@
<item quantity="one">"jakinarazpen %d"</item>
<item quantity="other">"%d jakinarazpen"</item>
</plurals>
<string name="notification_fallback_content">"Jakinarazpena"</string>
<string name="notification_incoming_call">"Deia jasotzen"</string>
<string name="notification_inline_reply_failed">"** Huts egin du bidalketak - ireki gela"</string>
<string name="notification_invitation_action_join">"Elkartu"</string>

View file

@ -13,7 +13,6 @@
<item quantity="one">"%d ilmoitus"</item>
<item quantity="other">"%d ilmoitusta"</item>
</plurals>
<string name="notification_fallback_content">"Ilmoitus"</string>
<string name="notification_incoming_call">"📹 Saapuva puhelu"</string>
<string name="notification_inline_reply_failed">"** Lähetys epäonnistui - avaa huone"</string>
<string name="notification_invitation_action_join">"Liity"</string>

View file

@ -13,7 +13,7 @@
<item quantity="one">"%d notification"</item>
<item quantity="other">"%d notifications"</item>
</plurals>
<string name="notification_fallback_content">"Notification"</string>
<string name="notification_fallback_content">"Vous avez de nouveau(x) message(s)."</string>
<string name="notification_incoming_call">"📹 Appel entrant"</string>
<string name="notification_inline_reply_failed">"** Échec de lenvoi - veuillez ouvrir le salon"</string>
<string name="notification_invitation_action_join">"Rejoindre"</string>

View file

@ -11,7 +11,6 @@
<plurals name="notification_compat_summary_title">
<item quantity="other">"%d pemberitahuan"</item>
</plurals>
<string name="notification_fallback_content">"Notifikasi"</string>
<string name="notification_incoming_call">"📹 Panggilan masuk"</string>
<string name="notification_inline_reply_failed">"** Gagal mengirim — silakan buka ruangan"</string>
<string name="notification_invitation_action_join">"Gabung"</string>

View file

@ -13,7 +13,6 @@
<item quantity="one">"%d notifica"</item>
<item quantity="other">"%d notifiche"</item>
</plurals>
<string name="notification_fallback_content">"Notifica"</string>
<string name="notification_incoming_call">"📹 Chiamata in arrivo"</string>
<string name="notification_inline_reply_failed">"** Invio fallito - si prega di aprire la stanza"</string>
<string name="notification_invitation_action_join">"Entra"</string>

View file

@ -12,7 +12,6 @@
<item quantity="one">"%d შეტყობინება"</item>
<item quantity="other">"%d შეტყობინება"</item>
</plurals>
<string name="notification_fallback_content">"შეტყობინება"</string>
<string name="notification_inline_reply_failed">"** გაგზავნა ვერ მოხერხდა - გთხოვთ, გახსნათ ოთახი"</string>
<string name="notification_invitation_action_join">"გაწევრიანება"</string>
<plurals name="notification_invitations">

View file

@ -14,7 +14,6 @@
<item quantity="few">"%d pranešimai"</item>
<item quantity="other">"%d pranešimų"</item>
</plurals>
<string name="notification_fallback_content">"Pranešimas"</string>
<string name="notification_inline_reply_failed">"** Nepavyko išsiųsti - prašome atidaryti kambarį"</string>
<plurals name="notification_invitations">
<item quantity="one">"%d kvietimas"</item>

View file

@ -13,7 +13,7 @@
<item quantity="one">"%d varsel"</item>
<item quantity="other">"%d varsler"</item>
</plurals>
<string name="notification_fallback_content">"Varsel"</string>
<string name="notification_fallback_content">"Du har nye meldinger."</string>
<string name="notification_incoming_call">"📹 Innkommende anrop"</string>
<string name="notification_inline_reply_failed">"** Kunne ikke sende - vennligst åpne rommet"</string>
<string name="notification_invitation_action_join">"Bli med"</string>

View file

@ -13,7 +13,6 @@
<item quantity="one">"%d melding"</item>
<item quantity="other">"%d meldingen"</item>
</plurals>
<string name="notification_fallback_content">"Melding"</string>
<string name="notification_incoming_call">"📹 Inkomende oproep"</string>
<string name="notification_inline_reply_failed">"** Verzenden is mislukt - open de kamer"</string>
<string name="notification_invitation_action_join">"Deelnemen"</string>

View file

@ -15,7 +15,6 @@
<item quantity="few">"%d powiadomienia"</item>
<item quantity="many">"%d powiadomień"</item>
</plurals>
<string name="notification_fallback_content">"Powiadomienie"</string>
<string name="notification_incoming_call">"📹 Połączenie przychodzące"</string>
<string name="notification_inline_reply_failed">"** Nie udało się wysłać - proszę otworzyć pokój"</string>
<string name="notification_invitation_action_join">"Dołącz"</string>

View file

@ -13,7 +13,6 @@
<item quantity="one">"%d notificação"</item>
<item quantity="other">"%d notificações"</item>
</plurals>
<string name="notification_fallback_content">"Notificação"</string>
<string name="notification_incoming_call">"📹 Chamada recebida"</string>
<string name="notification_inline_reply_failed">"** Falha ao enviar - por favor, abra a sala"</string>
<string name="notification_invitation_action_join">"Entrar"</string>

View file

@ -13,7 +13,7 @@
<item quantity="one">"%d notificação"</item>
<item quantity="other">"%d notificações"</item>
</plurals>
<string name="notification_fallback_content">"Notificação"</string>
<string name="notification_fallback_content">"Tens novas mensagens."</string>
<string name="notification_incoming_call">"📹 A receber chamada"</string>
<string name="notification_inline_reply_failed">"** Falha no envio - por favor abre a sala"</string>
<string name="notification_invitation_action_join">"Entrar"</string>

View file

@ -13,7 +13,6 @@
<item quantity="one">"%d notificare"</item>
<item quantity="other">"%d notificări"</item>
</plurals>
<string name="notification_fallback_content">"Notificare"</string>
<string name="notification_incoming_call">"Apel primit"</string>
<string name="notification_inline_reply_failed">"** Trimiterea eșuată - vă rugăm să deschideți camera"</string>
<string name="notification_invitation_action_join">"Alăturați-vă"</string>

View file

@ -15,7 +15,6 @@
<item quantity="few">"%d уведомления"</item>
<item quantity="many">"%d уведомлений"</item>
</plurals>
<string name="notification_fallback_content">"Уведомление"</string>
<string name="notification_incoming_call">"📹 Входящий вызов"</string>
<string name="notification_inline_reply_failed">"** Не удалось отправить - пожалуйста, откройте комнату"</string>
<string name="notification_invitation_action_join">"Присоединиться"</string>

View file

@ -15,7 +15,7 @@
<item quantity="few">"%d oznámenia"</item>
<item quantity="other">"%d oznámení"</item>
</plurals>
<string name="notification_fallback_content">"Oznámenie"</string>
<string name="notification_fallback_content">"Máte nové správy."</string>
<string name="notification_incoming_call">"📹 Prichádzajúci hovor"</string>
<string name="notification_inline_reply_failed">"** Nepodarilo sa odoslať - prosím otvorte miestnosť"</string>
<string name="notification_invitation_action_join">"Pripojiť sa"</string>

View file

@ -13,7 +13,6 @@
<item quantity="one">"%d avisering"</item>
<item quantity="other">"%d aviseringar"</item>
</plurals>
<string name="notification_fallback_content">"notis"</string>
<string name="notification_incoming_call">"📹 Inkommande samtal"</string>
<string name="notification_inline_reply_failed">"** Misslyckades att skicka - vänligen öppna rummet"</string>
<string name="notification_invitation_action_join">"Gå med"</string>

View file

@ -13,7 +13,6 @@
<item quantity="one">"%d bildirim"</item>
<item quantity="other">"%d bildirim"</item>
</plurals>
<string name="notification_fallback_content">"Bildirim"</string>
<string name="notification_incoming_call">"📹 Gelen çağrı"</string>
<string name="notification_inline_reply_failed">"** Gönderilemedi - lütfen odayıın"</string>
<string name="notification_invitation_action_join">"Katıl"</string>

View file

@ -15,7 +15,7 @@
<item quantity="few">"%d сповіщення"</item>
<item quantity="many">"%d сповіщень"</item>
</plurals>
<string name="notification_fallback_content">"Сповіщення"</string>
<string name="notification_fallback_content">"У вас є нові повідомлення."</string>
<string name="notification_incoming_call">"📹 Вхідний виклик"</string>
<string name="notification_inline_reply_failed">"** Не вдалося надіслати - відкрийте кімнату"</string>
<string name="notification_invitation_action_join">"Доєднатися"</string>

View file

@ -13,7 +13,6 @@
<item quantity="one">"%d اطلاع"</item>
<item quantity="other">"%d اطلاعات"</item>
</plurals>
<string name="notification_fallback_content">"اطلاع"</string>
<string name="notification_incoming_call">"📹 آنے والا مکالمہ"</string>
<string name="notification_inline_reply_failed">"** بھیجنے میں ناکام - براہ کرم کمرہ کھولیں"</string>
<string name="notification_invitation_action_join">"شامل ہوں"</string>

View file

@ -12,7 +12,6 @@
<item quantity="one">"%dbildirishnoma"</item>
<item quantity="other">"%dbildirishnomalar"</item>
</plurals>
<string name="notification_fallback_content">"Bildirishnoma"</string>
<string name="notification_inline_reply_failed">"** Yuborilmadi - iltimos, xonani oching"</string>
<string name="notification_invitation_action_join">"Qo\'shilish"</string>
<plurals name="notification_invitations">

View file

@ -11,7 +11,6 @@
<plurals name="notification_compat_summary_title">
<item quantity="other">"%d 個通知"</item>
</plurals>
<string name="notification_fallback_content">"通知"</string>
<string name="notification_incoming_call">"📹 來電"</string>
<string name="notification_inline_reply_failed">"** 無法傳送,請開啟聊天室"</string>
<string name="notification_invitation_action_join">"加入"</string>

View file

@ -11,7 +11,6 @@
<plurals name="notification_compat_summary_title">
<item quantity="other">"%d 条通知"</item>
</plurals>
<string name="notification_fallback_content">"通知"</string>
<string name="notification_incoming_call">"📹 来电"</string>
<string name="notification_inline_reply_failed">"** 无法发送——请打开聊天室"</string>
<string name="notification_invitation_action_join">"加入"</string>

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="troubleshoot_notifications_test_firebase_availability_description">"Sørg for, at Firebase er tilgængelig."</string>
<string name="troubleshoot_notifications_test_firebase_availability_failure">"Firebase er ikke tilgængelig."</string>
<string name="troubleshoot_notifications_test_firebase_availability_success">"Firebase er tilgængelig."</string>
<string name="troubleshoot_notifications_test_firebase_availability_title">"Tjek Firebase"</string>
<string name="troubleshoot_notifications_test_firebase_token_description">"Sørg for, at Firebase-tokenet er tilgængeligt."</string>
<string name="troubleshoot_notifications_test_firebase_token_failure">"Firebase-tokenet er ikke kendt."</string>
<string name="troubleshoot_notifications_test_firebase_token_success">"Firebase-token: %1$s."</string>
<string name="troubleshoot_notifications_test_firebase_token_title">"Tjek Firebase-token"</string>
</resources>

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="troubleshoot_notifications_test_unified_push_description">"Sørg for, at UnifiedPush-distributører er tilgængelige."</string>
<string name="troubleshoot_notifications_test_unified_push_failure">"Ingen push-distributører fundet."</string>
<plurals name="troubleshoot_notifications_test_unified_push_success">
<item quantity="one">"%1$d distributør fundet:%2$s."</item>
<item quantity="other">"%1$d distributører fundet:%2$s."</item>
</plurals>
<string name="troubleshoot_notifications_test_unified_push_title">"Afprøv UnifiedPush"</string>
</resources>

View file

@ -178,17 +178,19 @@ fun TextComposer(
remember(state.richTextEditorState, composerMode, onResetComposerMode, onError) {
@Composable {
TextInputBox(
modifier = Modifier.clickable(
interactionSource = remember { MutableInteractionSource() },
indication = null,
) {
coroutineScope.launch {
state.requestFocus()
view.showKeyboard()
modifier = Modifier
.clickable(
interactionSource = remember { MutableInteractionSource() },
indication = null,
) {
coroutineScope.launch {
state.requestFocus()
view.showKeyboard()
}
}
}.semantics {
hideFromAccessibility()
},
.semantics {
hideFromAccessibility()
},
composerMode = composerMode,
onResetComposerMode = onResetComposerMode,
isTextEmpty = state.richTextEditorState.messageHtml.isEmpty(),
@ -317,7 +319,7 @@ fun TextComposer(
IconColorButton(
onClick = onDismissTextFormatting,
imageVector = CompoundIcons.Close(),
contentDescription = stringResource(CommonStrings.action_close),
contentDescription = stringResource(R.string.rich_text_editor_close_formatting_options),
)
},
textFormatting = textFormattingOptions,

View file

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="rich_text_editor_a11y_add_attachment">"Tilføj vedhæftet fil"</string>
<string name="rich_text_editor_bullet_list">"Slå punktopstilling til/fra"</string>
<string name="rich_text_editor_close_formatting_options">"Luk formateringsindstillinger"</string>
<string name="rich_text_editor_code_block">"Slå kodeblok til/fra"</string>
<string name="rich_text_editor_composer_caption_placeholder">"Tilføj en billedtekst"</string>
<string name="rich_text_editor_composer_encrypted_placeholder">"Krypteret besked…"</string>
<string name="rich_text_editor_composer_placeholder">"Besked…"</string>
<string name="rich_text_editor_composer_unencrypted_placeholder">"Ukrypteret besked…"</string>
<string name="rich_text_editor_create_link">"Opret et link"</string>
<string name="rich_text_editor_edit_link">"Rediger link"</string>
<string name="rich_text_editor_format_action">"%1$s, tilstand: %2$s"</string>
<string name="rich_text_editor_format_bold">"Anvend fed skrift"</string>
<string name="rich_text_editor_format_italic">"Anvend kursiv"</string>
<string name="rich_text_editor_format_state_disabled">"deaktiveret"</string>
<string name="rich_text_editor_format_state_off">"slukket"</string>
<string name="rich_text_editor_format_state_on">"aktiv"</string>
<string name="rich_text_editor_format_strikethrough">"Anvend gennemstregning"</string>
<string name="rich_text_editor_format_underline">"Anvend understregning"</string>
<string name="rich_text_editor_full_screen_toggle">"Slå fuldskærmsvisning til/fra"</string>
<string name="rich_text_editor_indent">"Indrykning"</string>
<string name="rich_text_editor_inline_code">"Anvend inline kodeformat"</string>
<string name="rich_text_editor_link">"Indstil link"</string>
<string name="rich_text_editor_numbered_list">"Slå nummereret liste til/fra"</string>
<string name="rich_text_editor_open_compose_options">"Åbn skriveindstillinger"</string>
<string name="rich_text_editor_quote">"Slå citation til/fra"</string>
<string name="rich_text_editor_remove_link">"Fjern link"</string>
<string name="rich_text_editor_unindent">"Fjern indrykning"</string>
<string name="rich_text_editor_url_placeholder">"Link"</string>
<string name="screen_room_voice_message_tooltip">"Hold nede for at optage"</string>
</resources>

View file

@ -2,7 +2,6 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="rich_text_editor_a11y_add_attachment">"Anhang hinzufügen"</string>
<string name="rich_text_editor_bullet_list">"Aufzählungsliste umschalten"</string>
<string name="rich_text_editor_close_formatting_options">"Formatierungsoptionen schließen"</string>
<string name="rich_text_editor_code_block">"Codeblock umschalten"</string>
<string name="rich_text_editor_composer_caption_placeholder">"Bildunterschrift hinzufügen"</string>
<string name="rich_text_editor_composer_encrypted_placeholder">"Verschlüsselte Nachricht…"</string>

View file

@ -10,8 +10,12 @@
<string name="rich_text_editor_composer_unencrypted_placeholder">"Μη κρυπτογραφημένο μήνυμα…"</string>
<string name="rich_text_editor_create_link">"Δημιούργησε έναν σύνδεσμο"</string>
<string name="rich_text_editor_edit_link">"Επεξεργασία συνδέσμου"</string>
<string name="rich_text_editor_format_action">"%1$s, κατάσταση: %2$s"</string>
<string name="rich_text_editor_format_bold">"Εφαρμογή έντονης μορφής"</string>
<string name="rich_text_editor_format_italic">"Εφαρμογή πλάγιας μορφής"</string>
<string name="rich_text_editor_format_state_disabled">"ανενεργό"</string>
<string name="rich_text_editor_format_state_off">"κλειστό"</string>
<string name="rich_text_editor_format_state_on">"ενεργό"</string>
<string name="rich_text_editor_format_strikethrough">"Εφαρμογή μορφής διαγραφής"</string>
<string name="rich_text_editor_format_underline">"Εφαρμογή μορφής υπογράμμισης"</string>
<string name="rich_text_editor_full_screen_toggle">"Εναλλαγή λειτουργίας πλήρους οθόνης"</string>

View file

@ -2,7 +2,7 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="rich_text_editor_a11y_add_attachment">"Lisa manus"</string>
<string name="rich_text_editor_bullet_list">"Lülita mummudega loend sisse/välja"</string>
<string name="rich_text_editor_close_formatting_options">"Sulge vorminduse valikud"</string>
<string name="rich_text_editor_close_formatting_options">"Katkesta ja sulge tekstivorminduse valikud"</string>
<string name="rich_text_editor_code_block">"Lülita lähtekoodi lõik sisse/välja"</string>
<string name="rich_text_editor_composer_caption_placeholder">"Selgitus või nimi, kui soovid lisada…"</string>
<string name="rich_text_editor_composer_encrypted_placeholder">"Krüptitud sõnum…"</string>
@ -10,8 +10,12 @@
<string name="rich_text_editor_composer_unencrypted_placeholder">"Krüptimata sõnum…"</string>
<string name="rich_text_editor_create_link">"Lisa link"</string>
<string name="rich_text_editor_edit_link">"Muuda linki"</string>
<string name="rich_text_editor_format_action">"%1$s, olek: %2$s"</string>
<string name="rich_text_editor_format_bold">"Kasuta paksu kirja"</string>
<string name="rich_text_editor_format_italic">"Kasuta kaldkirja"</string>
<string name="rich_text_editor_format_state_disabled">"pole kasutusel"</string>
<string name="rich_text_editor_format_state_off">"väljas"</string>
<string name="rich_text_editor_format_state_on">"sees"</string>
<string name="rich_text_editor_format_strikethrough">"Kasuta läbikriipsutatud kirja"</string>
<string name="rich_text_editor_format_underline">"Kasuta allajoonitud kirja"</string>
<string name="rich_text_editor_full_screen_toggle">"Lülita täisekraanivaade sisse/välja"</string>

View file

@ -2,7 +2,7 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="rich_text_editor_a11y_add_attachment">"Ajouter une pièce jointe"</string>
<string name="rich_text_editor_bullet_list">"Afficher une liste à puces"</string>
<string name="rich_text_editor_close_formatting_options">"Fermer les options de formatage"</string>
<string name="rich_text_editor_close_formatting_options">"Annuler et fermer les options de formatage"</string>
<string name="rich_text_editor_code_block">"Afficher le bloc de code"</string>
<string name="rich_text_editor_composer_caption_placeholder">"Légende facultative…"</string>
<string name="rich_text_editor_composer_encrypted_placeholder">"Message chiffré…"</string>

View file

@ -2,7 +2,7 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="rich_text_editor_a11y_add_attachment">"Melléklet hozzáadása"</string>
<string name="rich_text_editor_bullet_list">"Felsorolás be/ki"</string>
<string name="rich_text_editor_close_formatting_options">"Formázási beállítások bezárása"</string>
<string name="rich_text_editor_close_formatting_options">"Mégse, és a formázási beállítások bezárása"</string>
<string name="rich_text_editor_code_block">"Kódblokk be/ki"</string>
<string name="rich_text_editor_composer_caption_placeholder">"Felirat hozzáadása…"</string>
<string name="rich_text_editor_composer_encrypted_placeholder">"Titkosított üzenet…"</string>

View file

@ -2,7 +2,7 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="rich_text_editor_a11y_add_attachment">"Adicionar anexo"</string>
<string name="rich_text_editor_bullet_list">"Ativar/desativar lista de pontos"</string>
<string name="rich_text_editor_close_formatting_options">"Fechar opções de formatação"</string>
<string name="rich_text_editor_close_formatting_options">"Cancelar e fechar opções de formatação"</string>
<string name="rich_text_editor_code_block">"Ativar/desativar bloco de código"</string>
<string name="rich_text_editor_composer_caption_placeholder">"Legenda opcional…"</string>
<string name="rich_text_editor_composer_encrypted_placeholder">"Mensagem encriptada…"</string>
@ -10,8 +10,12 @@
<string name="rich_text_editor_composer_unencrypted_placeholder">"Mensagem não encriptada…"</string>
<string name="rich_text_editor_create_link">"Criar uma ligação"</string>
<string name="rich_text_editor_edit_link">"Editar ligação"</string>
<string name="rich_text_editor_format_action">"%1$s, estado: %2$s"</string>
<string name="rich_text_editor_format_bold">"Aplicar negrito"</string>
<string name="rich_text_editor_format_italic">"Aplicar itálico"</string>
<string name="rich_text_editor_format_state_disabled">"desativado"</string>
<string name="rich_text_editor_format_state_off">"desligado"</string>
<string name="rich_text_editor_format_state_on">"ligado"</string>
<string name="rich_text_editor_format_strikethrough">"Aplicar rasura"</string>
<string name="rich_text_editor_format_underline">"Aplicar sublinhado"</string>
<string name="rich_text_editor_full_screen_toggle">"Entrar/sair do modo de ecrã inteiro"</string>

View file

@ -2,7 +2,7 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="rich_text_editor_a11y_add_attachment">"Pridať prílohu"</string>
<string name="rich_text_editor_bullet_list">"Prepnúť zoznam odrážok"</string>
<string name="rich_text_editor_close_formatting_options">"Zatvoriť možnosti formátovania"</string>
<string name="rich_text_editor_close_formatting_options">"Zrušiť a zatvoriť formátovanie textu"</string>
<string name="rich_text_editor_code_block">"Prepnúť blok kódu"</string>
<string name="rich_text_editor_composer_caption_placeholder">"Voliteľný titulok…"</string>
<string name="rich_text_editor_composer_encrypted_placeholder">"Šifrovaná správa…"</string>
@ -10,8 +10,12 @@
<string name="rich_text_editor_composer_unencrypted_placeholder">"Nešifrovaná správa…"</string>
<string name="rich_text_editor_create_link">"Vytvoriť odkaz"</string>
<string name="rich_text_editor_edit_link">"Upraviť odkaz"</string>
<string name="rich_text_editor_format_action">"%1$s, stav: %2$s"</string>
<string name="rich_text_editor_format_bold">"Použiť tučný formát"</string>
<string name="rich_text_editor_format_italic">"Použiť formát kurzívy"</string>
<string name="rich_text_editor_format_state_disabled">"zakázané"</string>
<string name="rich_text_editor_format_state_off">"vypnuté"</string>
<string name="rich_text_editor_format_state_on">"zapnuté"</string>
<string name="rich_text_editor_format_strikethrough">"Použiť formát prečiarknutia"</string>
<string name="rich_text_editor_format_underline">"Použiť formát podčiarknutia"</string>
<string name="rich_text_editor_full_screen_toggle">"Prepnúť režim celej obrazovky"</string>

View file

@ -10,8 +10,10 @@
<string name="rich_text_editor_composer_unencrypted_placeholder">"Незашифроване повідомлення…"</string>
<string name="rich_text_editor_create_link">"Створити посилання"</string>
<string name="rich_text_editor_edit_link">"Редагувати посилання"</string>
<string name="rich_text_editor_format_action">"%1$s, стан: %2$s"</string>
<string name="rich_text_editor_format_bold">"Жирний формат"</string>
<string name="rich_text_editor_format_italic">"Курсивний формат"</string>
<string name="rich_text_editor_format_state_off">"вимкнено"</string>
<string name="rich_text_editor_format_strikethrough">"Застосувати формат закреслення"</string>
<string name="rich_text_editor_format_underline">"Застосувати формат підкреслення"</string>
<string name="rich_text_editor_full_screen_toggle">"Перемкнути повноекранний режим"</string>

View file

@ -10,8 +10,12 @@
<string name="rich_text_editor_composer_unencrypted_placeholder">"未加密的消息…"</string>
<string name="rich_text_editor_create_link">"创建链接"</string>
<string name="rich_text_editor_edit_link">"编辑链接"</string>
<string name="rich_text_editor_format_action">"%1$s状态%2$s"</string>
<string name="rich_text_editor_format_bold">"应用粗体格式"</string>
<string name="rich_text_editor_format_italic">"应用斜体格式"</string>
<string name="rich_text_editor_format_state_disabled">"已禁用"</string>
<string name="rich_text_editor_format_state_off">"关"</string>
<string name="rich_text_editor_format_state_on">"开"</string>
<string name="rich_text_editor_format_strikethrough">"应用删除线格式"</string>
<string name="rich_text_editor_format_underline">"应用下划线格式"</string>
<string name="rich_text_editor_full_screen_toggle">"切换全屏模式"</string>

View file

@ -2,7 +2,7 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="rich_text_editor_a11y_add_attachment">"Add attachment"</string>
<string name="rich_text_editor_bullet_list">"Toggle bullet list"</string>
<string name="rich_text_editor_close_formatting_options">"Close formatting options"</string>
<string name="rich_text_editor_close_formatting_options">"Cancel and close text formatting"</string>
<string name="rich_text_editor_code_block">"Toggle code block"</string>
<string name="rich_text_editor_composer_caption_placeholder">"Add a caption"</string>
<string name="rich_text_editor_composer_encrypted_placeholder">"Encrypted message…"</string>

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_push_history_title">"Push-historik"</string>
<string name="troubleshoot_notifications_screen_action">"Kør test"</string>
<string name="troubleshoot_notifications_screen_action_again">"Kør test igen"</string>
<string name="troubleshoot_notifications_screen_failure">"Nogle tests mislykkedes. Tjek venligst detaljerne."</string>
<string name="troubleshoot_notifications_screen_notice">"Kør testene for at registrere de problemer i din konfiguration, der kan medføre, at meddelelser ikke opfører sig som forventet."</string>
<string name="troubleshoot_notifications_screen_quick_fix_action">"Forsøg på at reparere"</string>
<string name="troubleshoot_notifications_screen_success">"Alle tests bestået med succes."</string>
<string name="troubleshoot_notifications_screen_title">"Fejlfinding af meddelelser"</string>
<string name="troubleshoot_notifications_screen_waiting">"Nogle tests kræver din opmærksomhed. Tjek venligst detaljerne."</string>
</resources>

View file

@ -28,7 +28,7 @@
</plurals>
<string name="a11y_read_receipts_single">"Прачытана %1$s"</string>
<string name="a11y_read_receipts_tap_to_show_all">"Націсніце, каб паказаць усе"</string>
<string name="a11y_remove_reaction_with">"Выдаліць рэакцыю з %1$s"</string>
<string name="a11y_remove_reaction">"Выдаліць рэакцыю з %1$s"</string>
<string name="a11y_send_files">"Адправіць файлы"</string>
<string name="a11y_show_password">"Паказаць пароль"</string>
<string name="a11y_start_call">"Пазваніць"</string>

View file

@ -23,10 +23,11 @@
<item quantity="other">"Прочетено от %1$s и %2$d други"</item>
</plurals>
<string name="a11y_read_receipts_single">"Прочетено от %1$s"</string>
<string name="a11y_remove_reaction_with">"Премахване на реакция с %1$s"</string>
<string name="a11y_remove_reaction">"Премахване на реакция с %1$s"</string>
<string name="a11y_send_files">"Изпращане на файлове"</string>
<string name="a11y_show_password">"Показване на паролата"</string>
<string name="a11y_user_menu">"Потребителско меню"</string>
<string name="a11y_view_details">"Вижте подробности"</string>
<string name="action_accept">"Приемане"</string>
<string name="action_back">"Назад"</string>
<string name="action_cancel">"Отказ"</string>
@ -39,9 +40,13 @@
<string name="action_copy">"Копиране"</string>
<string name="action_copy_link">"Копиране на връзката"</string>
<string name="action_copy_link_to_message">"Копиране на връзката към съобщението"</string>
<string name="action_copy_text">"Копиране на текста"</string>
<string name="action_create">"Създаване"</string>
<string name="action_create_a_room">"Създаване на стая"</string>
<string name="action_deactivate">"Деактивиране"</string>
<string name="action_deactivate_account">"Деактивиране на акаунта"</string>
<string name="action_decline">"Отхвърляне"</string>
<string name="action_decline_and_block">"Отхвърляне и блокиране"</string>
<string name="action_delete_poll">"Изтриване на анкетата"</string>
<string name="action_disable">"Деактивиране"</string>
<string name="action_done">"Готово"</string>
@ -52,6 +57,7 @@
<string name="action_enter_pin">"Въведете PIN"</string>
<string name="action_forgot_password">"Забравена парола?"</string>
<string name="action_forward">"Препращане"</string>
<string name="action_ignore">"Игнориране"</string>
<string name="action_invite">"Поканване"</string>
<string name="action_invite_friends">"Поканване на хора"</string>
<string name="action_invite_friends_to_app">"Поканване на хора в %1$s"</string>
@ -64,16 +70,19 @@
<string name="action_leave_room">"Напускане на стаята"</string>
<string name="action_load_more">"Зареждане на още"</string>
<string name="action_manage_account">"Управление на профила"</string>
<string name="action_manage_devices">"Управление на устройства"</string>
<string name="action_manage_devices">"Управление на устройствата"</string>
<string name="action_message">"Съобщение"</string>
<string name="action_no">"Не"</string>
<string name="action_not_now">"Не сега"</string>
<string name="action_ok">"Добре"</string>
<string name="action_open_settings">"Настройки"</string>
<string name="action_open_with">"Отваряне с"</string>
<string name="action_pin">"Закачане"</string>
<string name="action_quick_reply">"Бърз отговор"</string>
<string name="action_quote">"Цитат"</string>
<string name="action_react">"Реакция"</string>
<string name="action_remove">"Премахване"</string>
<string name="action_remove_message">"Премахване на съобщението"</string>
<string name="action_reply">"Отговор"</string>
<string name="action_reply_in_thread">"Отговор в нишка"</string>
<string name="action_report_content">"Докладване на съдържанието"</string>
@ -85,6 +94,7 @@
<string name="action_send_message">"Изпращане на съобщение"</string>
<string name="action_share">"Споделяне"</string>
<string name="action_share_link">"Споделяне на връзката"</string>
<string name="action_show">"Показване"</string>
<string name="action_sign_in_again">"Влизане отново"</string>
<string name="action_signout">"Изход"</string>
<string name="action_signout_anyway">"Излизане въпреки това"</string>
@ -97,6 +107,7 @@
<string name="action_try_again">"Повторен опит"</string>
<string name="action_view_source">"Преглед на източника"</string>
<string name="action_yes">"Да"</string>
<string name="action_yes_try_again">"Да, опитай отново"</string>
<string name="common_about">"Относно"</string>
<string name="common_advanced_settings">"Разширени настройки"</string>
<string name="common_analytics">"Статистика"</string>
@ -109,19 +120,27 @@
<string name="common_decryption_error">"Грешка при разшифроване"</string>
<string name="common_developer_options">"Опции за разработчици"</string>
<string name="common_direct_chat">"Директен чат"</string>
<string name="common_do_not_show_this_again">"Не показвай това отново"</string>
<string name="common_downloading">"Изтегля се"</string>
<string name="common_edited_suffix">"(редактирано)"</string>
<string name="common_editing">"Редактиране"</string>
<string name="common_emote">"* %1$s %2$s"</string>
<string name="common_empty_file">"Празен файл"</string>
<string name="common_encryption">"Шифроване"</string>
<string name="common_encryption_enabled">"Шифроването е включено"</string>
<string name="common_enter_your_pin">"Въведете своя PIN"</string>
<string name="common_error">"Грешка"</string>
<string name="common_everyone">"Всеки"</string>
<string name="common_favourite">"Фаворизиране"</string>
<string name="common_file">"Файл"</string>
<string name="common_file_deleted">"Файлът е изтрит"</string>
<string name="common_file_saved">"Файлът е запазен"</string>
<string name="common_forward_message">"Препращане на съобщението"</string>
<string name="common_gif">"GIF"</string>
<string name="common_image">"Изображение"</string>
<string name="common_in_reply_to">"В отговор на %1$s"</string>
<string name="common_install_apk_android">"Инсталиране на APK"</string>
<string name="common_leaving_room">"Стаята се напуска"</string>
<string name="common_light">"Светъл"</string>
<string name="common_link_copied_to_clipboard">"Връзката е копирана в клипборда"</string>
<string name="common_loading">"Зарежда се…"</string>
@ -139,12 +158,14 @@
<string name="common_modern">"Модерно"</string>
<string name="common_mute">"Заглушаване"</string>
<string name="common_no_results">"Няма резултати"</string>
<string name="common_not_encrypted">"Без шифроване"</string>
<string name="common_offline">"Офлайн"</string>
<string name="common_or">"или"</string>
<string name="common_password">"Парола"</string>
<string name="common_people">"Хора"</string>
<string name="common_permalink">"Постоянна връзка"</string>
<string name="common_permission">"Разрешение"</string>
<string name="common_please_wait">"Моля, изчакайте…"</string>
<string name="common_poll_end_confirmation">"Сигурни ли сте, че искате да приключите тази анкета?"</string>
<string name="common_poll_summary">"Анкета: %1$s"</string>
<string name="common_poll_total_votes">"Общо гласове: %1$s"</string>
@ -156,6 +177,7 @@
<string name="common_privacy_policy">"Политика за поверителност"</string>
<string name="common_reaction">"Реакция"</string>
<string name="common_reactions">"Реакции"</string>
<string name="common_reason">"Причина"</string>
<string name="common_recovery_key">"Ключ за възстановяване"</string>
<string name="common_report_a_bug">"Съобщаване за грешка"</string>
<string name="common_report_a_problem">"Съобщаване за проблем"</string>
@ -163,6 +185,7 @@
<string name="common_room">"Стая"</string>
<string name="common_room_name">"Име на стаята"</string>
<string name="common_room_name_placeholder">"напр. името на вашия проект"</string>
<string name="common_saving">"Запазва се"</string>
<string name="common_screen_lock">"Заключване на екрана"</string>
<string name="common_search_for_someone">"Търсене на някого"</string>
<string name="common_search_results">"Резултати от търсенето"</string>
@ -175,6 +198,7 @@
<string name="common_settings">"Настройки"</string>
<string name="common_shared_location">"Споделено местоположение"</string>
<string name="common_signing_out">"Излизате"</string>
<string name="common_something_went_wrong_message">"Възникна проблем. Моля, опитайте отново."</string>
<string name="common_starting_chat">"Започване на чат…"</string>
<string name="common_success">"Успешно"</string>
<string name="common_suggestions">"Предложения"</string>
@ -192,16 +216,23 @@
<string name="common_username">"Потребителско име"</string>
<string name="common_verification_cancelled">"Потвърждаването е отменено"</string>
<string name="common_verification_complete">"Потвърждаването е завършено"</string>
<string name="common_verification_failed">"Неуспешно потвърждаване"</string>
<string name="common_verified">"Потвърден"</string>
<string name="common_verify_device">"Потвърждаване на устройството"</string>
<string name="common_verify_identity">"Потвърждаване на самоличността"</string>
<string name="common_verify_user">"Потвърждаване на потребителя"</string>
<string name="common_video">"Видео"</string>
<string name="common_voice_message">"Гласово съобщение"</string>
<string name="common_waiting_for_decryption_key">"В очакване на това съобщение"</string>
<string name="common_you">"Вие"</string>
<string name="dialog_title_error">"Грешка"</string>
<string name="dialog_title_success">"Успешно"</string>
<string name="dialog_title_warning">"Внимание"</string>
<string name="event_shield_reason_sent_in_clear">"Без шифроване"</string>
<string name="invite_friends_rich_title">"🔐️ Присъединете се към мен в %1$s"</string>
<string name="invite_friends_text">"Хей, говорете с мен в %1$s: %2$s"</string>
<string name="login_initial_device_name_android">"%1$s Android"</string>
<string name="screen_pinned_timeline_screen_title_empty">"Закачени съобщения"</string>
<string name="screen_share_location_title">"Споделяне на местоположение"</string>
<string name="screen_share_my_location_action">"Споделяне на моето местоположение"</string>
<string name="screen_share_open_apple_maps">"Отваряне в Apple Maps"</string>
@ -211,4 +242,6 @@
<string name="screen_view_location_title">"Местоположение"</string>
<string name="settings_version_number">"Версия: %1$s (%2$s)"</string>
<string name="test_language_identifier">"bg"</string>
<string name="timeline_decryption_failure_historical_event_unverified_device">"Трябва да потвърдите това устройство за да достъпите исторически съобщения"</string>
<string name="timeline_decryption_failure_unable_to_decrypt">"Съобщението не може да се разшифрова"</string>
</resources>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="a11y_add_reaction">"Přidat reakci: %1$s"</string>
<string name="a11y_avatar">"Profilový obrázek"</string>
<string name="a11y_delete">"Smazat"</string>
<plurals name="a11y_digits_entered">
@ -29,7 +30,8 @@
</plurals>
<string name="a11y_read_receipts_single">"%1$s přečetl(a)"</string>
<string name="a11y_read_receipts_tap_to_show_all">"Klepnutím zobrazíte vše"</string>
<string name="a11y_remove_reaction_with">"Odstraňit reakci s %1$s"</string>
<string name="a11y_remove_reaction">"Odstraňit reakci s %1$s"</string>
<string name="a11y_remove_reaction_with">"Odstranit reakci pomocí %1$s"</string>
<string name="a11y_send_files">"Odeslat soubory"</string>
<string name="a11y_show_password">"Zobrazit heslo"</string>
<string name="a11y_start_call">"Zahájit hovor"</string>
@ -140,15 +142,13 @@
<string name="action_view_source">"Zobrazit zdroj"</string>
<string name="action_yes">"Ano"</string>
<string name="action_yes_try_again">"Ano, zkusit znovu"</string>
<string name="banner_battery_optimization_content_android">"Zakažte optimalizaci baterie pro tuto aplikaci, abyste měli jistotu, že budou přijata všechna oznámení."</string>
<string name="banner_battery_optimization_submit_android">"Zakázat optimalizaci"</string>
<string name="banner_battery_optimization_title_android">"Nepřicházejí vám oznámení?"</string>
<string name="banner_migrate_to_native_sliding_sync_description">"Váš server nyní podporuje nový, rychlejší protokol. Chcete-li upgradovat, odhlaste se a znovu se přihlaste. Pokud to uděláte nyní, pomůže vám vyhnout se nucenému odhlášení, když bude starý protokol později odstraněn."</string>
<string name="banner_migrate_to_native_sliding_sync_title">"Upgrade k dispozici"</string>
<string name="common_about">"O aplikaci"</string>
<string name="common_acceptable_use_policy">"Zásady používání"</string>
<string name="common_adding_caption">"Přidání titulku"</string>
<string name="common_advanced_settings">"Pokročilá nastavení"</string>
<string name="common_an_image">"obrázek"</string>
<string name="common_analytics">"Analytika"</string>
<string name="common_appearance">"Vzhled"</string>
<string name="common_audio">"Zvuk"</string>
@ -248,6 +248,9 @@ Důvod: %1$s."</string>
<string name="common_reason">"Důvod"</string>
<string name="common_recovery_key">"Klíč pro obnovení"</string>
<string name="common_refreshing">"Obnovování…"</string>
<plurals name="common_replies">
<item quantity="other">"%1$d odpovědí"</item>
</plurals>
<string name="common_replying_to">"Odpověď na %1$s"</string>
<string name="common_report_a_bug">"Nahlásit chybu"</string>
<string name="common_report_a_problem">"Nahlásit problém"</string>
@ -267,6 +270,7 @@ Důvod: %1$s."</string>
<string name="common_sending">"Odesílání…"</string>
<string name="common_sending_failed">"Odeslání se nezdařilo"</string>
<string name="common_sent">"Odesláno"</string>
<string name="common_sentence_delimiter">". "</string>
<string name="common_server_not_supported">"Server není podporován"</string>
<string name="common_server_url">"URL serveru"</string>
<string name="common_settings">"Nastavení"</string>
@ -352,6 +356,10 @@ Opravdu chcete pokračovat?"</string>
<string name="invite_friends_text">"Ahoj, ozvi se mi na %1$s: %2$s"</string>
<string name="login_initial_device_name_android">"%1$s Android"</string>
<string name="preference_rageshake">"Zatřeste zařízením pro nahlášení chyby"</string>
<string name="screen_create_poll_option_accessibility_label">"%1$s: %2$s"</string>
<string name="screen_create_poll_options_section_title">"Možnosti"</string>
<string name="screen_create_poll_remove_accessibility_label">"Odstranit %1$s"</string>
<string name="screen_create_poll_settings_section_title">"Nastavení"</string>
<string name="screen_media_picker_error_failed_selection">"Výběr média se nezdařil, zkuste to prosím znovu."</string>
<string name="screen_media_upload_preview_caption_warning">"Titulky nemusí být viditelné pro lidi, kteří používají starší aplikace."</string>
<string name="screen_media_upload_preview_error_failed_processing">"Nahrání média se nezdařilo, zkuste to prosím znovu."</string>
@ -377,17 +385,14 @@ Opravdu chcete pokračovat?"</string>
<string name="screen_room_error_failed_processing_media">"Nahrání média se nezdařilo, zkuste to prosím znovu."</string>
<string name="screen_room_error_failed_retrieving_user_details">"Nepodařilo se načíst údaje o uživateli"</string>
<string name="screen_room_event_pill">"Zpráva v %1$s"</string>
<string name="screen_room_grouped_state_events_expand">"Rozbalit"</string>
<string name="screen_room_grouped_state_events_reduce">"Zmenšit"</string>
<string name="screen_room_permalink_same_room_android">"Již si prohlížíte tuto místnost!"</string>
<string name="screen_room_pinned_banner_indicator">"%1$s z %2$s"</string>
<string name="screen_room_pinned_banner_indicator_description">"%1$s Připnuté zprávy"</string>
<string name="screen_room_pinned_banner_loading_description">"Načítání zprávy…"</string>
<string name="screen_room_pinned_banner_view_all_button_title">"Zobrazit vše"</string>
<string name="screen_room_timeline_tombstoned_room_action">"Přejít do nové místnosti"</string>
<string name="screen_room_timeline_tombstoned_room_message">"Tato místnost byla nahrazena a již není aktivní"</string>
<string name="screen_room_timeline_upgraded_room_action">"Zobrazit staré zprávy"</string>
<string name="screen_room_timeline_upgraded_room_message">"Tato místnost je pokračováním jiné místnosti"</string>
<string name="screen_room_title">"Chat"</string>
<string name="screen_roomlist_knock_event_sent_description">"Žádost o vstup odeslána"</string>
<string name="screen_roomlist_tombstoned_room_description">"Tato místnost byla aktualizována"</string>
<string name="screen_share_location_title">"Sdílet polohu"</string>
<string name="screen_share_my_location_action">"Sdílet moji polohu"</string>
<string name="screen_share_open_apple_maps">"Otevřít v Mapách Apple"</string>

View file

@ -35,7 +35,7 @@
</plurals>
<string name="a11y_read_receipts_single">"Wedi\'i ddarllen gan %1$s"</string>
<string name="a11y_read_receipts_tap_to_show_all">"Tapio i ddangos y cyfan"</string>
<string name="a11y_remove_reaction_with">"Wedi dileu adwaith gyda %1$s"</string>
<string name="a11y_remove_reaction">"Wedi dileu adwaith gyda %1$s"</string>
<string name="a11y_send_files">"Anfon ffeiliau"</string>
<string name="a11y_show_password">"Dangos y cyfrinair"</string>
<string name="a11y_start_call">"Cychwyn galwad"</string>

View file

@ -0,0 +1,402 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="a11y_avatar">"Avatar"</string>
<string name="a11y_delete">"Slet"</string>
<plurals name="a11y_digits_entered">
<item quantity="one">"%1$d ciffer indtastet"</item>
<item quantity="other">"%1$d cifre indtastet"</item>
</plurals>
<string name="a11y_hide_password">"Skjul adgangskode"</string>
<string name="a11y_join_call">"Deltag i opkald"</string>
<string name="a11y_jump_to_bottom">"Hop til bunden"</string>
<string name="a11y_notifications_mentions_only">"Kun omtaler"</string>
<string name="a11y_notifications_muted">"Lyd slået fra"</string>
<string name="a11y_page_n">"Side %1$d"</string>
<string name="a11y_pause">"Pausér"</string>
<string name="a11y_paused_voice_message">"Talebesked, varighed: %1$s, aktuel position: %2$s"</string>
<string name="a11y_pin_field">"PIN-felt"</string>
<string name="a11y_play">"Afspil"</string>
<string name="a11y_poll">"Afstemning"</string>
<string name="a11y_poll_end">"Afsluttet afstemning"</string>
<string name="a11y_react_with">"Reager med%1$s"</string>
<string name="a11y_react_with_other_emojis">"Reager med andre emojis"</string>
<string name="a11y_read_receipts_multiple">"Læs af %1$s og %2$s"</string>
<plurals name="a11y_read_receipts_multiple_with_others">
<item quantity="one">"Læst af %1$s og %2$d andre"</item>
<item quantity="other">"Læst af %1$s og %2$d andre"</item>
</plurals>
<string name="a11y_read_receipts_single">"Læst af%1$s"</string>
<string name="a11y_read_receipts_tap_to_show_all">"Tryk for at vise alle"</string>
<string name="a11y_remove_reaction">"Fjern reaktion med%1$s"</string>
<string name="a11y_send_files">"Send filer"</string>
<string name="a11y_show_password">"Vis adgangskode"</string>
<string name="a11y_start_call">"Start et opkald"</string>
<string name="a11y_user_menu">"Brugermenu"</string>
<string name="a11y_view_details">"Se detaljer"</string>
<string name="a11y_voice_message">"Talebesked, varighed: %1$s"</string>
<string name="a11y_voice_message_record">"Optag talebesked."</string>
<string name="a11y_voice_message_stop_recording">"Stop optagelsen"</string>
<string name="action_accept">"Accepter"</string>
<string name="action_add_caption">"Tilføj billedtekst"</string>
<string name="action_add_to_timeline">"Føj til tidslinje"</string>
<string name="action_back">"Tilbage"</string>
<string name="action_call">"Opkald"</string>
<string name="action_cancel">"Anullér"</string>
<string name="action_cancel_for_now">"Spring over ind til videre"</string>
<string name="action_choose_photo">"Vælg billede"</string>
<string name="action_clear">"Ryd"</string>
<string name="action_close">"Luk"</string>
<string name="action_complete_verification">"Fuldfør verifikation"</string>
<string name="action_confirm">"Bekræft"</string>
<string name="action_confirm_password">"Bekræft adgangskode"</string>
<string name="action_continue">"Fortsæt"</string>
<string name="action_copy">"Kopiér"</string>
<string name="action_copy_caption">"Kopiér billedtekst"</string>
<string name="action_copy_link">"Kopiér link"</string>
<string name="action_copy_link_to_message">"Kopier link til besked"</string>
<string name="action_copy_text">"Kopiér tekst"</string>
<string name="action_create">"Opret"</string>
<string name="action_create_a_room">"Opret et rum"</string>
<string name="action_deactivate">"Deaktiver"</string>
<string name="action_deactivate_account">"Deaktiver konto"</string>
<string name="action_decline">"Afvis"</string>
<string name="action_decline_and_block">"Afvis og blokér"</string>
<string name="action_delete_poll">"Slet afstemning"</string>
<string name="action_disable">"Deaktiver"</string>
<string name="action_discard">"Kassér"</string>
<string name="action_dismiss">"Afvis"</string>
<string name="action_done">"Færdig"</string>
<string name="action_edit">"Redigér"</string>
<string name="action_edit_caption">"Rediger billedtekst"</string>
<string name="action_edit_poll">"Redigér afstemning"</string>
<string name="action_enable">"Slå til"</string>
<string name="action_end_poll">"Afslut afstemning"</string>
<string name="action_enter_pin">"Indtast PIN-kode"</string>
<string name="action_forgot_password">"Har du glemt din adgangskode?"</string>
<string name="action_forward">"Videresend"</string>
<string name="action_go_back">"Gå tilbage"</string>
<string name="action_ignore">"Ignorér"</string>
<string name="action_invite">"Invitér"</string>
<string name="action_invite_friends">"Invitér folk"</string>
<string name="action_invite_friends_to_app">"Invitér folk til %1$s"</string>
<string name="action_invite_people_to_app">"Invitér folk til %1$s"</string>
<string name="action_invites_list">"Invitationer"</string>
<string name="action_join">"Deltag"</string>
<string name="action_learn_more">"Få mere at vide"</string>
<string name="action_leave">"Forlad"</string>
<string name="action_leave_conversation">"Forlad samtalen"</string>
<string name="action_leave_room">"Forlad rum"</string>
<string name="action_load_more">"Indlæs mere"</string>
<string name="action_manage_account">"Administrer konto"</string>
<string name="action_manage_devices">"Administrer enheder"</string>
<string name="action_message">"Besked"</string>
<string name="action_next">"Næste"</string>
<string name="action_no">"Nej"</string>
<string name="action_not_now">"Ikke nu"</string>
<string name="action_ok">"OK"</string>
<string name="action_open_settings">"Indstillinger"</string>
<string name="action_open_with">"Åbn med"</string>
<string name="action_pin">"Fastgør"</string>
<string name="action_quick_reply">"Hurtigt svar"</string>
<string name="action_quote">"Citér"</string>
<string name="action_react">"Reagér"</string>
<string name="action_reject">"Afvis"</string>
<string name="action_remove">"Fjern"</string>
<string name="action_remove_caption">"Fjern billedtekst"</string>
<string name="action_remove_message">"Fjern besked"</string>
<string name="action_reply">"Svar"</string>
<string name="action_reply_in_thread">"Svar i tråd"</string>
<string name="action_report">"Anmeld"</string>
<string name="action_report_bug">"Anmeld fejl"</string>
<string name="action_report_content">"Anmeld indhold"</string>
<string name="action_report_dm">"Anmeld samtale"</string>
<string name="action_report_room">"Anmeld rummet"</string>
<string name="action_reset">"Nulstil"</string>
<string name="action_reset_identity">"Nulstil identitet"</string>
<string name="action_retry">"Prøv igen"</string>
<string name="action_retry_decryption">"Prøv at dekryptere igen"</string>
<string name="action_save">"Gem"</string>
<string name="action_search">"Søg"</string>
<string name="action_send">"Send"</string>
<string name="action_send_message">"Send besked"</string>
<string name="action_share">"Del"</string>
<string name="action_share_link">"Del link"</string>
<string name="action_show">"Vis"</string>
<string name="action_sign_in_again">"Log ind igen"</string>
<string name="action_signout">"Log ud"</string>
<string name="action_signout_anyway">"Log ud alligevel"</string>
<string name="action_skip">"Spring over"</string>
<string name="action_start">"Start"</string>
<string name="action_start_chat">"Start samtale"</string>
<string name="action_start_verification">"Begynd verifikation"</string>
<string name="action_static_map_load">"Tryk for at indlæse kort"</string>
<string name="action_take_photo">"Tag billede"</string>
<string name="action_tap_for_options">"Tryk for indstillinger"</string>
<string name="action_try_again">"Prøv igen"</string>
<string name="action_unpin">"Frigør"</string>
<string name="action_view_in_timeline">"Se i tidslinjen"</string>
<string name="action_view_source">"Se kilde"</string>
<string name="action_yes">"Ja"</string>
<string name="action_yes_try_again">"Ja, prøv igen"</string>
<string name="banner_migrate_to_native_sliding_sync_description">"Din server understøtter nu en ny, hurtigere protokol. Log ud og log ind igen for at opgradere nu. Hvis du gør dette nu, vil du undgå en tvungen logout, når den gamle protokol bliver fjerne senere."</string>
<string name="banner_migrate_to_native_sliding_sync_title">"Opgradering tilgængelig"</string>
<string name="common_about">"Om"</string>
<string name="common_acceptable_use_policy">"Politik for acceptabel brug"</string>
<string name="common_adding_caption">"Tilføjelse af billedtekst"</string>
<string name="common_advanced_settings">"Avancerede indstillinger"</string>
<string name="common_an_image">"et billede"</string>
<string name="common_analytics">"Analyse-værktøj"</string>
<string name="common_appearance">"Udseende"</string>
<string name="common_audio">"Lyd"</string>
<string name="common_blocked_users">"Blokerede brugere"</string>
<string name="common_bubbles">"Bobler"</string>
<string name="common_call_started">"Opkald startet"</string>
<string name="common_chat_backup">"Backup af samtale"</string>
<string name="common_copied_to_clipboard">"Kopieret til udklipsholder"</string>
<string name="common_copyright">"Ophavsret"</string>
<string name="common_creating_room">"Opretter rum…"</string>
<string name="common_current_user_canceled_knock">"Anmodning annulleret"</string>
<string name="common_current_user_left_room">"Forlod rummet"</string>
<string name="common_current_user_rejected_invite">"Invitationen blev afvist"</string>
<string name="common_dark">"Mørkt tema"</string>
<string name="common_decryption_error">"Fejl under dekryptering"</string>
<string name="common_developer_options">"Indstillinger for udviklere"</string>
<string name="common_device_id">"Enheds-ID"</string>
<string name="common_direct_chat">"Direkte samtale"</string>
<string name="common_do_not_show_this_again">"Vis ikke dette igen"</string>
<string name="common_download_failed">"Download mislykkedes"</string>
<string name="common_downloading">"Downloader"</string>
<string name="common_edited_suffix">"(redigeret)"</string>
<string name="common_editing">"Redigering"</string>
<string name="common_editing_caption">"Redigering af billedtekst"</string>
<string name="common_emote">"* %1$s %2$s"</string>
<string name="common_empty_file">"Tom fil"</string>
<string name="common_encryption">"Kryptering"</string>
<string name="common_encryption_enabled">"Kryptering aktiveret"</string>
<string name="common_enter_your_pin">"Indtast din PIN-kode"</string>
<string name="common_error">"Fejl"</string>
<string name="common_error_registering_pusher_android">"Der opstod en fejl, du modtager muligvis ikke meddelelser om nye meddelelser. Fejlfinding af meddelelser fra indstillingerne.
Årsag: %1$s."</string>
<string name="common_everyone">"Alle"</string>
<string name="common_failed">"Mislykkedes"</string>
<string name="common_favourite">"Favorit"</string>
<string name="common_favourited">"Favoritmarkeret"</string>
<string name="common_file">"Fil"</string>
<string name="common_file_deleted">"Fil slettet"</string>
<string name="common_file_saved">"Fil gemt"</string>
<string name="common_file_saved_on_disk_android">"Fil gemt i Downloads"</string>
<string name="common_forward_message">"Videresend besked"</string>
<string name="common_frequently_used">"Ofte brugt"</string>
<string name="common_gif">"GIF"</string>
<string name="common_image">"Billede"</string>
<string name="common_in_reply_to">"Som svar på %1$s"</string>
<string name="common_install_apk_android">"Installer APK"</string>
<string name="common_invite_unknown_profile">"Dette Matrix-ID kan ikke findes, så invitationen modtages muligvis ikke."</string>
<string name="common_leaving_room">"Forlader rummet"</string>
<string name="common_light">"Lyst tema"</string>
<string name="common_line_copied_to_clipboard">"Linje kopieret til udklipsholder"</string>
<string name="common_link_copied_to_clipboard">"Linket er kopieret til udklipsholderen"</string>
<string name="common_loading">"Indlæser…"</string>
<string name="common_loading_more">"Indlæser flere…"</string>
<plurals name="common_many_members">
<item quantity="one">"%d anden"</item>
<item quantity="other">"%d andre"</item>
</plurals>
<plurals name="common_member_count">
<item quantity="one">"%1$d medlem"</item>
<item quantity="other">"%1$d medlemmer"</item>
</plurals>
<string name="common_message">"Besked"</string>
<string name="common_message_actions">"Beskedhandlinger"</string>
<string name="common_message_layout">"Layout på beskeder"</string>
<string name="common_message_removed">"Beskeden er fjernet"</string>
<string name="common_modern">"Moderne"</string>
<string name="common_mute">"Lydløs"</string>
<string name="common_name_and_id">"%1$s (%2$s)"</string>
<string name="common_no_results">"Ingen resultater"</string>
<string name="common_no_room_name">"Intet rumnavn"</string>
<string name="common_not_encrypted">"Ikke krypteret"</string>
<string name="common_offline">"Offline"</string>
<string name="common_open_source_licenses">"Open Source-licenser"</string>
<string name="common_or">"eller"</string>
<string name="common_password">"Adgangskode"</string>
<string name="common_people">"Mennesker"</string>
<string name="common_permalink">"Permalink"</string>
<string name="common_permission">"Tilladelse"</string>
<string name="common_pinned">"Fastgjort"</string>
<string name="common_please_check_internet_connection">"Tjek venligst din internetforbindelse"</string>
<string name="common_please_wait">"Vent venligst…"</string>
<string name="common_poll_end_confirmation">"Er du sikker på, at du vil afslutte denne afstemning?"</string>
<string name="common_poll_summary">"Afstemning: %1$s"</string>
<string name="common_poll_total_votes">"Stemmer i alt: %1$s"</string>
<string name="common_poll_undisclosed_text">"Resultaterne vil blive vist, når afstemningen er afsluttet"</string>
<plurals name="common_poll_votes_count">
<item quantity="one">"%d stemme"</item>
<item quantity="other">"%d stemmer"</item>
</plurals>
<string name="common_privacy_policy">"Privatlivspolitik"</string>
<string name="common_reaction">"Reaktion"</string>
<string name="common_reactions">"Reaktioner"</string>
<string name="common_reason">"Årsag"</string>
<string name="common_recovery_key">"Gendannelsesnøgle"</string>
<string name="common_refreshing">"Opdaterer…"</string>
<plurals name="common_replies">
<item quantity="other">"%1$d svar"</item>
</plurals>
<string name="common_replying_to">"Svarer til %1$s"</string>
<string name="common_report_a_bug">"Rapportér en fejl"</string>
<string name="common_report_a_problem">"Anmeld et problem"</string>
<string name="common_report_submitted">"Anmeldelsen er indsendt"</string>
<string name="common_rich_text_editor">"Rich text editor"</string>
<string name="common_room">"Rum"</string>
<string name="common_room_name">"Navn på rum"</string>
<string name="common_room_name_placeholder">"f.eks. navnet på dit projekt"</string>
<string name="common_saved_changes">"Gemte ændringer"</string>
<string name="common_saving">"Gemmer"</string>
<string name="common_screen_lock">"Skærmlås"</string>
<string name="common_search_for_someone">"Søg efter nogen"</string>
<string name="common_search_results">"Søgeresultater"</string>
<string name="common_security">"Sikkerhed"</string>
<string name="common_seen_by">"Set af"</string>
<string name="common_send_to">"Send til"</string>
<string name="common_sending">"Sender…"</string>
<string name="common_sending_failed">"Afsendelse mislykkedes"</string>
<string name="common_sent">"Sendt"</string>
<string name="common_sentence_delimiter">". "</string>
<string name="common_server_not_supported">"Serveren er ikke understøttet"</string>
<string name="common_server_url">"Server URL"</string>
<string name="common_settings">"Indstillinger"</string>
<string name="common_shared_location">"Delt placering"</string>
<string name="common_signing_out">"Logger ud"</string>
<string name="common_something_went_wrong">"Noget gik galt"</string>
<string name="common_something_went_wrong_message">"Vi stødte på et problem. Prøv venligst igen."</string>
<string name="common_starting_chat">"Starter samtale…"</string>
<string name="common_sticker">"Klistermærke"</string>
<string name="common_success">"Succes"</string>
<string name="common_suggestions">"Forslag"</string>
<string name="common_syncing">"Synkroniserer"</string>
<string name="common_system">"System"</string>
<string name="common_text">"Tekst"</string>
<string name="common_third_party_notices">"Tredjepartsmeddelelser"</string>
<string name="common_thread">"Tråd"</string>
<string name="common_topic">"Emne"</string>
<string name="common_topic_placeholder">"Hvad handler det her rum om?"</string>
<string name="common_unable_to_decrypt">"Ude af stand til at dekryptere"</string>
<string name="common_unable_to_decrypt_insecure_device">"Sendt fra en usikker enhed"</string>
<string name="common_unable_to_decrypt_no_access">"Du har ikke adgang til denne meddelelse"</string>
<string name="common_unable_to_decrypt_verification_violation">"Afsenderens verificerede identitet blev nulstillet"</string>
<string name="common_unable_to_invite_message">"Invitationer kunne ikke sendes til en eller flere brugere."</string>
<string name="common_unable_to_invite_title">"Kan ikke sende invitation(er)"</string>
<string name="common_unlock">"Lås op"</string>
<string name="common_unmute">"Slå lyden til"</string>
<string name="common_unsupported_call">"Ikke-understøttet opkald"</string>
<string name="common_unsupported_event">"Ikke-understøttet begivenhed"</string>
<string name="common_username">"Brugernavn"</string>
<string name="common_verification_cancelled">"Bekræftelse annulleret"</string>
<string name="common_verification_complete">"Bekræftelse fuldført"</string>
<string name="common_verification_failed">"Verifikation mislykkedes"</string>
<string name="common_verified">"Verificeret"</string>
<string name="common_verify_device">"Bekræft enhed"</string>
<string name="common_verify_identity">"Verificér identitet"</string>
<string name="common_verify_user">"Verificér bruger"</string>
<string name="common_video">"Video"</string>
<string name="common_voice_message">"Talebesked"</string>
<string name="common_waiting">"Venter…"</string>
<string name="common_waiting_for_decryption_key">"Venter på denne besked"</string>
<string name="common_you">"Dig"</string>
<string name="crypto_identity_change_pin_violation">"%1$ss identitet blev nulstillet. %2$s"</string>
<string name="crypto_identity_change_pin_violation_new">"%1$ss %2$s identitet blev nulstillet. %3$s"</string>
<string name="crypto_identity_change_pin_violation_new_user_id">"(%1$s)"</string>
<string name="crypto_identity_change_profile_pin_violation">"%1$ss identitet blev nulstillet."</string>
<string name="crypto_identity_change_verification_violation_new">"%1$ss %2$s identitet blev nulstillet. %3$s"</string>
<string name="crypto_identity_change_withdraw_verification_action">"Tilbagetræk verifikation"</string>
<string name="dialog_confirm_link_message">"Linket %1$s fører dig til et andet websted %2$s
Er du sikker på, at du vil fortsætte?"</string>
<string name="dialog_confirm_link_title">"Dobbelttjek dette link"</string>
<string name="dialog_room_reported">"Rummet er anmeldt"</string>
<string name="dialog_room_reported_and_left">"Anmeldte og forlod rummet"</string>
<string name="dialog_title_confirmation">"Bekræftelse"</string>
<string name="dialog_title_error">"Fejl"</string>
<string name="dialog_title_success">"Succes"</string>
<string name="dialog_title_warning">"Advarsel"</string>
<string name="dialog_unsaved_changes_description_android">"Dine ændringer er ikke blevet gemt. Er du sikker på, at du vil gå tilbage?"</string>
<string name="dialog_unsaved_changes_title">"Gem ændringer?"</string>
<string name="error_account_creation_not_possible">"Din hjemmeserver skal opgraderes for at understøtte Matrix Authentication Service og kontooprettelse."</string>
<string name="error_failed_creating_the_permalink">"Oprettelse af permalink mislykkedes"</string>
<string name="error_failed_loading_map">"%1$s kunne ikke indlæse kortet. Prøv igen senere."</string>
<string name="error_failed_loading_messages">"Fejl under indlæsning af beskeder"</string>
<string name="error_failed_locating_user">"%1$s kunne ikke få adgang til din placering. Prøv igen senere."</string>
<string name="error_failed_uploading_voice_message">"Kunne ikke uploade din talebesked."</string>
<string name="error_message_not_found">"Meddelelsen blev ikke fundet"</string>
<string name="error_missing_location_auth_android">"%1$s har ikke tilladelse til at få adgang til din placering. Du kan aktivere adgang i Indstillinger."</string>
<string name="error_missing_location_rationale_android">"%1$s har ikke tilladelse til at se din placering. Aktivér adgang nedenfor."</string>
<string name="error_missing_microphone_voice_rationale_android">"%1$s har ikke tilladelse til at få adgang til din mikrofon. Aktivér adgang for at optage en stemmemeddelelse."</string>
<string name="error_network_or_server_issue">"Dette kan skyldes netværks- eller serverproblemer."</string>
<string name="error_room_address_already_exists">"Denne rumadresse er allerede taget. Prøv at redigere rummets adressefelt eller at skifte rummets navn"</string>
<string name="error_room_address_invalid_symbols">"Nogle tegn er ikke tilladt. Kun bogstaver, cifre og følgende symboler understøttes! $ &amp; \'() * +/; =? @ [] - . _"</string>
<string name="error_some_messages_have_not_been_sent">"Nogle beskeder er ikke blevet sendt"</string>
<string name="error_unknown">"Beklager, der opstod en fejl"</string>
<string name="event_shield_mismatched_sender">"Afsenderen af begivenheden matcher ikke ejeren af den enhed, der sendte den."</string>
<string name="event_shield_reason_authenticity_not_guaranteed">"Ægtheden af denne krypterede besked kan ikke garanteres på denne enhed."</string>
<string name="event_shield_reason_previously_verified">"Krypteret af en tidligere verificeret bruger."</string>
<string name="event_shield_reason_sent_in_clear">"Ikke krypteret."</string>
<string name="event_shield_reason_unknown_device">"Krypteret af en ukendt eller slettet enhed."</string>
<string name="event_shield_reason_unsigned_device">"Krypteret af en enhed, der ikke er verificeret af sin ejer."</string>
<string name="event_shield_reason_unverified_identity">"Krypteret af en ikke-verificeret bruger."</string>
<string name="invite_friends_rich_title">"🔐️ Kom med mig til %1$s"</string>
<string name="invite_friends_text">"Hej, lad os snakkes på %1$s: %2$s"</string>
<string name="login_initial_device_name_android">"%1$s Android"</string>
<string name="preference_rageshake">"Ryst enheden i frustration for at anmelde en fejl"</string>
<string name="screen_create_poll_option_accessibility_label">"%1$s: %2$s"</string>
<string name="screen_create_poll_options_section_title">"Valgmuligheder"</string>
<string name="screen_create_poll_remove_accessibility_label">"Fjern %1$s"</string>
<string name="screen_create_poll_settings_section_title">"Indstillinger"</string>
<string name="screen_media_picker_error_failed_selection">"Det lykkedes ikke at vælge medie. Prøv igen."</string>
<string name="screen_media_upload_preview_caption_warning">"Billedtekster er muligvis ikke synlige for personer, der bruger ældre apps."</string>
<string name="screen_media_upload_preview_error_failed_processing">"Det lykkedes ikke at behandle medier til upload. Prøv venligst igen."</string>
<string name="screen_media_upload_preview_error_failed_sending">"Upload af medier mislykkedes. Prøv igen."</string>
<string name="screen_pinned_timeline_empty_state_description">"Tryk på en besked og vælg \"%1$s\" for at inkludere den her."</string>
<string name="screen_pinned_timeline_empty_state_headline">"Fastgør vigtige beskeder, så de let kan opdages"</string>
<plurals name="screen_pinned_timeline_screen_title">
<item quantity="one">"%1$d Fastgjort besked"</item>
<item quantity="other">"%1$d Fastgjorte beskeder"</item>
</plurals>
<string name="screen_pinned_timeline_screen_title_empty">"Fastgjorte beskeder"</string>
<string name="screen_reset_identity_confirmation_subtitle">"Du er ved at gå til din %1$s konto for at nulstille din identitet. Derefter vil du blive ført tilbage til appen."</string>
<string name="screen_reset_identity_confirmation_title">"Kan du ikke bekræfte? Gå til din konto for at nulstille din identitet."</string>
<string name="screen_resolve_send_failure_changed_identity_primary_button_title">"Træk verifikationen tilbage og send"</string>
<string name="screen_resolve_send_failure_changed_identity_subtitle">"Du kan trække din verifikation tilbage og sende denne meddelelse alligevel, eller du kan annullere for nu og prøve igen senere efter at have gen-verificeret. %1$s"</string>
<string name="screen_resolve_send_failure_changed_identity_title">"Din besked blev ikke sendt, fordi %1$s\'s verificerede identitet er blevet nulstillet"</string>
<string name="screen_resolve_send_failure_unsigned_device_primary_button_title">"Send besked alligevel"</string>
<string name="screen_resolve_send_failure_unsigned_device_subtitle">"%1$s bruger en eller flere uverificerede enheder. Du kan sende beskeden alligevel, eller du kan annullere for nu og prøve igen senere, når %2$s har bekræftet alle deres enheder."</string>
<string name="screen_resolve_send_failure_unsigned_device_title">"Din besked blev ikke sendt, fordi %1$s ikke har bekræftet alle enheder"</string>
<string name="screen_resolve_send_failure_you_unsigned_device_subtitle">"En eller flere af dine enheder er ikke verificeret. Du kan sende beskeden alligevel, eller du kan annullere for nu og prøve igen senere, når du har verificeret alle dine enheder."</string>
<string name="screen_resolve_send_failure_you_unsigned_device_title">"Din besked blev ikke sendt, fordi du ikke har verificeret en eller flere af dine enheder"</string>
<string name="screen_room_error_failed_processing_media">"Det lykkedes ikke at behandle medier til upload. Prøv venligst igen."</string>
<string name="screen_room_error_failed_retrieving_user_details">"Kunne ikke hente brugeroplysninger"</string>
<string name="screen_room_event_pill">"Besked i %1$s"</string>
<string name="screen_room_pinned_banner_indicator">"%1$s af %2$s"</string>
<string name="screen_room_pinned_banner_indicator_description">"%1$s Fastgjorte beskeder"</string>
<string name="screen_room_pinned_banner_loading_description">"Indlæser besked…"</string>
<string name="screen_room_pinned_banner_view_all_button_title">"Se alle"</string>
<string name="screen_room_title">"Samtale"</string>
<string name="screen_share_location_title">"Del lokation"</string>
<string name="screen_share_my_location_action">"Del min lokation"</string>
<string name="screen_share_open_apple_maps">"Åbn i Apple Maps"</string>
<string name="screen_share_open_google_maps">"Åbn i Google Maps"</string>
<string name="screen_share_open_osm_maps">"Åbn i OpenStreetMap"</string>
<string name="screen_share_this_location_action">"Del denne lokation"</string>
<string name="screen_timeline_item_menu_send_failure_changed_identity">"Beskeden blev ikke sendt fordi %1$s s bekræftede identitet blev nulstillet."</string>
<string name="screen_timeline_item_menu_send_failure_unsigned_device">"Meddelelsen er ikke sendt, fordi %1$s ikke har bekræftet alle enheder."</string>
<string name="screen_timeline_item_menu_send_failure_you_unsigned_device">"Beskeden er ikke sendt, fordi du ikke har verificeret en eller flere af dine enheder."</string>
<string name="screen_view_location_title">"Lokation"</string>
<string name="settings_version_number">"Version: %1$s (%2$s)"</string>
<string name="test_language_identifier">"da"</string>
<string name="timeline_decryption_failure_historical_event_no_key_backup">"Historiske beskeder er ikke tilgængelige på denne enhed"</string>
<string name="timeline_decryption_failure_historical_event_unverified_device">"Du skal verificere denne enhed for at få adgang til historiske beskeder"</string>
<string name="timeline_decryption_failure_historical_event_user_not_joined">"Du har ikke adgang til denne besked"</string>
<string name="timeline_decryption_failure_unable_to_decrypt">"Kan ikke dekryptere beskeden"</string>
<string name="timeline_decryption_failure_withheld_unverified">"Denne besked blev blokeret, enten fordi du ikke verificerede din enhed, eller fordi afsenderen skal have verificeret din identitet."</string>
</resources>

View file

@ -27,7 +27,7 @@
</plurals>
<string name="a11y_read_receipts_single">"Gelesen von %1$s"</string>
<string name="a11y_read_receipts_tap_to_show_all">"Tippe, um alle anzuzeigen"</string>
<string name="a11y_remove_reaction_with">"Reaktion mit %1$s entfernen"</string>
<string name="a11y_remove_reaction">"Reaktion mit %1$s entfernen"</string>
<string name="a11y_send_files">"Dateien senden"</string>
<string name="a11y_show_password">"Passwort anzeigen"</string>
<string name="a11y_start_call">"Anruf starten"</string>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="a11y_add_reaction">"Προσθήκη αντίδρασης: %1$s"</string>
<string name="a11y_avatar">"Εικόνα Προφίλ"</string>
<string name="a11y_delete">"Διαγραφή"</string>
<plurals name="a11y_digits_entered">
@ -27,7 +28,8 @@
</plurals>
<string name="a11y_read_receipts_single">"Διαβάστηκε από %1$s"</string>
<string name="a11y_read_receipts_tap_to_show_all">"Πάτα για εμφάνιση όλων"</string>
<string name="a11y_remove_reaction_with">"Αφαίρεση αντίδρασης με %1$s"</string>
<string name="a11y_remove_reaction">"Αφαίρεση αντίδρασης με %1$s"</string>
<string name="a11y_remove_reaction_with">"Αφαιρέστε την αντίδραση με %1$s"</string>
<string name="a11y_send_files">"Αποστολή αρχείων"</string>
<string name="a11y_show_password">"Εμφάνιση κωδικού πρόσβασης"</string>
<string name="a11y_start_call">"Ξεκίνησε μια κλήση"</string>
@ -56,7 +58,7 @@
<string name="action_copy_link_to_message">"Αντιγραφή συνδέσμου στο μήνυμα"</string>
<string name="action_copy_text">"Αντιγραφή κειμένου"</string>
<string name="action_create">"Δημιουργία"</string>
<string name="action_create_a_room">"Δημιούργησε ένα δωμάτιο"</string>
<string name="action_create_a_room">"Δημιουργία αίθουσας"</string>
<string name="action_deactivate">"Απενεργοποίηση"</string>
<string name="action_deactivate_account">"Απενεργοποίηση λογαριασμού"</string>
<string name="action_decline">"Απόρριψη"</string>
@ -85,7 +87,7 @@
<string name="action_learn_more">"Μάθε περισσότερα"</string>
<string name="action_leave">"Αποχώρηση"</string>
<string name="action_leave_conversation">"Αποχώρηση από τη συζήτηση"</string>
<string name="action_leave_room">"Αποχώρηση από το δωμάτιο"</string>
<string name="action_leave_room">"Αποχώρηση από την αίθουσα"</string>
<string name="action_load_more">"Φόρτωσε περισσότερα"</string>
<string name="action_manage_account">"Διαχείριση λογαριασμού"</string>
<string name="action_manage_devices">"Διαχείριση συσκευών"</string>
@ -110,7 +112,7 @@
<string name="action_report_bug">"Αναφορά σφάλματος"</string>
<string name="action_report_content">"Αναφορά περιεχομένου"</string>
<string name="action_report_dm">"Αναφορά συνομιλίας"</string>
<string name="action_report_room">"Αναφορά δωματίου"</string>
<string name="action_report_room">"Αναφορά αίθουσας"</string>
<string name="action_reset">"Επαναφορά"</string>
<string name="action_reset_identity">"Επαναφορά ταυτότητας"</string>
<string name="action_retry">"Επανάληψη"</string>
@ -144,6 +146,7 @@
<string name="common_acceptable_use_policy">"Πολιτική αποδεκτής χρήσης"</string>
<string name="common_adding_caption">"Η λεζάντα προστίθεται"</string>
<string name="common_advanced_settings">"Ρυθμίσεις για προχωρημένους"</string>
<string name="common_an_image">"μια εικόνα"</string>
<string name="common_analytics">"Στατιστικά στοιχεία"</string>
<string name="common_appearance">"Εμφάνιση"</string>
<string name="common_audio">"Ήχος"</string>
@ -153,9 +156,9 @@
<string name="common_chat_backup">"Αντίγραφο ασφαλείας συνομιλίας"</string>
<string name="common_copied_to_clipboard">"Αντιγράφηκε στο πρόχειρο"</string>
<string name="common_copyright">"Πνευματικά δικαιώματα"</string>
<string name="common_creating_room">"Δημιουργία δωματίου…"</string>
<string name="common_creating_room">"Δημιουργία αίθουσας…"</string>
<string name="common_current_user_canceled_knock">"Το αίτημα ακυρώθηκε"</string>
<string name="common_current_user_left_room">"Αποχώρησε από το δωμάτιο"</string>
<string name="common_current_user_left_room">"Αποχώρησε από την αίθουσα"</string>
<string name="common_current_user_rejected_invite">"Η πρόσκληση απορρίφθηκε"</string>
<string name="common_dark">"Σκοτεινό"</string>
<string name="common_decryption_error">"Σφάλμα αποκρυπτογράφησης"</string>
@ -192,7 +195,7 @@
<string name="common_in_reply_to">"Σε απάντηση στον χρήστη %1$s"</string>
<string name="common_install_apk_android">"Εγκατάσταση APK"</string>
<string name="common_invite_unknown_profile">"Αυτό το Matrix ID δεν μπορεί να βρεθεί, επομένως η πρόσκληση ενδέχεται να μην ληφθεί."</string>
<string name="common_leaving_room">"Αποχώρηση από το δωμάτιο"</string>
<string name="common_leaving_room">"Αποχώρηση από την αίθουσα"</string>
<string name="common_light">"Φωτεινό"</string>
<string name="common_line_copied_to_clipboard">"Η γραμμή αντιγράφηκε στο πρόχειρο"</string>
<string name="common_link_copied_to_clipboard">"Ο σύνδεσμος αντιγράφηκε στο πρόχειρο"</string>
@ -214,7 +217,7 @@
<string name="common_mute">"Σίγαση"</string>
<string name="common_name_and_id">"%1$s (%2$s)"</string>
<string name="common_no_results">"Κανένα αποτέλεσμα"</string>
<string name="common_no_room_name">"Χωρίς όνομα δωματίου"</string>
<string name="common_no_room_name">"Δεν υπάρχει όνομα αίθουσας"</string>
<string name="common_not_encrypted">"Χωρίς κρυπτογράφηση"</string>
<string name="common_offline">"Εκτός σύνδεσης"</string>
<string name="common_open_source_licenses">"Άδειες ανοιχτού κώδικα"</string>
@ -240,13 +243,17 @@
<string name="common_reason">"Αιτιολογία"</string>
<string name="common_recovery_key">"Κλειδί ανάκτησης"</string>
<string name="common_refreshing">"Ανανέωση…"</string>
<plurals name="common_replies">
<item quantity="one">"%1$d απάντηση"</item>
<item quantity="other">"%1$d απαντήσεις"</item>
</plurals>
<string name="common_replying_to">"Απάντηση σε %1$s"</string>
<string name="common_report_a_bug">"Αναφορά σφάλματος"</string>
<string name="common_report_a_problem">"Αναφορά προβλήματος"</string>
<string name="common_report_submitted">"Η αναφορά υποβλήθηκε"</string>
<string name="common_rich_text_editor">"Επεξεργαστής εμπλουτισμένου κειμένου"</string>
<string name="common_room">"Αίθουσα"</string>
<string name="common_room_name">"Όνομα δωματίου"</string>
<string name="common_room_name">"Όνομα αίθουσας"</string>
<string name="common_room_name_placeholder">"πχ. το όνομα του έργου σου"</string>
<string name="common_saved_changes">"Αποθηκευμένες αλλαγές"</string>
<string name="common_saving">"Αποθηκεύεται"</string>
@ -259,6 +266,7 @@
<string name="common_sending">"Αποστολή…"</string>
<string name="common_sending_failed">"Αποτυχία αποστολής"</string>
<string name="common_sent">"Εστάλη"</string>
<string name="common_sentence_delimiter">". "</string>
<string name="common_server_not_supported">"Ο διακομιστής δεν υποστηρίζεται"</string>
<string name="common_server_url">"URL διακομιστή"</string>
<string name="common_settings">"Ρυθμίσεις"</string>
@ -276,7 +284,7 @@
<string name="common_third_party_notices">"Ειδοποιήσεις τρίτων"</string>
<string name="common_thread">"Νήμα"</string>
<string name="common_topic">"Θέμα"</string>
<string name="common_topic_placeholder">"Τί αφορά το δωμάτιο;"</string>
<string name="common_topic_placeholder">"Τι αφορά αυτή η αίθουσα;"</string>
<string name="common_unable_to_decrypt">"Δεν είναι δυνατή η αποκρυπτογράφηση"</string>
<string name="common_unable_to_decrypt_insecure_device">"Στάλθηκε από μια μη ασφαλής συσκευή"</string>
<string name="common_unable_to_decrypt_no_access">"Δεν έχεις πρόσβαση σε αυτό το μήνυμα"</string>
@ -310,8 +318,8 @@
Είστε βέβαιοι ότι θέλετε να συνεχίσετε;"</string>
<string name="dialog_confirm_link_title">"Ελέγξτε ξανά αυτόν τον σύνδεσμο"</string>
<string name="dialog_room_reported">"Το δωμάτιο αναφέρθηκε"</string>
<string name="dialog_room_reported_and_left">"Αναφέρθηκε και αποχωρήσατε από το δωμάτιο"</string>
<string name="dialog_room_reported">"Η αίθουσα αναφέρθηκε"</string>
<string name="dialog_room_reported_and_left">"Αναφέρθηκε και αποχωρήσατε από την αίθουσα"</string>
<string name="dialog_title_confirmation">"Επιβεβαίωση"</string>
<string name="dialog_title_error">"Σφάλμα"</string>
<string name="dialog_title_success">"Επιτυχία"</string>
@ -324,15 +332,17 @@
<string name="error_failed_loading_messages">"Αποτυχία φόρτωσης μηνυμάτων"</string>
<string name="error_failed_locating_user">"Το %1$s δεν μπόρεσε να αποκτήσει πρόσβαση στην τοποθεσία σου. Προσπάθησε ξανά αργότερα."</string>
<string name="error_failed_uploading_voice_message">"Αποτυχία μεταφόρτωσης του φωνητικού σου μηνύματος."</string>
<string name="error_invalid_invite">"Η αίθουσα δεν υπάρχει πλέον ή η πρόσκληση δεν ισχύει πλέον."</string>
<string name="error_message_not_found">"Το μήνυμα δεν βρέθηκε"</string>
<string name="error_missing_location_auth_android">"Το %1$s δεν έχει άδεια πρόσβασης στην τοποθεσία σου. Μπορείς να ενεργοποιήσεις την πρόσβαση στις Ρυθμίσεις."</string>
<string name="error_missing_location_rationale_android">"Ο χρήστης %1$s δεν έχει άδεια πρόσβασης στην τοποθεσία σου. Ενεργοποίησε την πρόσβαση παρακάτω."</string>
<string name="error_missing_microphone_voice_rationale_android">"Το %1$s δεν έχει άδεια πρόσβασης στο μικρόφωνό σου. Ενεργοποίησε την πρόσβαση για εγγραφή φωνητικού μηνύματος."</string>
<string name="error_network_or_server_issue">"Αυτό μπορεί να οφείλεται σε προβλήματα δικτύου ή διακομιστή."</string>
<string name="error_room_address_already_exists">"Αυτή η διεύθυνση δωματίου υπάρχει ήδη, δοκίμασε να επεξεργαστείς το πεδίο διεύθυνσης δωματίου ή να αλλάξεις το όνομα δωματίου"</string>
<string name="error_room_address_already_exists">"Αυτή η διεύθυνση αίθουσας υπάρχει ήδη. Παρακαλώ δοκιμάστε να επεξεργαστείτε το πεδίο διεύθυνσης αίθουσας ή αλλάξτε το όνομα της αίθουσας"</string>
<string name="error_room_address_invalid_symbols">"Ορισμένοι χαρακτήρες δεν επιτρέπονται. Υποστηρίζονται μόνο γράμματα, ψηφία και τα ακόλουθα σύμβολα ! $ &amp; \'() * +/; = ? @ [] - . _"</string>
<string name="error_some_messages_have_not_been_sent">"Ορισμένα μηνύματα δεν έχουν σταλεί"</string>
<string name="error_unknown">"Λυπούμαστε, παρουσιάστηκε σφάλμα"</string>
<string name="event_shield_mismatched_sender">"Ο αποστολέας του συμβάντος δεν ταιριάζει με τον κάτοχο της συσκευής που το έστειλε."</string>
<string name="event_shield_reason_authenticity_not_guaranteed">"Η αυθεντικότητα αυτού του κρυπτογραφημένου μηνύματος δεν είναι εγγυημένη σε αυτήν τη συσκευή."</string>
<string name="event_shield_reason_previously_verified">"Κρυπτογραφημένο από έναν προηγουμένως επαληθευμένο χρήστη."</string>
<string name="event_shield_reason_sent_in_clear">"Μη κρυπτογραφημένο."</string>
@ -343,6 +353,10 @@
<string name="invite_friends_text">"Γεια, μίλα μου στην εφαρμογή %1$s :%2$s"</string>
<string name="login_initial_device_name_android">"%1$s Android"</string>
<string name="preference_rageshake">"Κούνησε δυνατά τη συσκευή σου για να αναφέρεις κάποιο σφάλμα"</string>
<string name="screen_create_poll_option_accessibility_label">"%1$s: %2$s"</string>
<string name="screen_create_poll_options_section_title">"Επιλογές"</string>
<string name="screen_create_poll_remove_accessibility_label">"Αφαίρεση %1$s"</string>
<string name="screen_create_poll_settings_section_title">"Ρυθμίσεις"</string>
<string name="screen_media_picker_error_failed_selection">"Αποτυχία επιλογής πολυμέσου, δοκίμασε ξανά."</string>
<string name="screen_media_upload_preview_caption_warning">"Οι λεζάντες ενδέχεται να μην είναι ορατές σε άτομα που χρησιμοποιούν παλαιότερες εφαρμογές."</string>
<string name="screen_media_upload_preview_error_failed_processing">"Αποτυχία μεταφόρτωσης μέσου, δοκίμασε ξανά."</string>
@ -367,6 +381,9 @@
<string name="screen_room_error_failed_processing_media">"Αποτυχία μεταφόρτωσης μέσου, δοκίμασε ξανά."</string>
<string name="screen_room_error_failed_retrieving_user_details">"Δεν ήταν δυνατή η ανάκτηση στοιχείων χρήστη"</string>
<string name="screen_room_event_pill">"Μήνυμα στο %1$s"</string>
<string name="screen_room_grouped_state_events_expand">"Επέκταση"</string>
<string name="screen_room_grouped_state_events_reduce">"Μείωση"</string>
<string name="screen_room_permalink_same_room_android">"Βλέπετε ήδη αυτήν την αίθουσα!"</string>
<string name="screen_room_pinned_banner_indicator">"%1$s από %2$s"</string>
<string name="screen_room_pinned_banner_indicator_description">"%1$s Καρφιτσωμένα μηνύματα"</string>
<string name="screen_room_pinned_banner_loading_description">"Φόρτωση μηνύματος…"</string>

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