Merge branch 'develop' into feature/fga/csam_preferences_server
This commit is contained in:
commit
773fa1657a
623 changed files with 4661 additions and 2049 deletions
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 })
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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 = {},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
)
|
||||
}
|
||||
|
|
@ -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,
|
||||
)
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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?,
|
||||
|
|
|
|||
|
|
@ -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) }
|
||||
|
|
|
|||
|
|
@ -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>,
|
||||
)
|
||||
|
|
@ -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?,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()}")
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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> {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -225,7 +225,7 @@ class FakeBaseRoom(
|
|||
override fun predecessorRoom(): PredecessorRoom? = predecessorRoomResult()
|
||||
}
|
||||
|
||||
fun defaultRoomPowerLevels() = RoomPowerLevelsValues(
|
||||
fun defaultRoomPowerLevelValues() = RoomPowerLevelsValues(
|
||||
ban = 50,
|
||||
invite = 0,
|
||||
kick = 50,
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
81
libraries/push/impl/src/main/res/values-da/translations.xml
Normal file
81
libraries/push/impl/src/main/res/values-da/translations.xml
Normal 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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 l’envoi - veuillez ouvrir le salon"</string>
|
||||
<string name="notification_invitation_action_join">"Rejoindre"</string>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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ı açın"</string>
|
||||
<string name="notification_invitation_action_join">"Katıl"</string>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
402
libraries/ui-strings/src/main/res/values-da/translations.xml
Normal file
402
libraries/ui-strings/src/main/res/values-da/translations.xml
Normal 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! $ & \'() * +/; =? @ [] - . _"</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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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">"Ορισμένοι χαρακτήρες δεν επιτρέπονται. Υποστηρίζονται μόνο γράμματα, ψηφία και τα ακόλουθα σύμβολα ! $ & \'() * +/; = ? @ [] - . _"</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
Loading…
Add table
Add a link
Reference in a new issue