Merge branch 'develop' into feature/valere/call/decline_timeline_rendering

This commit is contained in:
Valere 2026-05-11 11:21:02 +02:00
commit a478d87fc3
995 changed files with 7864 additions and 3674 deletions

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_settings_help_us_improve">"問題発見のため、匿名の使用データの共有にご協力ください。"</string>
<string name="screen_analytics_settings_read_terms">"利用規約の全文を%1$sから確認することができます。"</string>
<string name="screen_analytics_settings_help_us_improve">"改善のため、匿名の使用データの共有にご協力ください。"</string>
<string name="screen_analytics_settings_read_terms">"規約の全文は%1$sから確認することができます。"</string>
<string name="screen_analytics_settings_read_terms_content_link">"こちら"</string>
<string name="screen_analytics_settings_share_data">"使用データを共有"</string>
</resources>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_settings_help_us_improve">"共享匿名使用数据以帮助我们排查问题。"</string>
<string name="screen_analytics_settings_read_terms">"你可以阅读我们的所有条款 %1$s。"</string>
<string name="screen_analytics_settings_read_terms">"你可以点击 %1$s 阅读我们的所有条款。"</string>
<string name="screen_analytics_settings_read_terms_content_link">"此处"</string>
<string name="screen_analytics_settings_share_data">"共享分析数据"</string>
</resources>

View file

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_prompt_data_usage">"いかなる個人情報も記録, 分析されることはありません"</string>
<string name="screen_analytics_prompt_help_us_improve">"問題発見のため、匿名の使用データの共有にご協力ください。"</string>
<string name="screen_analytics_prompt_read_terms">"利用規約の全文を%1$sから確認することができます。"</string>
<string name="screen_analytics_prompt_help_us_improve">"改善のため、匿名の使用データの共有にご協力ください。"</string>
<string name="screen_analytics_prompt_read_terms">"規約の全文は%1$sから確認することができます。"</string>
<string name="screen_analytics_prompt_read_terms_content_link">"こちら"</string>
<string name="screen_analytics_prompt_settings">"いつでも設定は変更できます"</string>
<string name="screen_analytics_prompt_third_party_sharing">"情報が第三者に共有されることはありません"</string>

View file

@ -2,7 +2,7 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_prompt_data_usage">"我们不会记录或分析任何个人数据"</string>
<string name="screen_analytics_prompt_help_us_improve">"共享匿名使用数据以帮助我们排查问题。"</string>
<string name="screen_analytics_prompt_read_terms">"你可以阅读我们的所有条款 %1$s。"</string>
<string name="screen_analytics_prompt_read_terms">"你可以点击 %1$s 阅读我们的所有条款。"</string>
<string name="screen_analytics_prompt_read_terms_content_link">"此处"</string>
<string name="screen_analytics_prompt_settings">"可以随时关闭此功能"</string>
<string name="screen_analytics_prompt_third_party_sharing">"我们不会与第三方共享你的数据"</string>

View file

@ -9,6 +9,8 @@ package io.element.android.features.call.impl.ui
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.features.call.impl.notifications.CallNotificationData
import io.element.android.libraries.designsystem.preview.ROOM_NAME
import io.element.android.libraries.designsystem.preview.USER_NAME_BOB
import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.SessionId
@ -34,8 +36,8 @@ internal fun aCallNotificationData(
roomId = RoomId("!1234:matrix.org"),
eventId = EventId("\$asdadadsad:matrix.org"),
senderId = UserId("@bob:matrix.org"),
roomName = "A room",
senderName = "Bob",
roomName = ROOM_NAME,
senderName = USER_NAME_BOB,
avatarUrl = null,
notificationChannelId = "incoming_call",
timestamp = 0L,

View file

@ -1,26 +0,0 @@
/*
* Copyright (c) 2026 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.features.call.impl.ui
internal sealed interface CallScreenBackPressAction {
data object DispatchEscapeToWebView : CallScreenBackPressAction
data object EnterPictureInPicture : CallScreenBackPressAction
}
internal object CallScreenBackPressPolicy {
fun resolve(
supportPip: Boolean,
hasWebView: Boolean,
fromNative: Boolean,
): CallScreenBackPressAction? {
return when {
hasWebView && fromNative -> CallScreenBackPressAction.DispatchEscapeToWebView
hasWebView && supportPip -> CallScreenBackPressAction.EnterPictureInPicture
else -> null
}
}
}

View file

@ -64,15 +64,11 @@ internal fun CallScreenView(
requestPermissions: (Array<String>, RequestPermissionCallback) -> Unit,
modifier: Modifier = Modifier,
) {
var callWebView by remember { mutableStateOf<WebView?>(null) }
fun handleBack(fromNative: Boolean = false) {
when (CallScreenBackPressPolicy.resolve(supportPip = pipState.supportPip, hasWebView = callWebView != null, fromNative)) {
CallScreenBackPressAction.EnterPictureInPicture ->
pipState.eventSink(PictureInPictureEvent.EnterPictureInPicture)
CallScreenBackPressAction.DispatchEscapeToWebView ->
callWebView?.dispatchEscKeyEvent()
null -> Timber.d("Back press with unsupported pip is a no-op")
fun handleBack() {
if (pipState.supportPip) {
pipState.eventSink.invoke(PictureInPictureEvent.EnterPictureInPicture)
} else {
state.eventSink(CallScreenEvent.Hangup)
}
}
@ -80,7 +76,7 @@ internal fun CallScreenView(
modifier = modifier,
) { padding ->
BackHandler {
handleBack(fromNative = true)
handleBack()
}
if (state.webViewError != null) {
ErrorDialog(
@ -115,7 +111,6 @@ internal fun CallScreenView(
},
onConsoleMessage = onConsoleMessage,
onCreateWebView = { webView ->
callWebView = webView
webView.addBackHandler(onBackPressed = ::handleBack)
val interceptor = WebViewWidgetMessageInterceptor(
webView = webView,
@ -140,7 +135,6 @@ internal fun CallScreenView(
pipState.eventSink(PictureInPictureEvent.SetPipController(pipController))
},
onDestroyWebView = {
callWebView = null
// Reset audio mode
webViewAudioManager?.onCallStopped()
}
@ -149,7 +143,6 @@ internal fun CallScreenView(
AsyncData.Uninitialized,
is AsyncData.Loading ->
ProgressDialog(text = stringResource(id = CommonStrings.common_please_wait))
is AsyncData.Failure -> {
Timber.e(state.urlState.error, "WebView failed to load URL: ${state.urlState.error.message}")
ErrorDialog(
@ -157,7 +150,6 @@ internal fun CallScreenView(
onSubmit = { state.eventSink(CallScreenEvent.Hangup) },
)
}
is AsyncData.Success -> Unit
}
}
@ -256,18 +248,15 @@ private fun WebView.setup(
private fun WebView.addBackHandler(onBackPressed: () -> Unit) {
addJavascriptInterface(
JavascriptBackHandler {
onBackPressed()
object {
@Suppress("unused")
@JavascriptInterface
fun onBackPressed() = onBackPressed()
},
"backHandler"
)
}
private fun WebView.dispatchEscKeyEvent() {
dispatchKeyEvent(android.view.KeyEvent(android.view.KeyEvent.ACTION_DOWN, android.view.KeyEvent.KEYCODE_ESCAPE))
dispatchKeyEvent(android.view.KeyEvent(android.view.KeyEvent.ACTION_UP, android.view.KeyEvent.KEYCODE_ESCAPE))
}
@PreviewsDayNight
@Composable
internal fun CallScreenViewPreview(
@ -286,8 +275,3 @@ internal fun CallScreenViewPreview(
internal fun InvalidAudioDeviceDialogPreview() = ElementPreview {
InvalidAudioDeviceDialog(invalidAudioDeviceReason = InvalidAudioDeviceReason.BT_AUDIO_DEVICE_DISABLED) {}
}
internal fun interface JavascriptBackHandler {
@JavascriptInterface
fun onBackPressed()
}

View file

@ -1,96 +0,0 @@
/*
* Copyright (c) 2026 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.features.call.ui
import com.google.common.truth.Truth.assertThat
import io.element.android.features.call.impl.ui.CallScreenBackPressAction
import io.element.android.features.call.impl.ui.CallScreenBackPressPolicy
import org.junit.Test
class CallScreenBackPressPolicyTest {
@Test
fun `resolve returns dispatch escape when a web view is available and native button is pressed`() {
val result = CallScreenBackPressPolicy.resolve(
supportPip = false,
hasWebView = true,
fromNative = true,
)
assertThat(result).isEqualTo(CallScreenBackPressAction.DispatchEscapeToWebView)
}
@Test
fun `resolve dispatch escape when there is a web view and pip is supported on native button press`() {
val result = CallScreenBackPressPolicy.resolve(
supportPip = true,
hasWebView = true,
fromNative = true,
)
assertThat(result).isEqualTo(CallScreenBackPressAction.DispatchEscapeToWebView)
}
@Test
fun `resolve returns hangup when there is no web view and pip is not supported from native button`() {
val result = CallScreenBackPressPolicy.resolve(
supportPip = false,
hasWebView = false,
fromNative = true,
)
assertThat(result).isNull()
}
@Test
fun `resolve returns hangup when there is no web view even though pip is supported from native button`() {
val result = CallScreenBackPressPolicy.resolve(
supportPip = true,
hasWebView = false,
fromNative = true,
)
assertThat(result).isNull()
}
@Test
fun `resolve goes to pip if its not from native but from the webview`() {
val result = CallScreenBackPressPolicy.resolve(
supportPip = true,
hasWebView = true,
fromNative = false,
)
assertThat(result).isEqualTo(CallScreenBackPressAction.EnterPictureInPicture)
}
@Test
fun `resolve hangs up if its not from native but from the webview and pip is not supported`() {
val result = CallScreenBackPressPolicy.resolve(
supportPip = false,
hasWebView = true,
fromNative = false,
)
assertThat(result).isNull()
}
@Test
fun `invalid cases (event comes from webview but there is now webview) all result in hangup`() {
val withPipSupport = CallScreenBackPressPolicy.resolve(
supportPip = true,
hasWebView = false,
fromNative = false,
)
assertThat(withPipSupport).isNull()
val withOutPipSupport = CallScreenBackPressPolicy.resolve(
supportPip = false,
hasWebView = false,
fromNative = false,
)
assertThat(withOutPipSupport).isNull()
}
}

View file

@ -1,148 +0,0 @@
/*
* Copyright (c) 2026 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
@file:OptIn(ExperimentalTestApi::class)
package io.element.android.features.call.ui
import android.view.KeyEvent
import android.webkit.WebView
import androidx.activity.ComponentActivity
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.platform.LocalInspectionMode
import androidx.compose.ui.test.AndroidComposeUiTest
import androidx.compose.ui.test.ExperimentalTestApi
import androidx.compose.ui.test.v2.runAndroidComposeUiTest
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.element.android.features.call.impl.pip.PictureInPictureEvent
import io.element.android.features.call.impl.pip.aPictureInPictureState
import io.element.android.features.call.impl.ui.CallScreenEvent
import io.element.android.features.call.impl.ui.CallScreenView
import io.element.android.features.call.impl.ui.JavascriptBackHandler
import io.element.android.features.call.impl.ui.aCallScreenState
import io.element.android.tests.testutils.EventsRecorder
import io.element.android.tests.testutils.pressBackKey
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.annotation.Config
import org.robolectric.annotation.Implementation
import org.robolectric.annotation.Implements
import org.robolectric.annotation.Resetter
import org.robolectric.shadows.ShadowWebView
@RunWith(AndroidJUnit4::class)
class CallScreenViewTest {
@Test
fun `pressing back key triggers hangup when no web view is available and pip is unsupported`() = runAndroidComposeUiTest {
val callEvents = EventsRecorder<CallScreenEvent>()
setCallScreenView(
state = aCallScreenState(eventSink = callEvents),
useInspectionMode = true,
)
pressBackKey()
callEvents.assertEmpty()
}
@Config(shadows = [RecordingShadowWebView::class])
@Test
fun `pressing back key dispatches escape key events to web view when pip is unsupported`() = runAndroidComposeUiTest {
setCallScreenView(
state = aCallScreenState(),
useInspectionMode = false,
)
pressBackKey()
val dispatchedEvents = RecordingShadowWebView.dispatchedEvents
assertEquals(2, dispatchedEvents.size)
assertEquals(KeyEvent.ACTION_DOWN, dispatchedEvents[0].action)
assertEquals(KeyEvent.KEYCODE_ESCAPE, dispatchedEvents[0].keyCode)
assertEquals(KeyEvent.ACTION_UP, dispatchedEvents[1].action)
assertEquals(KeyEvent.KEYCODE_ESCAPE, dispatchedEvents[1].keyCode)
}
@Config(shadows = [RecordingShadowWebView::class])
@Test
fun `web view javascript back handler emits pip event when pip is supported`() = runAndroidComposeUiTest {
val pipEvents = EventsRecorder<PictureInPictureEvent>()
setCallScreenView(
state = aCallScreenState(),
useInspectionMode = false,
pipState = aPictureInPictureState(
supportPip = true,
eventSink = pipEvents,
),
)
runOnIdle {
RecordingShadowWebView.invokeJavascriptBackHandler()
}
pipEvents.assertSize(2)
pipEvents.assertTrue(0) { it is PictureInPictureEvent.SetPipController }
pipEvents.assertTrue(1) { it is PictureInPictureEvent.EnterPictureInPicture }
}
}
private fun AndroidComposeUiTest<ComponentActivity>.setCallScreenView(
state: io.element.android.features.call.impl.ui.CallScreenState,
useInspectionMode: Boolean,
pipState: io.element.android.features.call.impl.pip.PictureInPictureState = aPictureInPictureState(supportPip = false),
) {
setContent {
// Inspection mode disables AndroidView creation; keep it configurable per test.
CompositionLocalProvider(LocalInspectionMode provides useInspectionMode) {
CallScreenView(
state = state,
pipState = pipState,
onConsoleMessage = {},
requestPermissions = { _, _ -> },
)
}
}
}
@Implements(WebView::class)
internal class RecordingShadowWebView : ShadowWebView() {
companion object {
val dispatchedEvents = mutableListOf<KeyEvent>()
private var backHandlerJavascriptInterface: JavascriptBackHandler? = null
@Resetter
@JvmStatic
@Suppress("unused")
fun resetRecordedEvents() {
dispatchedEvents.clear()
backHandlerJavascriptInterface = null
}
fun invokeJavascriptBackHandler() {
val backHandler = checkNotNull(backHandlerJavascriptInterface) { "Expected backHandler JavaScript interface to be registered" }
backHandler.onBackPressed()
}
}
@Implementation
protected override fun addJavascriptInterface(`object`: Any, name: String) {
super.addJavascriptInterface(`object`, name)
if (name == "backHandler") {
backHandlerJavascriptInterface = `object` as? JavascriptBackHandler
}
}
@Implementation
@Suppress("unused")
fun dispatchKeyEvent(event: KeyEvent): Boolean {
dispatchedEvents += KeyEvent(event)
return false
}
}

View file

@ -19,7 +19,7 @@ Du kan ændre dette når som helst i rummets indstillinger."</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_title">"Anmod om at deltage"</string>
<string name="screen_create_room_room_access_section_private_option_description">"Kun inviterede brugere kan deltage."</string>
<string name="screen_create_room_room_access_section_private_option_title">"Privat"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Alle kan deltage i dette rum"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Alle kan deltage."</string>
<string name="screen_create_room_room_access_section_public_option_title">"Offentlig"</string>
<string name="screen_create_room_room_access_section_restricted_option_description">"Alle i %1$s kan deltage."</string>
<string name="screen_create_room_room_access_section_restricted_option_title">"Standard"</string>

View file

@ -28,7 +28,8 @@ Du kannst dies jederzeit in den Einstellungen des Chats ändern."</string>
<string name="screen_create_room_room_address_section_title">"Adresse"</string>
<string name="screen_create_room_room_visibility_section_title">" Sichtbarkeit des Chats"</string>
<string name="screen_create_room_space_selection_no_space_description">"(kein Space)"</string>
<string name="screen_create_room_space_selection_no_space_title">"Home"</string>
<string name="screen_create_room_space_selection_no_space_option">"Nicht zu einem Space hinzufügen"</string>
<string name="screen_create_room_space_selection_no_space_title">"Kein Space ausgewählt"</string>
<string name="screen_create_room_space_selection_sheet_title">"Space hinzufügen"</string>
<string name="screen_create_room_topic_label">"Thema (optional)"</string>
<string name="screen_create_room_topic_placeholder">"Beschreibung hinzufügen…"</string>

View file

@ -3,7 +3,7 @@
<string name="screen_create_room_action_create_room">"اتاق جدید"</string>
<string name="screen_create_room_add_people_title">"دعوت افراد"</string>
<string name="screen_create_room_error_creating_room">"هنگام ایجاد اتاق خطایی رخ داد"</string>
<string name="screen_create_room_private_option_description">"تنها افراد دعوت شده می‌توانند به این اتاق دسترسی داشته باشند. همهٔ پیام‌ها رمزنگاری سرتاسری شده‌اند."</string>
<string name="screen_create_room_private_option_description">"تنها افراد دعوت شده می‌توانند بپیوندند."</string>
<string name="screen_create_room_public_option_description">"هرکسی می‌تواند اتاق را بیابد.
می‌توانید بعداً در تظیمات اتاق عوضش کنید."</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"درخواست دعوت"</string>

View file

@ -3,14 +3,34 @@
<string name="screen_create_room_action_create_room">"Nowy pokój"</string>
<string name="screen_create_room_add_people_title">"Zaproś znajomych"</string>
<string name="screen_create_room_error_creating_room">"Wystąpił błąd w trakcie tworzenia pokoju"</string>
<string name="screen_create_room_private_option_description">"Tylko zaproszone osoby mogą dołączyć do tego pokoju. Wszystkie wiadomości są szyfrowane end-to-end."</string>
<string name="screen_create_room_error_creating_space">"Nie udało się utworzyć przestrzeni z powodu nieznanego błędu. Spróbuj ponownie później."</string>
<string name="screen_create_room_name_placeholder">"Dodaj nazwę…"</string>
<string name="screen_create_room_new_room_title">"Nowy pokój"</string>
<string name="screen_create_room_new_space_title">"Nowa przestrzeń"</string>
<string name="screen_create_room_private_option_description">"Dołączyć mogą tylko zaproszone osoby."</string>
<string name="screen_create_room_private_option_title">"Prywatny"</string>
<string name="screen_create_room_public_option_description">"Każdy może znaleźć ten pokój.
Możesz to zmienić w ustawieniach pokoju."</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Każdy może poprosić o dołączenie do pokoju, ale administrator lub moderator będzie musiał zatwierdzić prośbę"</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Poproś o dołączenie"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Każdy może dołączyć do tego pokoju"</string>
<string name="screen_create_room_room_address_section_footer">"Aby ten pokój był widoczny w katalogu pomieszczeń publicznych, będziesz potrzebował adres pokoju."</string>
<string name="screen_create_room_room_address_section_title">"Adres pokoju"</string>
<string name="screen_create_room_public_option_short_description">"Każdy może dołączyć."</string>
<string name="screen_create_room_public_option_title">"Publiczny"</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Każdy może poprosić o dołączenie, ale administrator lub moderator musi to zaakceptować."</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Zezwól na prośbę o dołączenie"</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_description">"Każdy w %1$s może dołączyć, ale wszyscy pozostali muszą poprosić o dostęp."</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_title">"Poproś o dołączenie"</string>
<string name="screen_create_room_room_access_section_private_option_description">"Dołączyć mogą tylko zaproszone osoby."</string>
<string name="screen_create_room_room_access_section_private_option_title">"Prywatny"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Każdy może dołączyć."</string>
<string name="screen_create_room_room_access_section_public_option_title">"Publiczny"</string>
<string name="screen_create_room_room_access_section_restricted_option_description">"Każdy w %1$s może dołączyć."</string>
<string name="screen_create_room_room_access_section_restricted_option_title">"Standardowy"</string>
<string name="screen_create_room_room_access_section_title">"Kto ma dostęp"</string>
<string name="screen_create_room_room_address_section_footer">"Aby ten pokój był widoczny w katalogu pomieszczeń publicznych, potrzebny jest adres pokoju."</string>
<string name="screen_create_room_room_address_section_title">"Adres"</string>
<string name="screen_create_room_room_visibility_section_title">"Widoczność pomieszczenia"</string>
<string name="screen_create_room_space_selection_no_space_description">"(brak przestrzeni)"</string>
<string name="screen_create_room_space_selection_no_space_option">"Nie dodawaj do przestrzeni"</string>
<string name="screen_create_room_space_selection_no_space_title">"Nie wybrano przestrzeni"</string>
<string name="screen_create_room_space_selection_sheet_title">"Dodaj do przestrzeni"</string>
<string name="screen_create_room_topic_label">"Temat (opcjonalnie)"</string>
<string name="screen_create_room_topic_placeholder">"Dodaj opis…"</string>
</resources>

View file

@ -3,22 +3,32 @@
<string name="screen_create_room_action_create_room">"Нова кімната"</string>
<string name="screen_create_room_add_people_title">"Запросити людей"</string>
<string name="screen_create_room_error_creating_room">"Під час створення кімнати сталася помилка"</string>
<string name="screen_create_room_error_creating_space">"Простір не вдалося створити через невідому помилку. Спробуйте ще раз пізніше."</string>
<string name="screen_create_room_name_placeholder">"Додати назву…"</string>
<string name="screen_create_room_new_room_title">"Нова кімната"</string>
<string name="screen_create_room_new_space_title">"Новий простір"</string>
<string name="screen_create_room_private_option_description">"Можуть приєднатися лише запрошені люди."</string>
<string name="screen_create_room_private_option_title">"Приватний"</string>
<string name="screen_create_room_public_option_description">"Будь-хто може знайти цю кімнату.
Ви можете змінити це в будь-який час у налаштуваннях кімнати."</string>
<string name="screen_create_room_public_option_short_description">"Приєднатися може будь-хто."</string>
<string name="screen_create_room_public_option_title">"Публічний"</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Будь-хто може подати запит на приєднання, але адміністратор або модератор повинен схвалити запит."</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Дозволити запит на приєднання"</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_description">"Будь-хто з %1$s може приєднатися, але всі інші повинні подати запит на доступ."</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_title">"Запит на приєднання"</string>
<string name="screen_create_room_room_access_section_private_option_description">"Приєднатися можуть лише запрошені особи."</string>
<string name="screen_create_room_room_access_section_private_option_title">"Приватний"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Приєднатися може будь-хто."</string>
<string name="screen_create_room_room_access_section_public_option_title">"Публічний"</string>
<string name="screen_create_room_room_access_section_restricted_option_description">"Приєднатися може будь-хто з %1$s."</string>
<string name="screen_create_room_room_access_section_restricted_option_title">"Стандартний"</string>
<string name="screen_create_room_room_access_section_title">"Хто має доступ"</string>
<string name="screen_create_room_room_address_section_footer">"Вам знадобиться адреса, щоб зробити її видимою в загальнодоступному каталозі."</string>
<string name="screen_create_room_room_address_section_title">"Адреса"</string>
<string name="screen_create_room_room_visibility_section_title">"Видимість кімнати"</string>
<string name="screen_create_room_space_selection_no_space_description">"(без пробілу)"</string>
<string name="screen_create_room_space_selection_no_space_option">"Не додавати до простору"</string>
<string name="screen_create_room_space_selection_no_space_title">"Головна"</string>
<string name="screen_create_room_space_selection_sheet_title">"Додати до простору"</string>
<string name="screen_create_room_topic_label">"Тема (необов\'язково)"</string>

View file

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_create_room_action_create_room">"新房间"</string>
<string name="screen_create_room_add_people_title">"邀请朋友"</string>
<string name="screen_create_room_add_people_title">"邀请人员"</string>
<string name="screen_create_room_error_creating_room">"创建房间时出错"</string>
<string name="screen_create_room_error_creating_space">"由于未知错误,空间创建失败。请稍后再试。"</string>
<string name="screen_create_room_name_placeholder">"添加名称…"</string>
<string name="screen_create_room_new_room_title">"新房间"</string>
<string name="screen_create_room_new_space_title">"新空间"</string>
<string name="screen_create_room_private_option_description">"仅限受邀加入。"</string>
<string name="screen_create_room_private_option_description">"仅限受邀人员加入。"</string>
<string name="screen_create_room_private_option_title">"私密"</string>
<string name="screen_create_room_public_option_description">"任何人都能找到此房间。
你可以随时在房间设置中更改。"</string>
@ -17,11 +17,11 @@
<string name="screen_create_room_room_access_section_knocking_option_title">"申请加入"</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_description">"%1$s 中的任何人都可以加入,但其他人必须申请访问。"</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_title">"申请加入"</string>
<string name="screen_create_room_room_access_section_private_option_description">"仅限受邀加入。"</string>
<string name="screen_create_room_room_access_section_private_option_description">"仅限受邀人员加入。"</string>
<string name="screen_create_room_room_access_section_private_option_title">"私密"</string>
<string name="screen_create_room_room_access_section_public_option_description">"任何人都可以加入。"</string>
<string name="screen_create_room_room_access_section_public_option_title">"公共"</string>
<string name="screen_create_room_room_access_section_restricted_option_description">"%1$s 中的任何人加入。"</string>
<string name="screen_create_room_room_access_section_restricted_option_description">"%1$s 中的任何人都可以加入。"</string>
<string name="screen_create_room_room_access_section_restricted_option_title">"标准"</string>
<string name="screen_create_room_room_access_section_title">"谁有权访问此房间"</string>
<string name="screen_create_room_room_address_section_footer">"要使该房间在公共目录中可见,你需要一个地址。"</string>

View file

@ -301,7 +301,9 @@ class ConfigureRoomPresenterTest {
roomName = 0,
roomAvatar = 0,
roomTopic = 0,
spaceChild = 0
spaceChild = 0,
beacon = 0,
beaconInfo = 0,
),
users = persistentMapOf(),
)

View file

@ -1,13 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_deactivate_account_confirmation_dialog_content">"Bekræft venligst, at du vil deaktivere din konto. Denne handling kan ikke fortrydes."</string>
<string name="screen_deactivate_account_confirmation_dialog_content">"Bekræft venligst, at du ønsker at slette din konto. Denne handling kan ikke fortrydes."</string>
<string name="screen_deactivate_account_delete_all_messages">"Slet alle mine beskeder"</string>
<string name="screen_deactivate_account_delete_all_messages_notice">"Advarsel: Fremtidige brugere kan muligvis se ufuldstændige samtaler."</string>
<string name="screen_deactivate_account_description">"Deaktivering af din konto er %1$s, det vil:"</string>
<string name="screen_deactivate_account_description">"Sletning af din konto er %1$s, det vil:"</string>
<string name="screen_deactivate_account_description_bold_part">"irreversibel"</string>
<string name="screen_deactivate_account_list_item_1">"%1$s din konto (du kan ikke logge ind igen, og dit ID kan ikke genbruges)."</string>
<string name="screen_deactivate_account_list_item_1_bold_part">"Permanent deaktivere"</string>
<string name="screen_deactivate_account_list_item_2">"Fjerne dig fra alle samtaler"</string>
<string name="screen_deactivate_account_list_item_3">"Slette dine kontooplysninger fra vores identitetsserver."</string>
<string name="screen_deactivate_account_list_item_4">"Dine beskeder vil stadig være synlige for registrerede brugere, men vil ikke være tilgængelige for nye eller uregistrerede brugere, hvis du vælger at slette dem."</string>
<string name="screen_deactivate_account_title">"Slet konto"</string>
</resources>

View file

@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_deactivate_account_confirmation_dialog_content">"Bitte bestätige, dass du dein Konto deaktivieren möchtest. Dies kann nicht rückgängig gemacht werden."</string>
<string name="screen_deactivate_account_confirmation_dialog_content">"Bitte bestätige, dass du dein Konto löschen möchtest. Diese Aktion kann nicht rückgängig gemacht werden."</string>
<string name="screen_deactivate_account_delete_all_messages">"Lösche alle meine Nachrichten"</string>
<string name="screen_deactivate_account_delete_all_messages_notice">"Warnung: Künftigen Nutzern werden möglicherweise unvollständige Konversationen angezeigt."</string>
<string name="screen_deactivate_account_description">"Dein Konto zu deaktivieren ist %1$s. Folgendes wird passieren:"</string>
<string name="screen_deactivate_account_description">"Das Löschen deines Kontos ist %1$s. Es wird:"</string>
<string name="screen_deactivate_account_description_bold_part">"irreversibel"</string>
<string name="screen_deactivate_account_list_item_1">"%1$s dein Konto (du kannst dich nicht erneut anmelden und deine ID kann nicht wiederverwendet werden)."</string>
<string name="screen_deactivate_account_list_item_1_bold_part">"Dauerhaft deaktivieren"</string>
<string name="screen_deactivate_account_list_item_2">"Du wirst aus allen Chats entfernt."</string>
<string name="screen_deactivate_account_list_item_3">"Lösche deine Kontoinformationen von unserem Identitätsserver."</string>
<string name="screen_deactivate_account_list_item_4">"Deine Nachrichten werden für bereits registrierte Nutzer weiterhin sichtbar sein. Für neue oder unregistrierte Nutzer sind sie nicht verfügbar, wenn du sie löschen solltest."</string>
<string name="screen_deactivate_account_title">"Benutzerkonto deaktivieren"</string>
<string name="screen_deactivate_account_title">"Konto löschen"</string>
</resources>

View file

@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_deactivate_account_confirmation_dialog_content">"Παρακαλώ επιβεβαίωσε ότι θες να απενεργοποιήσεις τον λογαριασμό σου. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί."</string>
<string name="screen_deactivate_account_confirmation_dialog_content">"Επιβεβαιώστε ότι θέλετε να διαγράψετε τον λογαριασμό σας. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί."</string>
<string name="screen_deactivate_account_delete_all_messages">"Διαγραφή όλων των μηνυμάτων μου"</string>
<string name="screen_deactivate_account_delete_all_messages_notice">"Προειδοποίηση: Οι μελλοντικοί χρήστες ενδέχεται να βλέπουν ελλιπείς συνομιλίες."</string>
<string name="screen_deactivate_account_description">"Η απενεργοποίηση του λογαριασμού σας είναι %1$s, θα:"</string>
<string name="screen_deactivate_account_description">"Η διαγραφή του λογαριασμού σας είναι %1$s, και θα:"</string>
<string name="screen_deactivate_account_description_bold_part">"μη αναστρέψιμο"</string>
<string name="screen_deactivate_account_list_item_1">"%1$s τον λογαριασμό σου (δεν μπορείς να συνδεθείς ξανά και το αναγνωριστικό σου δεν μπορεί να επαναχρησιμοποιηθεί)."</string>
<string name="screen_deactivate_account_list_item_1_bold_part">"Μόνιμη απενεργοποίηση"</string>
<string name="screen_deactivate_account_list_item_2">"Αποχώρησή σας από όλες τις αίθουσες συνομιλίας."</string>
<string name="screen_deactivate_account_list_item_3">"Διαγράψει τα στοιχεία του λογαριασμού σου από τον διακομιστή ταυτότητάς μας."</string>
<string name="screen_deactivate_account_list_item_4">"Τα μηνύματά σου θα εξακολουθούν να είναι ορατά στους εγγεγραμμένους χρήστες, αλλά δεν θα είναι διαθέσιμα σε νέους ή μη εγγεγραμμένους χρήστες εάν επιλέξεις να τα διαγράψεις."</string>
<string name="screen_deactivate_account_title">"Απενεργοποίηση λογαριασμού"</string>
<string name="screen_deactivate_account_title">"Διαγραφή λογαριασμού"</string>
</resources>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_deactivate_account_confirmation_dialog_content">"Palun kinnita uuesti, et soovid eemaldada oma konto kasutusest"</string>
<string name="screen_deactivate_account_confirmation_dialog_content">"Palun kinnita uuesti, et soovid kustutada oma kasutajakonto. Seda tegevust ei saa tagasi pöörata."</string>
<string name="screen_deactivate_account_delete_all_messages">"Kustuta kõik minu sõnumid"</string>
<string name="screen_deactivate_account_delete_all_messages_notice">"Hoiatus: tulevased kasutajad võivad näha poolikuid vestlusi."</string>
<string name="screen_deactivate_account_description">"Sinu konto kasutusest eemaldamine on %1$s ja sellega:"</string>
@ -10,5 +10,5 @@
<string name="screen_deactivate_account_list_item_2">"Sind logitakse välja kõikidest jututubadest."</string>
<string name="screen_deactivate_account_list_item_3">"Kustutatakse sinu andmed meie isikutuvastusserverist."</string>
<string name="screen_deactivate_account_list_item_4">"Sinu sõnumid on jätkuvalt nähtavad registreeritud kasutajatele, kuid kui otsustad sõnumid kustutada, siis nad nad pole nähtavad uutele ja registreerimata kasutajatele."</string>
<string name="screen_deactivate_account_title">"Eemalda konto kasutusest"</string>
<string name="screen_deactivate_account_title">"Kustuta kasutajakonto"</string>
</resources>

View file

@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_deactivate_account_confirmation_dialog_content">"Veuillez confirmer que vous souhaitez désactiver votre compte. Cette action ne peut pas être annulée."</string>
<string name="screen_deactivate_account_confirmation_dialog_content">"Veuillez confirmer que vous souhaitez supprimer votre compte. Cette action ne peut pas être annulée."</string>
<string name="screen_deactivate_account_delete_all_messages">"Supprimer tous mes messages"</string>
<string name="screen_deactivate_account_delete_all_messages_notice">"Attention : les futurs utilisateurs pourraient voir des conversations incomplètes."</string>
<string name="screen_deactivate_account_description">"La désactivation de votre compte est %1$s, cela va :"</string>
<string name="screen_deactivate_account_description">"La suppression de votre compte est %1$s, cela va :"</string>
<string name="screen_deactivate_account_description_bold_part">"irréversible"</string>
<string name="screen_deactivate_account_list_item_1">"%1$s votre compte (vous ne pourrez plus vous reconnecter et votre identifiant ne pourra pas être réutilisé)."</string>
<string name="screen_deactivate_account_list_item_1_bold_part">"Désactiver définitivement"</string>
<string name="screen_deactivate_account_list_item_2">"Vous retirer de tous les salons et toutes les discussions."</string>
<string name="screen_deactivate_account_list_item_3">"Supprimer les informations de votre compte du serveur didentité."</string>
<string name="screen_deactivate_account_list_item_4">"Rendre vos messages invisibles aux futurs membres des salons si vous choisissez de les supprimer. Vos messages seront toujours visibles pour les utilisateurs qui les ont déjà récupérés."</string>
<string name="screen_deactivate_account_title">"Désactiver votre compte"</string>
<string name="screen_deactivate_account_title">"Supprimer le compte"</string>
</resources>

View file

@ -10,4 +10,5 @@
<string name="screen_deactivate_account_list_item_2">"Ukloniti vas iz svih soba za razgovore."</string>
<string name="screen_deactivate_account_list_item_3">"Izbrisati podatke o vašem računu s našeg poslužitelja identiteta."</string>
<string name="screen_deactivate_account_list_item_4">"Vaše će poruke i dalje biti vidljive registriranim korisnicima, ali neće biti dostupne novim ili neregistriranim korisnicima ako ih odlučite izbrisati."</string>
<string name="screen_deactivate_account_title">"Izbriši račun"</string>
</resources>

View file

@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_deactivate_account_confirmation_dialog_content">"Erősítse meg, hogy deaktiválja a fiókját. Ez a művelet nem vonható vissza."</string>
<string name="screen_deactivate_account_confirmation_dialog_content">"Erősítse meg a fiókja törlését. Ez a művelet nem vonható vissza."</string>
<string name="screen_deactivate_account_delete_all_messages">"Összes saját üzenet törlése"</string>
<string name="screen_deactivate_account_delete_all_messages_notice">"Figyelmeztetés: A jövőbeli felhasználók hiányos beszélgetéseket láthatnak."</string>
<string name="screen_deactivate_account_description">"A fiók deaktiválása %1$s, a következőket okozza:"</string>
<string name="screen_deactivate_account_description">"Fiókjának törlése: %1$s, ez a következőket eredményezi:"</string>
<string name="screen_deactivate_account_description_bold_part">"visszafordíthatatlan"</string>
<string name="screen_deactivate_account_list_item_1">"%1$s a fiókját (nem fog tudni újra bejelentkezni, és az azonosítója nem használható újra)."</string>
<string name="screen_deactivate_account_list_item_1_bold_part">"Véglegesen letiltja"</string>
<string name="screen_deactivate_account_list_item_2">"Eltávolításra kerül az összes csevegőszobából."</string>
<string name="screen_deactivate_account_list_item_3">"Törlésre kerülnek a fiókadatai az azonosítási kiszolgálónkról."</string>
<string name="screen_deactivate_account_list_item_4">"Üzenetei továbbra is láthatóak maradnak a regisztrált felhasználók számára, de nem lesznek elérhetőek az új vagy nem regisztrált felhasználók számára, ha úgy dönt, hogy törli őket."</string>
<string name="screen_deactivate_account_title">"Fiók deaktiválása"</string>
<string name="screen_deactivate_account_title">"Fiók törlése"</string>
</resources>

View file

@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_deactivate_account_confirmation_dialog_content">"Conferma di voler disattivare il tuo account. Questa azione è irreversibile."</string>
<string name="screen_deactivate_account_confirmation_dialog_content">"Conferma di voler eliminare il tuo account. Questa azione è irreversibile."</string>
<string name="screen_deactivate_account_delete_all_messages">"Elimina tutti i miei messaggi"</string>
<string name="screen_deactivate_account_delete_all_messages_notice">"Attenzione: gli utenti futuri potrebbero vedere conversazioni incomplete."</string>
<string name="screen_deactivate_account_description">"La disattivazione del tuo account è %1$s , quindi:"</string>
<string name="screen_deactivate_account_description">"L\'eliminazione del tuo account è %1$s, e comporterà:"</string>
<string name="screen_deactivate_account_description_bold_part">"irreversibile"</string>
<string name="screen_deactivate_account_list_item_1">"%1$s il tuo account (non puoi riaccedere e il tuo ID non può essere riutilizzato)."</string>
<string name="screen_deactivate_account_list_item_1_bold_part">"Disattiva permanentemente"</string>
<string name="screen_deactivate_account_list_item_2">"Ti rimuove da tutte le stanze di chat."</string>
<string name="screen_deactivate_account_list_item_3">"Elimina le informazioni del tuo account dal nostro server di identità."</string>
<string name="screen_deactivate_account_list_item_4">"I tuoi messaggi saranno ancora visibili agli utenti registrati, ma non saranno disponibili per gli utenti nuovi o non registrati se decidi di eliminarli."</string>
<string name="screen_deactivate_account_title">"Disattivazione dell\'account"</string>
<string name="screen_deactivate_account_title">"Elimina account"</string>
</resources>

View file

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_deactivate_account_confirmation_dialog_content">"アカウントを無効化することを再度確認します。この操作は元に戻せません。"</string>
<string name="screen_deactivate_account_confirmation_dialog_content">"アカウントを削除しようとしていることを確認しています。この操作は元に戻せません。"</string>
<string name="screen_deactivate_account_delete_all_messages">"メッセージをすべて削除"</string>
<string name="screen_deactivate_account_delete_all_messages_notice">"注意: 新しいユーザーには断片的な会話が表示されます"</string>
<string name="screen_deactivate_account_description">"アカウントを無効化することは %1$s であり、次の変化が生じます:"</string>
<string name="screen_deactivate_account_description">"アカウントを削除することは %1$s であり、次の変化が生じます:"</string>
<string name="screen_deactivate_account_description_bold_part">"不可逆"</string>
<string name="screen_deactivate_account_list_item_1">"アカウントを %1$s (再度ログイン不可, 同一のIDを再利用不可)"</string>
<string name="screen_deactivate_account_list_item_1_bold_part">"恒久的に無効化する"</string>

View file

@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_deactivate_account_confirmation_dialog_content">"Potwierdź dezaktywacje konta. Tej akcji nie można cofnąć."</string>
<string name="screen_deactivate_account_confirmation_dialog_content">"Potwierdź usunięcie konta. Tej akcji nie można cofnąć."</string>
<string name="screen_deactivate_account_delete_all_messages">"Usuń wszystkie moje wiadomości"</string>
<string name="screen_deactivate_account_delete_all_messages_notice">"Ostrzeżenie: Przyszli użytkownicy mogą zobaczyć niekompletne rozmowy."</string>
<string name="screen_deactivate_account_description">"Dezaktywacja konta jest %1$s, zostanie:"</string>
<string name="screen_deactivate_account_description">"Usunięcie konta jest %1$s, co spowoduje:"</string>
<string name="screen_deactivate_account_description_bold_part">"nieodwracalna"</string>
<string name="screen_deactivate_account_list_item_1">"%1$s twoje konto (nie będziesz mógł się zalogować, a twoje ID przepadnie)."</string>
<string name="screen_deactivate_account_list_item_1_bold_part">"Permanentnie wyłączy"</string>
<string name="screen_deactivate_account_list_item_2">"Usunie Ciebie ze wszystkich pokoi rozmów."</string>
<string name="screen_deactivate_account_list_item_3">"Usunięte wszystkie dane konta z naszego serwera tożsamości."</string>
<string name="screen_deactivate_account_list_item_4">"Twoje wiadomości wciąż będą widoczne dla zarejestrowanych użytkowników, ale nie będą dostępne dla nowych lub niezarejestrowanych użytkowników, jeśli je usuniesz."</string>
<string name="screen_deactivate_account_title">"Dezaktywuj konto"</string>
<string name="screen_deactivate_account_title">"Usuń konto"</string>
</resources>

View file

@ -10,4 +10,5 @@
<string name="screen_deactivate_account_list_item_2">"Sizni barcha chat xonalaridan olib tashlash."</string>
<string name="screen_deactivate_account_list_item_3">"Hisobingiz haqidagi axborotni identifikatsiya serverimizdan ochirib tashlang."</string>
<string name="screen_deactivate_account_list_item_4">"Xabarlaringiz royxatdan otgan foydalanuvchilarga korinadi, lekin ularni ochirishni tanlasangiz, yangi yoki royxatdan otmagan foydalanuvchilarga korinmaydi."</string>
<string name="screen_deactivate_account_title">"Akkauntni ochirish"</string>
</resources>

View file

@ -16,6 +16,7 @@ import kotlinx.coroutines.flow.Flow
interface EnterpriseService {
val isEnterpriseBuild: Boolean
suspend fun isEnterpriseUser(sessionId: SessionId): Boolean
suspend fun tweakMasUrl(url: String, homeserver: String): String
fun defaultHomeserverList(): List<String>
suspend fun isAllowedToConnectToHomeserver(homeserverUrl: String): Boolean

View file

@ -10,6 +10,7 @@ package io.element.android.features.enterprise.api
interface SessionEnterpriseService {
suspend fun isElementCallAvailable(): Boolean
suspend fun tweakMasUrl(url: String): String
suspend fun init()
}

View file

@ -23,7 +23,7 @@ class DefaultEnterpriseService : EnterpriseService {
override val isEnterpriseBuild = false
override suspend fun isEnterpriseUser(sessionId: SessionId) = false
override suspend fun tweakMasUrl(url: String, homeserver: String) = url
override fun defaultHomeserverList(): List<String> = emptyList()
override suspend fun isAllowedToConnectToHomeserver(homeserverUrl: String) = true

View file

@ -15,5 +15,6 @@ import io.element.android.libraries.di.SessionScope
@ContributesBinding(SessionScope::class)
class DefaultSessionEnterpriseService : SessionEnterpriseService {
override suspend fun init() = Unit
override suspend fun tweakMasUrl(url: String): String = url
override suspend fun isElementCallAvailable(): Boolean = true
}

View file

@ -30,6 +30,7 @@ class FakeEnterpriseService(
private val firebasePushGatewayResult: () -> String? = { lambdaError() },
private val unifiedPushDefaultPushGatewayResult: () -> String? = { lambdaError() },
private val getNoisyNotificationChannelIdResult: (SessionId?) -> String? = { lambdaError() },
private val tweakMasUrlResult: (String, String) -> String = { _, _ -> lambdaError() },
) : EnterpriseService {
private val brandColorState = MutableStateFlow(initialBrandColor)
private val semanticColorsState = MutableStateFlow(initialSemanticColors)
@ -38,6 +39,10 @@ class FakeEnterpriseService(
isEnterpriseUserResult(sessionId)
}
override suspend fun tweakMasUrl(url: String, homeserver: String): String = simulateLongTask {
tweakMasUrlResult(url, homeserver)
}
override fun defaultHomeserverList(): List<String> {
return defaultHomeserverListResult()
}

View file

@ -14,10 +14,15 @@ import io.element.android.tests.testutils.simulateLongTask
class FakeSessionEnterpriseService(
private val isElementCallAvailableResult: () -> Boolean = { lambdaError() },
private val tweakMasUrlResult: (String) -> String = { lambdaError() },
) : SessionEnterpriseService {
override suspend fun init() {
}
override suspend fun tweakMasUrl(url: String): String = simulateLongTask {
tweakMasUrlResult(url)
}
override suspend fun isElementCallAvailable(): Boolean = simulateLongTask {
isElementCallAvailableResult()
}

View file

@ -19,6 +19,9 @@ import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.semantics.role
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
@ -90,7 +93,11 @@ fun ChooseSelfVerificationModeView(
Text(
modifier = Modifier
.clickable(onClick = onLearnMore)
.padding(vertical = 4.dp, horizontal = 16.dp),
.padding(vertical = 4.dp, horizontal = 16.dp)
.semantics {
// Note: there is no Role.Link, so we use Role.Button for better accessibility support
role = Role.Button
},
text = stringResource(CommonStrings.action_learn_more),
style = ElementTheme.typography.fontBodyLgMedium
)

View file

@ -3,7 +3,7 @@
<string name="screen_identity_confirmation_cannot_confirm">"Bestätigung unmöglich?"</string>
<string name="screen_identity_confirmation_create_new_recovery_key">"Erstelle einen neuen Wiederherstellungsschlüssel"</string>
<string name="screen_identity_confirmation_subtitle">"Wähle eine Verifizierungsmethode, um den sicheren Nachrichtenversand einzurichten."</string>
<string name="screen_identity_confirmation_title">"Bestätige deine Identität"</string>
<string name="screen_identity_confirmation_title">"Bestätige deine digitale Identität"</string>
<string name="screen_identity_confirmation_use_another_device">"Ein anderes Gerät verwenden"</string>
<string name="screen_identity_confirmation_use_recovery_key">"Wiederherstellungsschlüssel verwenden"</string>
<string name="screen_identity_confirmed_subtitle">"Du kannst jetzt verschlüsselte Nachrichten lesen und versenden. Dein Chatpartner vertraut nun diesem Gerät."</string>

View file

@ -11,5 +11,5 @@
<string name="screen_identity_use_another_device">"他の端末を使用"</string>
<string name="screen_identity_waiting_on_other_device">"一方の端末を待機中…"</string>
<string name="screen_notification_optin_subtitle">"設定は後で変更することができます。"</string>
<string name="screen_notification_optin_title">"メッセージを見逃さないため通知を許可"</string>
<string name="screen_notification_optin_title">"メッセージを見逃さないため通知を許可しましょう"</string>
</resources>

View file

@ -2,8 +2,8 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_identity_confirmation_cannot_confirm">"Nie możesz potwierdzić?"</string>
<string name="screen_identity_confirmation_create_new_recovery_key">"Utwórz nowy klucz przywracania"</string>
<string name="screen_identity_confirmation_subtitle">"Zweryfikuj to urządzenie, aby skonfigurować bezpieczne przesyłanie wiadomości."</string>
<string name="screen_identity_confirmation_title">"Potwierdź, że to Ty"</string>
<string name="screen_identity_confirmation_subtitle">"Wybierz sposób weryfikacji, aby skonfigurować bezpieczne wiadomości."</string>
<string name="screen_identity_confirmation_title">"Potwierdź swoją tożsamość cyfrową"</string>
<string name="screen_identity_confirmation_use_another_device">"Użyj innego urządzenia"</string>
<string name="screen_identity_confirmation_use_recovery_key">"Użyj klucza przywracania"</string>
<string name="screen_identity_confirmed_subtitle">"Teraz możesz bezpiecznie czytać i wysyłać wiadomości, każdy z kim czatujesz również może ufać temu urządzeniu."</string>

View file

@ -3,7 +3,7 @@
<string name="screen_identity_confirmation_cannot_confirm">"Não é possível confirmar?"</string>
<string name="screen_identity_confirmation_create_new_recovery_key">"Criar uma nova chave de recuperação"</string>
<string name="screen_identity_confirmation_subtitle">"Verifica este dispositivo para configurar o envio seguro de mensagens."</string>
<string name="screen_identity_confirmation_title">"Confirma que és tu"</string>
<string name="screen_identity_confirmation_title">"Confirma a tua identidade digital"</string>
<string name="screen_identity_confirmation_use_another_device">"Utilizar outro dispositivo"</string>
<string name="screen_identity_confirmation_use_recovery_key">"Utilizar chave de recuperação"</string>
<string name="screen_identity_confirmed_subtitle">"Agora podes ler ou enviar mensagens de forma segura, e qualquer pessoa com quem converses também pode confiar neste dispositivo."</string>

View file

@ -9,7 +9,7 @@
<string name="screen_identity_confirmed_subtitle">"现在你可以安全地读取或发送消息,并且与你聊天的任何人也可以信任此设备。"</string>
<string name="screen_identity_confirmed_title">"设备已验证"</string>
<string name="screen_identity_use_another_device">"使用其它设备"</string>
<string name="screen_identity_waiting_on_other_device">"正在等待其它设备…"</string>
<string name="screen_identity_waiting_on_other_device">"正在等待其它设备…"</string>
<string name="screen_notification_optin_subtitle">"你可以稍后更改设置。"</string>
<string name="screen_notification_optin_title">"允许通知,绝不错过任何消息"</string>
</resources>

View file

@ -17,6 +17,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.window.DialogProperties
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.coroutineScope
import com.bumble.appyx.core.lifecycle.subscribe
@ -171,6 +172,7 @@ class HomeFlowNode(
if (loadingJoinedRoomJob.value.isLoading()) {
DelayedVisibility(duration = 400.milliseconds) {
ProgressDialog(
properties = DialogProperties(dismissOnBackPress = true, dismissOnClickOutside = true),
onDismissRequest = {
loadingJoinedRoomJob.value.dataOrNull()?.cancel()
loadingJoinedRoomJob.value = AsyncData.Uninitialized

View file

@ -57,6 +57,7 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.modifiers.backgroundVerticalGradient
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.preview.USER_NAME_ALICE
import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.DropdownMenu
import io.element.android.libraries.designsystem.theme.components.DropdownMenuItem
@ -65,8 +66,8 @@ import io.element.android.libraries.designsystem.theme.components.IconButton
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.components.TopAppBar
import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.ui.components.aMatrixUser
import io.element.android.libraries.matrix.ui.components.aMatrixUserList
import io.element.android.libraries.matrix.ui.model.getAvatarData
import io.element.android.libraries.testtags.TestTags
@ -237,6 +238,7 @@ private fun SpaceFilterButton(
else -> Unit
}
}
val isSelected = spaceFiltersState is SpaceFiltersState.Selected
IconButton(
onClick = ::onClick,
@ -320,7 +322,15 @@ private fun AccountIcon(
Avatar(
avatarData = avatarData,
avatarType = AvatarType.User,
contentDescription = if (isCurrentAccount) stringResource(CommonStrings.common_settings) else null,
contentDescription = if (isCurrentAccount) {
if (showAvatarIndicator) {
stringResource(CommonStrings.a11y_settings_with_required_action)
} else {
stringResource(CommonStrings.common_settings)
}
} else {
null
},
)
if (showAvatarIndicator) {
RedIndicatorAtom(
@ -337,7 +347,7 @@ private fun AccountIcon(
internal fun HomeTopBarPreview() = ElementPreview {
HomeTopBar(
selectedNavigationItem = HomeNavigationBarItem.Chats,
currentUserAndNeighbors = persistentListOf(MatrixUser(UserId("@id:domain"), "Alice")),
currentUserAndNeighbors = persistentListOf(aMatrixUser(id = "@id:domain", displayName = USER_NAME_ALICE)),
showAvatarIndicator = false,
areSearchResultsDisplayed = false,
scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()),
@ -358,7 +368,7 @@ internal fun HomeTopBarPreview() = ElementPreview {
internal fun HomeTopBarSpaceFiltersSelectedPreview() = ElementPreview {
HomeTopBar(
selectedNavigationItem = HomeNavigationBarItem.Chats,
currentUserAndNeighbors = persistentListOf(MatrixUser(UserId("@id:domain"), "Alice")),
currentUserAndNeighbors = persistentListOf(aMatrixUser(id = "@id:domain", displayName = USER_NAME_ALICE)),
showAvatarIndicator = false,
areSearchResultsDisplayed = false,
scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()),
@ -379,7 +389,7 @@ internal fun HomeTopBarSpaceFiltersSelectedPreview() = ElementPreview {
internal fun HomeTopBarSpacesPreview() = ElementPreview {
HomeTopBar(
selectedNavigationItem = HomeNavigationBarItem.Spaces,
currentUserAndNeighbors = persistentListOf(MatrixUser(UserId("@id:domain"), "Alice")),
currentUserAndNeighbors = persistentListOf(aMatrixUser(id = "@id:domain", displayName = USER_NAME_ALICE)),
showAvatarIndicator = false,
areSearchResultsDisplayed = false,
scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()),
@ -400,7 +410,7 @@ internal fun HomeTopBarSpacesPreview() = ElementPreview {
internal fun HomeTopBarWithIndicatorPreview() = ElementPreview {
HomeTopBar(
selectedNavigationItem = HomeNavigationBarItem.Chats,
currentUserAndNeighbors = persistentListOf(MatrixUser(UserId("@id:domain"), "Alice")),
currentUserAndNeighbors = persistentListOf(aMatrixUser(id = "@id:domain", displayName = USER_NAME_ALICE)),
showAvatarIndicator = true,
areSearchResultsDisplayed = false,
scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()),

View file

@ -29,6 +29,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clipToBounds
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
@ -222,20 +223,17 @@ private fun NameAndTimestampRow(
modifier = modifier.fillMaxWidth(),
horizontalArrangement = spacedBy(16.dp)
) {
Row(
modifier = Modifier.weight(1f),
verticalAlignment = Alignment.CenterVertically,
) {
// Name
Text(
style = ElementTheme.typography.fontBodyLgMedium,
text = name?.toSafeLength(ellipsize = true) ?: stringResource(id = CommonStrings.common_no_room_name),
fontStyle = FontStyle.Italic.takeIf { name == null },
color = ElementTheme.colors.roomListRoomName,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
}
Text(
modifier = Modifier
.weight(1f)
.clipToBounds(),
style = ElementTheme.typography.fontBodyLgMedium,
text = name?.toSafeLength(ellipsize = true) ?: stringResource(id = CommonStrings.common_no_room_name),
fontStyle = FontStyle.Italic.takeIf { name == null },
color = ElementTheme.colors.roomListRoomName,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
// Timestamp
Text(
text = timestamp ?: "",
@ -262,12 +260,12 @@ private fun InviteSubtitle(
}
if (subtitle != null) {
Text(
modifier = modifier.clipToBounds(),
text = subtitle,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
style = ElementTheme.typography.fontBodyMdRegular,
color = ElementTheme.colors.roomListRoomMessage,
modifier = modifier,
)
}
}
@ -326,7 +324,9 @@ private fun MessagePreviewAndIndicatorRow(
val messagePreview = room.latestEvent.content()
val annotatedMessagePreview = messagePreview as? AnnotatedString ?: AnnotatedString(text = messagePreview.orEmpty().toString())
Text(
modifier = Modifier.weight(1f),
modifier = Modifier
.weight(1f)
.clipToBounds(),
text = annotatedMessagePreview,
color = ElementTheme.colors.roomListRoomMessage,
style = ElementTheme.typography.fontBodyMdRegular,
@ -381,7 +381,9 @@ private fun InviteNameAndIndicatorRow(
verticalAlignment = Alignment.CenterVertically,
) {
Text(
modifier = Modifier.weight(1f),
modifier = Modifier
.weight(1f)
.clipToBounds(),
style = ElementTheme.typography.fontBodyLgMedium,
text = name?.toSafeLength(ellipsize = true) ?: stringResource(id = CommonStrings.common_no_room_name),
fontStyle = FontStyle.Italic.takeIf { name == null },

View file

@ -11,6 +11,10 @@ package io.element.android.features.home.impl.model
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.designsystem.preview.LAST_MESSAGE
import io.element.android.libraries.designsystem.preview.ROOM_NAME
import io.element.android.libraries.designsystem.preview.USER_NAME_ALICE
import io.element.android.libraries.designsystem.preview.USER_NAME_BOB
import io.element.android.libraries.matrix.api.core.RoomAlias
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.UserId
@ -85,16 +89,16 @@ open class RoomListRoomSummaryProvider : PreviewParameterProvider<RoomListRoomSu
displayType = RoomSummaryDisplayType.INVITE,
inviteSender = anInviteSender(
userId = UserId("@alice:matrix.org"),
displayName = "Alice",
displayName = USER_NAME_ALICE,
),
canonicalAlias = RoomAlias("#alias:matrix.org"),
),
aRoomListRoomSummary(
name = "Bob",
name = USER_NAME_BOB,
displayType = RoomSummaryDisplayType.INVITE,
inviteSender = anInviteSender(
userId = UserId("@bob:matrix.org"),
displayName = "Bob",
displayName = USER_NAME_BOB,
),
isDm = true,
),
@ -103,7 +107,7 @@ open class RoomListRoomSummaryProvider : PreviewParameterProvider<RoomListRoomSu
displayType = RoomSummaryDisplayType.INVITE,
inviteSender = anInviteSender(
userId = UserId("@bob:matrix.org"),
displayName = "Bob",
displayName = USER_NAME_BOB,
),
),
aRoomListRoomSummary(
@ -111,7 +115,7 @@ open class RoomListRoomSummaryProvider : PreviewParameterProvider<RoomListRoomSu
displayType = RoomSummaryDisplayType.INVITE,
inviteSender = anInviteSender(
userId = UserId("@bob:matrix.org"),
displayName = "Bob",
displayName = USER_NAME_BOB,
),
isSpace = true
),
@ -147,7 +151,7 @@ open class RoomListRoomSummaryProvider : PreviewParameterProvider<RoomListRoomSu
internal fun anInviteSender(
userId: UserId = UserId("@bob:domain"),
displayName: String = "Bob",
displayName: String = USER_NAME_BOB,
avatarData: AvatarData = AvatarData(userId.value, displayName, size = AvatarSize.InviteSender),
) = InviteSender(
userId = userId,
@ -158,12 +162,12 @@ internal fun anInviteSender(
internal fun aRoomListRoomSummary(
id: String = "!roomId:domain",
name: String? = "Room name",
name: String? = ROOM_NAME,
numberOfUnreadMessages: Long = 0,
numberOfUnreadMentions: Long = 0,
numberOfUnreadNotifications: Long = 0,
isMarkedUnread: Boolean = false,
latestEvent: LatestEvent = LatestEvent.Synced("Last message"),
latestEvent: LatestEvent = LatestEvent.Synced(LAST_MESSAGE),
timestamp: String? = latestEvent.takeIf { it !is LatestEvent.None }?.let { "88:88" },
notificationMode: RoomNotificationMode? = null,
hasRoomCall: Boolean = false,

View file

@ -7,7 +7,7 @@
<string name="banner_new_sound_title">"Oleme sinu helisid värskendanud"</string>
<string name="banner_set_up_recovery_content">"Loo uus taastevõti, mida saad kasutada oma krüptitud sõnumite ajaloo taastamisel olukorras, kus kaotad ligipääsu oma seadmetele."</string>
<string name="banner_set_up_recovery_submit">"Seadista andmete taastamine"</string>
<string name="banner_set_up_recovery_title">"Seadista taastamine"</string>
<string name="banner_set_up_recovery_title">"Varunda oma vestlused"</string>
<string name="confirm_recovery_key_banner_message">"Säilitamaks ligipääsu vestluste ja krüptovõtmete varukoopiale, palun sisesta kinnituseks oma taastevõti."</string>
<string name="confirm_recovery_key_banner_primary_button_title">"Sisesta oma taastevõti"</string>
<string name="confirm_recovery_key_banner_secondary_button_title">"Kas unustasid oma taastevõtme?"</string>

View file

@ -4,7 +4,7 @@
<string name="banner_battery_optimization_submit_android">"از کار انداختن بهینه سازی"</string>
<string name="banner_battery_optimization_title_android">"آگاهی‌ها نمی‌رسند؟"</string>
<string name="banner_set_up_recovery_content">"بازگردانی تاریخچهٔ پیام‌ها و هویت رمزنگاشته‌تان با کلید بازیابی در صورت از دست دادن همهٔ افزاره‌های موجودتان."</string>
<string name="banner_set_up_recovery_submit">"برپایی بازیابی"</string>
<string name="banner_set_up_recovery_submit">"دریافت کلید بازیابی"</string>
<string name="banner_set_up_recovery_title">"برپایی بازیابی"</string>
<string name="confirm_recovery_key_banner_message">"کلید بازیابی خود را تأیید کنید تا دسترسی به حافظه کلیدها و تاریخچه پیام‌هایتان حفظ شود ."</string>
<string name="confirm_recovery_key_banner_primary_button_title">"ورود کلید بازیابیتان"</string>
@ -25,6 +25,7 @@
<string name="screen_roomlist_empty_message">"آغاز با پیام دادن به کسی."</string>
<string name="screen_roomlist_empty_title">"هنوز گپی وجود ندارد."</string>
<string name="screen_roomlist_filter_favourites">"علاقه‌مندی‌ها"</string>
<string name="screen_roomlist_filter_favourites_empty_state_subtitle">"می‌توانید در تنظیمات چت، یک چت را به موارد دلخواه خود اضافه کنید. فعلاً می‌توانید فیلترها را غیرفعال کنید تا چت‌های دیگر خود را ببینید."</string>
<string name="screen_roomlist_filter_favourites_empty_state_title">"هنوز هیچ گپ مورد علاقه‌ای ندارید"</string>
<string name="screen_roomlist_filter_invites">"دعوت‌ها"</string>
<string name="screen_roomlist_filter_invites_empty_state_title">"هیچ دعوت منتظری ندارید."</string>

View file

@ -5,9 +5,9 @@
<string name="banner_battery_optimization_title_android">"Powiadomienia nie dochodzą?"</string>
<string name="banner_new_sound_message">"Sygnał powiadomień został zaktualizowany — jest wyraźniejszy, szybszy i mniej uciążliwy."</string>
<string name="banner_new_sound_title">"Odświeżyliśmy Twoje dźwięki"</string>
<string name="banner_set_up_recovery_content">"Wygeneruj nowy klucz przywracania, którego można użyć do przywrócenia historii wiadomości szyfrowanych w przypadku utraty dostępu do swoich urządzeń."</string>
<string name="banner_set_up_recovery_submit">"Skonfiguruj przywracanie"</string>
<string name="banner_set_up_recovery_title">"Skonfiguruj przywracanie"</string>
<string name="banner_set_up_recovery_content">"Twoje czaty są automatycznie archiwizowane za pomocą szyfrowania end-to-end. Aby przywrócić tę kopię zapasową i swoją tożsamość cyfrową, wymagany będzie klucz przywracania."</string>
<string name="banner_set_up_recovery_submit">"Uzyskaj klucz przywracania"</string>
<string name="banner_set_up_recovery_title">"Utwórz kopię zapasową swoich czatów"</string>
<string name="confirm_recovery_key_banner_message">"Potwierdź klucz przywracania, aby zachować dostęp do magazynu kluczy i historii wiadomości."</string>
<string name="confirm_recovery_key_banner_primary_button_title">"Wprowadź klucz przywracania"</string>
<string name="confirm_recovery_key_banner_secondary_button_title">"Zapomniałeś klucza przywracania?"</string>
@ -50,6 +50,7 @@ Nie masz żadnych nieprzeczytanych wiadomości!"</string>
<string name="screen_roomlist_mark_as_read">"Oznacz jako przeczytane"</string>
<string name="screen_roomlist_mark_as_unread">"Oznacz jako nieprzeczytane"</string>
<string name="screen_roomlist_tombstoned_room_description">"Ten pokój został ulepszony"</string>
<string name="screen_roomlist_your_spaces">"Twoje przestrzenie"</string>
<string name="session_verification_banner_message">"Wygląda na to, że używasz nowego urządzenia. Zweryfikuj się innym urządzeniem, aby uzyskać dostęp do zaszyfrowanych wiadomości."</string>
<string name="session_verification_banner_title">"Potwierdź, że to Ty"</string>
</resources>

View file

@ -6,7 +6,7 @@
<string name="banner_new_sound_message">"O toque de notificação foi atualizado — mais claro, mais rápido e menos perturbador."</string>
<string name="banner_new_sound_title">"Atualizámos os seus sons"</string>
<string name="banner_set_up_recovery_content">"Recupera a tua identidade criptográfica e o histórico de mensagens com uma chave de recuperação se tiveres perdido todos os teus dispositivos existentes."</string>
<string name="banner_set_up_recovery_submit">"Configurar recuperação"</string>
<string name="banner_set_up_recovery_submit">"Chave de recuperação"</string>
<string name="banner_set_up_recovery_title">"Configurar a recuperação"</string>
<string name="confirm_recovery_key_banner_message">"Confirma a tua chave de recuperação para manteres o acesso ao teu armazenamento de chaves e ao histórico de mensagens."</string>
<string name="confirm_recovery_key_banner_primary_button_title">"Introduz a tua chave de recuperação"</string>

View file

@ -21,14 +21,14 @@
<string name="screen_invites_decline_direct_chat_message">"你确定要拒绝与 %1$s 私聊?"</string>
<string name="screen_invites_decline_direct_chat_title">"拒绝聊天"</string>
<string name="screen_invites_empty_list">"没有邀请"</string>
<string name="screen_invites_invited_you">"%1$s %2$s邀请了你"</string>
<string name="screen_invites_invited_you">"%1$s%2$s邀请了你"</string>
<string name="screen_migration_message">"此为一次性流程,感谢等待。"</string>
<string name="screen_migration_title">"设置账户。"</string>
<string name="screen_roomlist_a11y_create_message">"创建新的对话或房间"</string>
<string name="screen_roomlist_clear_filters">"清除筛选条件"</string>
<string name="screen_roomlist_empty_message">"通过向某人发送消息来开始。"</string>
<string name="screen_roomlist_empty_title">"暂无聊天。"</string>
<string name="screen_roomlist_filter_favourites">"收藏"</string>
<string name="screen_roomlist_filter_favourites">"收藏"</string>
<string name="screen_roomlist_filter_favourites_empty_state_subtitle">"可以在聊天设置里将聊天添加到收藏夹。
现在可以取消选择筛选器以查看其它对话。"</string>
<string name="screen_roomlist_filter_favourites_empty_state_title">"你尚未收藏任何聊天"</string>
@ -38,7 +38,7 @@
<string name="screen_roomlist_filter_low_priority_empty_state_title">"你暂无任何低优先级聊天"</string>
<string name="screen_roomlist_filter_mixed_empty_state_subtitle">"你可以取消选择筛选器以查看其它对话"</string>
<string name="screen_roomlist_filter_mixed_empty_state_title">"你暂无适用于此选项的聊天"</string>
<string name="screen_roomlist_filter_people">"用户"</string>
<string name="screen_roomlist_filter_people">"人员"</string>
<string name="screen_roomlist_filter_people_empty_state_title">"你暂无任何私聊"</string>
<string name="screen_roomlist_filter_rooms">"房间"</string>
<string name="screen_roomlist_filter_rooms_empty_state_title">"你尚未进入任何房间"</string>

View file

@ -15,6 +15,7 @@ import io.element.android.features.invite.api.acceptdecline.ConfirmingDeclineInv
import io.element.android.features.invite.api.acceptdecline.anAcceptDeclineInviteState
import io.element.android.features.invite.impl.AcceptInvite
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.designsystem.preview.ROOM_NAME
import io.element.android.libraries.matrix.api.core.RoomId
open class AcceptDeclineInviteStateProvider : PreviewParameterProvider<AcceptDeclineInviteState> {
@ -26,7 +27,7 @@ open class AcceptDeclineInviteStateProvider : PreviewParameterProvider<AcceptDec
InviteData(
roomId = RoomId("!room:matrix.org"),
isDm = true,
roomName = "Alice"
roomName = ROOM_NAME,
),
blockUser = false,
),
@ -36,7 +37,7 @@ open class AcceptDeclineInviteStateProvider : PreviewParameterProvider<AcceptDec
InviteData(
roomId = RoomId("!room:matrix.org"),
isDm = true,
roomName = "Alice"
roomName = ROOM_NAME,
),
blockUser = true,
),

View file

@ -10,7 +10,7 @@
<string name="screen_invites_decline_direct_chat_message">"你确定要拒绝与 %1$s 私聊?"</string>
<string name="screen_invites_decline_direct_chat_title">"拒绝聊天"</string>
<string name="screen_invites_empty_list">"没有邀请"</string>
<string name="screen_invites_invited_you">"%1$s %2$s邀请了你"</string>
<string name="screen_invites_invited_you">"%1$s%2$s邀请了你"</string>
<string name="screen_join_room_decline_and_block_alert_confirmation">"是,拒绝并屏蔽"</string>
<string name="screen_join_room_decline_and_block_alert_message">"你确定要拒绝此房间的加入邀请?这也将阻止 %1$s 与你联系或邀请你加入房间。"</string>
<string name="screen_join_room_decline_and_block_alert_title">"拒绝邀请并屏蔽"</string>

View file

@ -12,6 +12,11 @@ import androidx.compose.foundation.text.input.TextFieldState
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.designsystem.preview.USER_NAME_ALICE
import io.element.android.libraries.designsystem.preview.USER_NAME_BOB
import io.element.android.libraries.designsystem.preview.USER_NAME_CAROL
import io.element.android.libraries.designsystem.preview.USER_NAME_EVE
import io.element.android.libraries.designsystem.preview.USER_NAME_JUSTIN
import io.element.android.libraries.designsystem.theme.components.SearchBarResultState
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.ui.components.aMatrixUser
@ -33,15 +38,15 @@ internal class DefaultInvitePeopleStateProvider : PreviewParameterProvider<Defau
canInvite = true,
searchQuery = "some query",
selectedUsers = persistentListOf(
aMatrixUser("@carol:server.org", "Carol")
aMatrixUser(displayName = USER_NAME_CAROL)
),
searchResults = SearchBarResultState.Results(
persistentListOf(
anInvitableUser(aMatrixUser("@alice:server.org")),
anInvitableUser(aMatrixUser("@bob:server.org", "Bob")),
anInvitableUser(aMatrixUser("@carol:server.org", "Carol"), isSelected = true),
anInvitableUser(aMatrixUser("@eve:server.org", "Eve"), isSelected = true, isAlreadyJoined = true),
anInvitableUser(aMatrixUser("@justin:server.org", "Justin"), isSelected = true, isAlreadyInvited = true),
anInvitableUser(aMatrixUser(displayName = USER_NAME_ALICE)),
anInvitableUser(aMatrixUser(displayName = USER_NAME_BOB)),
anInvitableUser(aMatrixUser(displayName = USER_NAME_CAROL), isSelected = true),
anInvitableUser(aMatrixUser(displayName = USER_NAME_EVE), isSelected = true, isAlreadyJoined = true),
anInvitableUser(aMatrixUser(displayName = USER_NAME_JUSTIN), isSelected = true, isAlreadyInvited = true),
)
)
),
@ -50,12 +55,12 @@ internal class DefaultInvitePeopleStateProvider : PreviewParameterProvider<Defau
canInvite = true,
searchQuery = "@alice:server.org",
selectedUsers = persistentListOf(
aMatrixUser("@carol:server.org", "Carol")
aMatrixUser(displayName = USER_NAME_CAROL)
),
searchResults = SearchBarResultState.Results(
persistentListOf(
anInvitableUser(aMatrixUser("@alice:server.org"), isUnresolved = true),
anInvitableUser(aMatrixUser("@bob:server.org", "Bob")),
anInvitableUser(aMatrixUser(displayName = USER_NAME_ALICE), isUnresolved = true),
anInvitableUser(aMatrixUser(displayName = USER_NAME_BOB)),
)
)
),
@ -65,7 +70,7 @@ internal class DefaultInvitePeopleStateProvider : PreviewParameterProvider<Defau
searchQuery = "@alice:server.org",
searchResults = SearchBarResultState.Results(
persistentListOf(
anInvitableUser(aMatrixUser("@alice:server.org"), isUnresolved = true),
anInvitableUser(aMatrixUser(displayName = USER_NAME_ALICE), isUnresolved = true),
)
),
showSearchLoader = true,
@ -77,9 +82,11 @@ internal class DefaultInvitePeopleStateProvider : PreviewParameterProvider<Defau
sendInvitesAction = AsyncAction.Loading,
),
aDefaultInvitePeopleState(
sendInvitesAction = ConfirmingUnknownUserInvitation(persistentListOf(
aMatrixUser("@alice:server.org")
))
sendInvitesAction = ConfirmingUnknownUserInvitation(
persistentListOf(
aMatrixUser(),
)
)
),
aDefaultInvitePeopleState(
sendInvitesAction = ConfirmingUnknownUserInvitation(

View file

@ -2,4 +2,8 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_invite_users_already_a_member">"Allerede medlem"</string>
<string name="screen_invite_users_already_invited">"Allerede inviteret"</string>
<string name="screen_invite_users_confirm_dialog_subtitle_multiple_users">"Du har i øjeblikket ingen chats med disse kontakter. Bekræft deres invitation til dette rum, før du fortsætter."</string>
<string name="screen_invite_users_confirm_dialog_subtitle_one_user">"Du har i øjeblikket ingen chats med denne kontakt. Bekræft deres invitation til dette rum, før du fortsætter."</string>
<string name="screen_invite_users_confirm_dialog_title_mutiple_users">"Inviter nye kontakter til dette rum?"</string>
<string name="screen_invite_users_confirm_dialog_title_one_user">"Inviter ny kontakt til dette rum?"</string>
</resources>

View file

@ -2,4 +2,8 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_invite_users_already_a_member">"Već je član"</string>
<string name="screen_invite_users_already_invited">"Već je pozvan/a"</string>
<string name="screen_invite_users_confirm_dialog_subtitle_multiple_users">"Trenutno nemate razgovora s ovim kontaktima. Potvrdite da ih želite pozvati u ovu sobu prije nego što nastavite."</string>
<string name="screen_invite_users_confirm_dialog_subtitle_one_user">"Trenutno nemate razgovora s ovim kontaktom. Potvrdite da ste ga pozvali u ovu sobu prije nego što nastavite."</string>
<string name="screen_invite_users_confirm_dialog_title_mutiple_users">"Pozvati nove kontakte u ovu sobu?"</string>
<string name="screen_invite_users_confirm_dialog_title_one_user">"Pozvati novi kontakt u ovu sobu?"</string>
</resources>

View file

@ -2,4 +2,8 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_invite_users_already_a_member">"Már tag"</string>
<string name="screen_invite_users_already_invited">"Már meghívták"</string>
<string name="screen_invite_users_confirm_dialog_subtitle_multiple_users">"Jelenleg nincsenek csevegései ezekkel a kapcsolatokkal. Mielőtt továbbmenne, erősítse meg, hogy meghívja őket ebbe a szobába."</string>
<string name="screen_invite_users_confirm_dialog_subtitle_one_user">"Jelenleg nincsenek beszélgetései ezzel a személlyel. A folytatás előtt erősítse meg, hogy meghívja ebbe a szobába."</string>
<string name="screen_invite_users_confirm_dialog_title_mutiple_users">"Új személyeket hív meg ebbe a szobába?"</string>
<string name="screen_invite_users_confirm_dialog_title_one_user">"Új személyt hív meg ebbe a szobába?"</string>
</resources>

View file

@ -2,4 +2,8 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_invite_users_already_a_member">"Già membro"</string>
<string name="screen_invite_users_already_invited">"Già invitato"</string>
<string name="screen_invite_users_confirm_dialog_subtitle_multiple_users">"Al momento non hai conversazioni con questi contatti. Conferma di invitarli in questa stanza prima di continuare."</string>
<string name="screen_invite_users_confirm_dialog_subtitle_one_user">"Al momento non hai converszioni con questo contatto. Conferma di invitarlo in questa stanza prima di continuare."</string>
<string name="screen_invite_users_confirm_dialog_title_mutiple_users">"Invita nuovi contatti in questa stanza?"</string>
<string name="screen_invite_users_confirm_dialog_title_one_user">"Invitare un nuovo contatto in questa stanza?"</string>
</resources>

View file

@ -2,4 +2,8 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_invite_users_already_a_member">"Jest już członkiem"</string>
<string name="screen_invite_users_already_invited">"Już zaproszony"</string>
<string name="screen_invite_users_confirm_dialog_subtitle_multiple_users">"Obecnie nie prowadzisz żadnych czatów z tymi kontaktami. Potwierdź zaproszenie, zanim przejdziesz dalej."</string>
<string name="screen_invite_users_confirm_dialog_subtitle_one_user">"Obecnie nie posiadasz żadnych czatów z tym kontaktem. Potwierdź zaproszenie, zanim przejdziesz dalej."</string>
<string name="screen_invite_users_confirm_dialog_title_mutiple_users">"Zaprosić nowe kontakty do tego pokoju?"</string>
<string name="screen_invite_users_confirm_dialog_title_one_user">"Zaprosić nowy kontakt do tego pokoju?"</string>
</resources>

View file

@ -2,4 +2,8 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_invite_users_already_a_member">"Уже учасник"</string>
<string name="screen_invite_users_already_invited">"Уже запрошені"</string>
<string name="screen_invite_users_confirm_dialog_subtitle_multiple_users">"Наразі у вас немає чатів із цими контактами. Підтвердьте запрошення їх до цієї кімнати, перш ніж продовжувати."</string>
<string name="screen_invite_users_confirm_dialog_subtitle_one_user">"Наразі у вас немає чатів із цим контактом. Підтвердьте запрошення до цієї кімнати, перш ніж продовжувати."</string>
<string name="screen_invite_users_confirm_dialog_title_mutiple_users">"Запросити нових контактів до цієї кімнати?"</string>
<string name="screen_invite_users_confirm_dialog_title_one_user">"Запросити нового контакта до цієї кімнати?"</string>
</resources>

View file

@ -320,7 +320,7 @@ internal class DefaultInvitePeoplePresenterTest {
val initialState = awaitItemAsDefault()
skipItems(1)
val selectedUser = aMatrixUser()
val selectedUser = aMatrixUser(displayName = "John Doe")
initialState.eventSink(DefaultInvitePeopleEvents.ToggleUser(selectedUser))
@ -358,7 +358,7 @@ internal class DefaultInvitePeoplePresenterTest {
val initialState = awaitItemAsDefault()
skipItems(1)
val selectedUser = aMatrixUser()
val selectedUser = aMatrixUser(displayName = "John Doe")
// Given a query is made
initialState.searchQuery.setTextAndPlaceCursorAtEnd("some query")

View file

@ -15,6 +15,9 @@ import io.element.android.features.invite.api.acceptdecline.anAcceptDeclineInvit
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.designsystem.preview.ROOM_NAME
import io.element.android.libraries.designsystem.preview.USER_NAME_ALICE
import io.element.android.libraries.designsystem.preview.USER_NAME_BOB
import io.element.android.libraries.matrix.api.core.RoomAlias
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.RoomIdOrAlias
@ -134,8 +137,8 @@ open class JoinRoomStateProvider : PreviewParameterProvider<JoinRoomState> {
joinAuthorisationStatus = JoinAuthorisationStatus.IsBanned(
banSender = InviteSender(
userId = UserId("@alice:domain"),
displayName = "Alice",
avatarData = AvatarData("alice", "Alice", size = AvatarSize.InviteSender),
displayName = USER_NAME_ALICE,
avatarData = AvatarData("alice", USER_NAME_ALICE, size = AvatarSize.InviteSender),
membershipChangeReason = "spamming"
),
reason = "spamming",
@ -222,7 +225,7 @@ fun aJoinRoomState(
internal fun anInviteSender(
userId: UserId = UserId("@bob:domain"),
displayName: String = "Bob",
displayName: String = USER_NAME_BOB,
avatarData: AvatarData = AvatarData(userId.value, displayName, size = AvatarSize.InviteSender),
membershipChangeReason: String? = null,
) = InviteSender(
@ -234,7 +237,7 @@ internal fun anInviteSender(
internal fun anInviteData(
roomId: RoomId = A_ROOM_ID,
roomName: String = "Room name",
roomName: String = ROOM_NAME,
isDm: Boolean = false,
) = InviteData(
roomId = roomId,

View file

@ -15,6 +15,7 @@
<string name="screen_join_room_fail_reason">"Вам потрібно отримати запрошення, щоб приєднатися, інакше доступ може бути обмежений."</string>
<string name="screen_join_room_forget_action">"Забути"</string>
<string name="screen_join_room_invite_required_message">"Вам потрібне запрошення, щоб приєднатися"</string>
<string name="screen_join_room_invited_by">"Запрошено користувачем"</string>
<string name="screen_join_room_join_action">"Доєднатися"</string>
<string name="screen_join_room_join_restricted_message">"Можливо, вам знадобиться отримати запрошення або стати учасником простору, щоб приєднатися."</string>
<string name="screen_join_room_knock_action">"Постукати, щоб приєднатися"</string>

View file

@ -11,6 +11,9 @@ package io.element.android.features.knockrequests.impl.banner
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.features.knockrequests.impl.data.KnockRequestPresentable
import io.element.android.features.knockrequests.impl.data.aKnockRequestPresentable
import io.element.android.libraries.designsystem.preview.USER_NAME_ALICE
import io.element.android.libraries.designsystem.preview.USER_NAME_BOB
import io.element.android.libraries.designsystem.preview.USER_NAME_CHARLIE
import kotlinx.collections.immutable.toImmutableList
class KnockRequestsBannerStateProvider : PreviewParameterProvider<KnockRequestsBannerState> {
@ -29,15 +32,15 @@ class KnockRequestsBannerStateProvider : PreviewParameterProvider<KnockRequestsB
aKnockRequestsBannerState(
knockRequests = listOf(
aKnockRequestPresentable(),
aKnockRequestPresentable(displayName = "Alice")
aKnockRequestPresentable(displayName = USER_NAME_ALICE)
)
),
aKnockRequestsBannerState(
knockRequests = listOf(
aKnockRequestPresentable(),
aKnockRequestPresentable(displayName = "Alice"),
aKnockRequestPresentable(displayName = "Bob"),
aKnockRequestPresentable(displayName = "Charlie")
aKnockRequestPresentable(displayName = USER_NAME_ALICE),
aKnockRequestPresentable(displayName = USER_NAME_BOB),
aKnockRequestPresentable(displayName = USER_NAME_CHARLIE)
)
),
aKnockRequestsBannerState(

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="leave_conversation_alert_subtitle">"آیا مطمئنید که می‌خواهید این مکالمه را ترک کنید؟ این مکالمه عمومی نیست و بدون دعوت نمی‌توانید دوباره به آن بپیوندید."</string>
<string name="leave_room_alert_empty_subtitle">"مطمئنید که می‌خواهید این اتاق را ترک کنید؟ تنها فرد این‌جا هستید. در صورت ترک، هیچ‌کسی از جمله خودتان در آینده نخواهد توانست به آن بپیوندد."</string>
<string name="leave_room_alert_private_subtitle">"مطمئنید که می‌خواهید این اتاق را ترک کنید؟ این اتاق عمومی نبوده قادر نخواهید بود بدون دعوت دوباره بپیوندید."</string>
<string name="leave_room_alert_select_new_owner_action">"گزینش مالکان"</string>

View file

@ -26,6 +26,7 @@ import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedInject
import io.element.android.annotations.ContributesNode
import io.element.android.compound.theme.ElementTheme
import io.element.android.features.enterprise.api.SessionEnterpriseService
import io.element.android.features.linknewdevice.api.LinkNewDeviceEntryPoint
import io.element.android.features.linknewdevice.impl.screens.confirmation.CodeConfirmationNode
import io.element.android.features.linknewdevice.impl.screens.desktop.DesktopNoticeNode
@ -65,6 +66,7 @@ class LinkNewDeviceFlowNode(
private val sessionCoroutineScope: CoroutineScope,
private val linkNewMobileHandler: LinkNewMobileHandler,
private val linkNewDesktopHandler: LinkNewDesktopHandler,
private val sessionEnterpriseService: SessionEnterpriseService,
) : BaseFlowNode<LinkNewDeviceFlowNode.NavTarget>(
backstack = BackStack(
initialElement = NavTarget.Root,
@ -298,8 +300,12 @@ class LinkNewDeviceFlowNode(
}
}
private fun navigateToBrowser(url: String) {
activity?.openUrlInChromeCustomTab(null, darkTheme, url)
private suspend fun navigateToBrowser(url: String) {
activity?.openUrlInChromeCustomTab(
session = null,
darkTheme = darkTheme,
url = sessionEnterpriseService.tweakMasUrl(url),
)
}
@Composable

View file

@ -17,6 +17,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Калі вы сутыкнуліся з той жа праблемай, паспрабуйце іншую сетку Wi-Fi або скарыстайцеся мабільнымі дадзенымі замест Wi-Fi."</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Калі гэта не дапамагло, увайдзіце ўручную"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Злучэнне небяспечнае"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Вам будзе прапанавана ўвесці дзве лічбы, паказаныя на гэтай прыладзе."</string>
<string name="screen_qr_code_login_device_code_title">"Увядзіце наступны нумар на іншай прыладзе."</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"Уваход быў адменены на іншай прыладзе."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Запыт на ўваход скасаваны"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Уваход на іншай прыладзе быў адхілены."</string>
@ -35,4 +37,5 @@
<string name="screen_qr_code_login_no_camera_permission_state_description">"Каб працягнуць, вам неабходна дазволіць %1$s выкарыстоўваць камеру вашай прылады."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Дазвольце доступ да камеры для сканіравання QR-кода"</string>
<string name="screen_qr_code_login_unknown_error_description">"Адбылася нечаканая памылка. Калі ласка, паспрабуйце яшчэ раз."</string>
<string name="screen_qr_code_login_verify_code_loading">"У чаканні іншай прылады"</string>
</resources>

View file

@ -34,6 +34,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Pokud narazíte na stejný problém, zkuste jinou síť wifi nebo použijte mobilní data místo wifi"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Pokud to nefunguje, přihlaste se ručně"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Připojení není zabezpečené"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Budete požádáni o zadání dvou níže uvedených číslic."</string>
<string name="screen_qr_code_login_device_code_title">"Zadejte níže uvedené číslo na svém dalším zařízení"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"Přihlášení bylo na druhém zařízení zrušeno."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Žádost o přihlášení zrušena"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Přihlášení bylo na druhém zařízení odmítnuto."</string>
@ -54,4 +56,5 @@ Zkuste se přihlásit ručně nebo naskenujte QR kód pomocí jiného zařízen
<string name="screen_qr_code_login_no_camera_permission_state_description">"Abyste mohli pokračovat, musíte aplikaci %1$s udělit povolení k použití kamery vašeho zařízení."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Povolte přístup k fotoaparátu a naskenujte QR kód"</string>
<string name="screen_qr_code_login_unknown_error_description">"Vyskytla se neočekávaná chyba. Prosím zkuste to znovu."</string>
<string name="screen_qr_code_login_verify_code_loading">"Čekání na vaše další zařízení"</string>
</resources>

View file

@ -17,6 +17,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Os ydych chi\'n dod ar draws yr un broblem, rhowch gynnig ar rwydwaith wifi gwahanol neu defnyddiwch eich data symudol yn lle wifi"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Os nad yw hynny\'n gweithio, mewngofnodwch â llaw"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Nid yw\'r cysylltiad yn ddiogel"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Bydd gofyn i chi nodi\'r ddau ddigid sy\'n cael eu dangos ar y ddyfais hon."</string>
<string name="screen_qr_code_login_device_code_title">"Rhowch y rhif isod ar eich dyfais arall"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"Cafodd y mewngofnodi ei ddiddymu ar y ddyfais arall."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Cais mewngofnodi wedi\'i ddiddymu"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Cafodd y mewngofnodi ar y ddyfais arall ei wrthod."</string>
@ -35,4 +37,5 @@ Ceisiwch fewngofnodi â llaw, neu sganiwch y cod QR gyda dyfais arall."</string>
<string name="screen_qr_code_login_no_camera_permission_state_description">"Mae angen i chi roi caniatâd i %1$s ddefnyddio camera eich dyfais er mwyn parhau."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Caniatáu mynediad camera i sganio\'r cod QR"</string>
<string name="screen_qr_code_login_unknown_error_description">"Digwyddodd gwall annisgwyl. Ceisiwch eto."</string>
<string name="screen_qr_code_login_verify_code_loading">"Yn aros am eich dyfais arall"</string>
</resources>

View file

@ -34,6 +34,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Hvis du støder på det samme problem, kan du prøve et andet wifi-netværk eller bruge dine mobildata i stedet for wifi"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Hvis det ikke virker, skal du logge ind manuelt"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Forbindelsen er ikke sikker"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Du bliver bedt om at indtaste de to cifre, der vises på denne enhed."</string>
<string name="screen_qr_code_login_device_code_title">"Indtast nummeret herunder på din anden enhed"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"Login blev annulleret på den anden enhed."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Anmodning om login annulleret"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Login blev afvist på den anden enhed."</string>
@ -54,4 +56,5 @@ Prøv at logge ind manuelt, eller scan QR-koden med en anden enhed."</string>
<string name="screen_qr_code_login_no_camera_permission_state_description">"Du skal give tilladelse til at %1$s kan benytte enhedens kamera, for at fortsætte."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Tillad kameraadgang for at scanne QR-koden"</string>
<string name="screen_qr_code_login_unknown_error_description">"Der opstod en uventet fejl. Prøv venligst igen."</string>
<string name="screen_qr_code_login_verify_code_loading">"Venter på din anden enhed"</string>
</resources>

View file

@ -34,6 +34,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Wenn das Problem bestehen bleibt, versuche es mit einem anderen WLAN-Netzwerk oder verwende deine mobilen Daten statt WLAN."</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Wenn das nicht funktioniert, melde dich manuell an"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Die Verbindung ist nicht sicher"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Du wirst aufgefordert, die beiden unten abgebildeten Ziffern einzugeben."</string>
<string name="screen_qr_code_login_device_code_title">"Trage die unten angezeigte Zahl auf einem anderen Device ein"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"Die Anmeldung wurde auf dem anderen Gerät abgebrochen."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Anmeldeanfrage abgebrochen"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Die Anmeldung auf dem anderen Gerät wurde abgelehnt."</string>
@ -54,4 +56,5 @@ Versuche, dich manuell anzumelden, oder scanne den QR-Code mit einem anderen Ger
<string name="screen_qr_code_login_no_camera_permission_state_description">"Du musst %1$s die Berechtigung erteilen, die Kamera deines Geräts zu verwenden, um fortzufahren."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Erlaube Zugriff auf die Kamera zum Scannen des QR-Codes"</string>
<string name="screen_qr_code_login_unknown_error_description">"Ein unerwarteter Fehler ist aufgetreten. Bitte versuche es erneut."</string>
<string name="screen_qr_code_login_verify_code_loading">"Warten auf dein anderes Gerät"</string>
</resources>

View file

@ -34,6 +34,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Εάν αντιμετωπίσεις το ίδιο πρόβλημα, δοκίμασε ένα διαφορετικό δίκτυο wifi ή χρησιμοποίησε τα δεδομένα του κινητού σου αντί για wifi"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Εάν δεν λειτουργήσει, συνδέσου χειροκίνητα"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Η σύνδεση δεν είναι ασφαλής"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Θα σου ζητηθεί να εισάγεις τα δύο ψηφία που εμφανίζονται σε αυτήν τη συσκευή."</string>
<string name="screen_qr_code_login_device_code_title">"Εισήγαγε τον παρακάτω αριθμό στην άλλη συσκευή σου"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"Η σύνδεση ακυρώθηκε στην άλλη συσκευή."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Το αίτημα σύνδεσης ακυρώθηκε"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Η σύνδεση απορρίφθηκε στην άλλη συσκευή."</string>
@ -54,4 +56,5 @@
<string name="screen_qr_code_login_no_camera_permission_state_description">"Πρέπει να δώσεις άδεια για %1$s για να χρησιμοποιήσεις την κάμερα της συσκευής σου και να συνεχίσεις."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Επέτρεψε την πρόσβαση της κάμερας για σάρωση του κωδικού QR"</string>
<string name="screen_qr_code_login_unknown_error_description">"Παρουσιάστηκε ένα απροσδόκητο σφάλμα. Παρακαλώ προσπάθησε ξανά."</string>
<string name="screen_qr_code_login_verify_code_loading">"Αναμονή για την άλλη σου συσκευή"</string>
</resources>

View file

@ -17,6 +17,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Si te encuentras con el mismo problema, prueba con una red wifi diferente o usa tus datos móviles en lugar de wifi"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Si eso no funciona, inicia sesión manualmente"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"La conexión no es segura"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Se te pedirá que introduzcas los dos dígitos mostrados en este dispositivo."</string>
<string name="screen_qr_code_login_device_code_title">"Introduce el número que aparece a continuación en tu otro dispositivo"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"El inicio de sesión se canceló en el otro dispositivo."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Solicitud de inicio de sesión cancelada"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"El inicio de sesión se rechazó en el otro dispositivo."</string>
@ -35,4 +37,5 @@ Intenta iniciar sesión manualmente o escanea el código QR con otro dispositivo
<string name="screen_qr_code_login_no_camera_permission_state_description">"Tienes que dar permiso a %1$s para que utilice la cámara de tu dispositivo y así poder continuar."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Permite el acceso a la cámara para escanear el código QR"</string>
<string name="screen_qr_code_login_unknown_error_description">"Se ha producido un error inesperado. Vuelve a intentarlo."</string>
<string name="screen_qr_code_login_verify_code_loading">"A la espera de tu otro dispositivo"</string>
</resources>

View file

@ -34,6 +34,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Kui sama probleem kordub, siis kasuta mõnda muud WiFi- või mobiilset andmedsideühendust"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Kui see ka ei aita, siis logi sisse käsitsi"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Ühendus pole turvaline"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Sul palutakse sisestada kaks selles seadmes kuvatud numbrit."</string>
<string name="screen_qr_code_login_device_code_title">"Sisesta see number oma teises seadmes"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"Sisselogimine katkestati teises seadmes."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Sisselogimispäring on tühistatud"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Sisselogimisest on teises seadmes keeldutud."</string>
@ -54,4 +56,5 @@ Proovi käsitsi sisselogimist või skaneeri QR-koodi mõne muu seadmega."</strin
<string name="screen_qr_code_login_no_camera_permission_state_description">"Jätkamiseks pead lubama, et %1$s saab kasutada sinu nutiseadme kaamerat"</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"QR-koodi lugemiseks luba kaamerat kasutada"</string>
<string name="screen_qr_code_login_unknown_error_description">"Tekkis ootamatu viga. Palun proovi uuesti."</string>
<string name="screen_qr_code_login_verify_code_loading">"Ootame sinu teise seadme järgi"</string>
</resources>

View file

@ -16,6 +16,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_1">"Saiatu berriro QR kodearekin saioa hasten sare-arazo bat izan bada"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Horrek ez badu funtzionatzen, hasi saioa eskuz"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Konexioa ez da segurua"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Gailu honetan agertzen diren bi digituak sartzeko eskatuko zaizu."</string>
<string name="screen_qr_code_login_device_code_title">"Sartu beheko zenbakia beste gailuan"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"Saioa hasteko eskaera bertan behera utzi da beste gailuan"</string>
<string name="screen_qr_code_login_error_cancelled_title">"Saioa hasteko eskaera bertan behera utzi da"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Saioa hasteari uko egin zaio beste dispositiboan."</string>
@ -33,4 +35,5 @@ Saiatu saioa eskuz hasten, edo eskaneatu QR kodea beste gailu batean."</string>
<string name="screen_qr_code_login_invalid_scan_state_subtitle">"QR kode okerra"</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Baimendu kameraren sarbidea QR kodea eskaneatzeko"</string>
<string name="screen_qr_code_login_unknown_error_description">"Ustekabeko errore bat gertatu da. Saiatu berriro."</string>
<string name="screen_qr_code_login_verify_code_loading">"Beste gailuaren zain"</string>
</resources>

View file

@ -15,6 +15,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_header">"اکنون چه؟"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"ورود دستی در صورت کار نکردنش"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"اتّصال ناامن"</string>
<string name="screen_qr_code_login_device_code_subtitle">"از شما خواسته خواهد شد که دو رقم نشان داده روی این افزاره را وارد کنید."</string>
<string name="screen_qr_code_login_device_code_title">"شمارهٔ زیر را روی افزارهٔ دیگرتان وارد کنید"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"ورود روی افزارهٔ دیگر لغو شد."</string>
<string name="screen_qr_code_login_error_cancelled_title">"درخواست ورد لغو شد"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"ورود به دست افزارهٔ دیگر رد شد."</string>
@ -33,4 +35,5 @@
<string name="screen_qr_code_login_no_camera_permission_state_description">"برای ادامه باید اجازهٔ استفادهٔ %1$s از دوربین افزاره‌تان را بدهید."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"اجازهٔ دسترسی دوربین برای پویش کد پاس"</string>
<string name="screen_qr_code_login_unknown_error_description">"خطایی غیرمنتظره رخ داد. لطفاً دوباره تلاش کنید."</string>
<string name="screen_qr_code_login_verify_code_loading">"منتظر افزارهٔ دیگرتان"</string>
</resources>

View file

@ -34,6 +34,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Jos kohtaat saman ongelman, kokeile toista wifi-verkkoa tai käytä mobiilidataa wifi-yhteyden sijaan"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Jos tämä ei auta, kirjaudu sisään manuaalisesti"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Yhteys ei ole turvallinen"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Sinua pyydetään antamaan tässä laitteessa näkyvät kaksi numeroa."</string>
<string name="screen_qr_code_login_device_code_title">"Kirjoita alla oleva numero toisella laitteellasi"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"Kirjautuminen peruutettiin toisella laitteella."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Kirjautumispyyntö peruutettu"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Kirjautuminen hylättiin toisella laitteella."</string>
@ -54,4 +56,5 @@ Yritä kirjautua sisään manuaalisesti tai skannaa QR-koodi toisella laitteella
<string name="screen_qr_code_login_no_camera_permission_state_description">"Jatkaaksesi sinun on annettava lupa %1$s -sovellukselle käyttää laitteesi kameraa."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Salli lupa kameraan QR-koodin skannaamiseksi"</string>
<string name="screen_qr_code_login_unknown_error_description">"Tapahtui odottamaton virhe. Yritä uudelleen."</string>
<string name="screen_qr_code_login_verify_code_loading">"Odotetaan toista laitettasi"</string>
</resources>

View file

@ -34,6 +34,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Si vous rencontrez le même problème, essayez un autre réseau wifi ou utilisez vos données mobiles au lieu du wifi"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Si cela ne fonctionne pas, connectez-vous manuellement"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"La connexion nest pas sécurisée"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Il vous sera demandé de saisir les deux chiffres affichés sur cet appareil."</string>
<string name="screen_qr_code_login_device_code_title">"Saisissez le nombre ci-dessous sur votre autre appareil"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"La connexion a été annulée sur lautre appareil."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Demande de connexion annulée"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"La connexion a été refusée sur lautre appareil."</string>
@ -52,4 +54,5 @@
<string name="screen_qr_code_login_no_camera_permission_state_description">"Vous devez autoriser %1$s à utiliser la camera de votre appareil pour continuer."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Autoriser lusage de la caméra pour scanner le code QR"</string>
<string name="screen_qr_code_login_unknown_error_description">"Une erreur inattendue sest produite. Veuillez réessayer."</string>
<string name="screen_qr_code_login_verify_code_loading">"En attente de votre autre session"</string>
</resources>

View file

@ -34,6 +34,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Ako se problem ponovi, pokušajte s drugom Wi-Fi mrežom ili mobilnim podatcima umjesto Wi-Fi-ja."</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Ako to ne uspije, prijavite se ručno"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Veza nije sigurna"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Od vas će se zatražiti da unesete dvije znamenke prikazane na ovom uređaju."</string>
<string name="screen_qr_code_login_device_code_title">"Unesite ispod navedeni broj u svoj drugi uređaj"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"Prijava je otkazana na drugom uređaju."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Zahtjev za prijavu je otkazan"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Prijava je odbijena na drugom uređaju."</string>
@ -54,4 +56,5 @@ Pokušajte se prijaviti ručno ili skenirajte QR kod drugim uređajem."</string>
<string name="screen_qr_code_login_no_camera_permission_state_description">"Za nastavak morate dati dopuštenje za %1$s da biste se mogli služiti kamerom svog uređaja."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Dopustite pristup kameri kako biste mogli skenirati QR kod"</string>
<string name="screen_qr_code_login_unknown_error_description">"Došlo je do neočekivane pogreške. Pokušajte ponovno."</string>
<string name="screen_qr_code_login_verify_code_loading">"Čekanje na vaš drugi uređaj"</string>
</resources>

View file

@ -34,6 +34,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Ha ugyanezzel a problémával találkozik, próbálkozzon másik Wi-Fi-hálózattal, vagy a Wi-Fi helyett használja a mobil-adatkapcsolatát"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Ha ez nem működik, jelentkezzen be kézileg"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"A kapcsolat nem biztonságos"</string>
<string name="screen_qr_code_login_device_code_subtitle">"A rendszer kérni fogja, hogy adja meg az alábbi két számjegyet az eszközén."</string>
<string name="screen_qr_code_login_device_code_title">"Adja meg az alábbi számot a másik eszközén"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"A bejelentkezést megszakították a másik eszközön."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Bejelentkezési kérés törölve"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"A bejelentkezést elutasították a másik eszközön."</string>
@ -54,4 +56,5 @@ Próbáljon meg kézileg bejelentkezni, vagy olvassa be a QR-kódot egy másik e
<string name="screen_qr_code_login_no_camera_permission_state_description">"A folytatáshoz engedélyeznie kell, hogy az %1$s használhassa az eszköz kameráját."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Engedélyezze a kamera elérését a QR-kód beolvasásához"</string>
<string name="screen_qr_code_login_unknown_error_description">"Váratlan hiba történt. Próbálja meg újra."</string>
<string name="screen_qr_code_login_verify_code_loading">"Várakozás a másik eszközre"</string>
</resources>

View file

@ -17,6 +17,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Jika Anda mengalami masalah yang sama, coba jaringan Wi-Fi yang berbeda atau gunakan data seluler Anda daripada Wi-Fi"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Jika tidak berhasil, masuk secara manual"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Koneksi tidak aman"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Anda akan diminta untuk memasukkan dua digit yang ditunjukkan di perangkat ini."</string>
<string name="screen_qr_code_login_device_code_title">"Masukkan nomor bawah di perangkat Anda yang lain"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"Proses masuk dibatalkan di perangkat lain."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Permintaan masuk dibatalkan"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Proses masuk ditolak di perangkat lain."</string>
@ -35,4 +37,5 @@ Coba masuk secara manual, atau pindai kode QR dengan perangkat lain."</string>
<string name="screen_qr_code_login_no_camera_permission_state_description">"Anda perlu memberikan izin ke %1$s untuk menggunakan kamera perangkat Anda untuk melanjutkan."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Izinkan akses kamera untuk memindai kode QR"</string>
<string name="screen_qr_code_login_unknown_error_description">"Terjadi kesalahan tak terduga. Silakan coba lagi."</string>
<string name="screen_qr_code_login_verify_code_loading">"Menunggu perangkat Anda yang lain"</string>
</resources>

View file

@ -34,6 +34,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Se riscontri lo stesso problema, prova con un altra rete wifi o usa i dati mobili al posto del wifi."</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Se il problema persiste, accedi manualmente"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"La connessione non è sicura"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Ti verrà chiesto di inserire le due cifre mostrate su questo dispositivo."</string>
<string name="screen_qr_code_login_device_code_title">"Inserisci il numero qui sotto sull\'altro dispositivo"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"L\'accesso è stato annullato sull\'altro dispositivo."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Richiesta di accesso annullata"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"L\'accesso è stato rifiutato sull\'altro dispositivo."</string>
@ -54,4 +56,5 @@ Prova ad accedere manualmente o scansiona il codice QR con un altro dispositivo.
<string name="screen_qr_code_login_no_camera_permission_state_description">"Per continuare, è necessario fornire l\'autorizzazione a %1$s per utilizzare la fotocamera del dispositivo."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Consenti l\'accesso alla fotocamera per la scansione del codice QR"</string>
<string name="screen_qr_code_login_unknown_error_description">"Si è verificato un errore inatteso. Riprova."</string>
<string name="screen_qr_code_login_verify_code_loading">"In attesa dell\'altro dispositivo"</string>
</resources>

View file

@ -18,7 +18,7 @@
<string name="screen_link_new_device_error_request_timeout_subtitle">"サインインが無効です。もう一度試してください。"</string>
<string name="screen_link_new_device_error_request_timeout_title">"サインインが時間内に完了しませんでした"</string>
<string name="screen_link_new_device_mobile_step1">"%1$s を他の端末で開いてください"</string>
<string name="screen_link_new_device_mobile_step2">"%1$s を選択してください"</string>
<string name="screen_link_new_device_mobile_step2">"%1$s を選択"</string>
<string name="screen_link_new_device_mobile_step2_action">"\"QRコードでサインイン\""</string>
<string name="screen_link_new_device_mobile_step3">"表示されているQRコードを一方の端末で読み取ってください"</string>
<string name="screen_link_new_device_mobile_title">"%1$s を他の端末で開いてください"</string>
@ -34,6 +34,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"同様の問題が発生する場合は、異なるWi-Fiやモバイルデータ通信を試してください"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"問題が解決しない場合は、手動でサインインしてください"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"接続が安全ではありません"</string>
<string name="screen_qr_code_login_device_code_subtitle">"この端末に表示される2つの数字の入力を要求されます"</string>
<string name="screen_qr_code_login_device_code_title">"もう一方に表示される数字を入力してください"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"もう一方の端末がサインインをキャンセルしました"</string>
<string name="screen_qr_code_login_error_cancelled_title">"サインインのリクエストがキャンセルされました"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"もう一方の端末でサインインを拒否されました"</string>
@ -54,4 +56,5 @@
<string name="screen_qr_code_login_no_camera_permission_state_description">"続行するには、%1$s にカメラの使用を許可する必要があります。"</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"QRコードを読み取るため、カメラへのアクセスを許可"</string>
<string name="screen_qr_code_login_unknown_error_description">"予期せぬ問題が発生しました。もう一度試してください。"</string>
<string name="screen_qr_code_login_verify_code_loading">"一方の端末を待機しています"</string>
</resources>

View file

@ -34,6 +34,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"동일한 문제를 겪으신 경우 다른 Wi-Fi 네트워크를 사용해 보거나 Wi-Fi 대신 모바일 데이터를 사용해 보세요."</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"만약 작동하지 않는 경우, 수동으로 로그인하세요."</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"연결이 안전하지 않습니다"</string>
<string name="screen_qr_code_login_device_code_subtitle">"이 장치에 표시된 두 자리 숫자를 입력하라는 메시지가 표시됩니다."</string>
<string name="screen_qr_code_login_device_code_title">"다른 device 에 아래 번호를 입력하세요"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"다른 기기에서 로그인이 취소되었습니다."</string>
<string name="screen_qr_code_login_error_cancelled_title">"로그인 요청이 취소되었습니다"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"다른 기기에서 로그인이 거부되었습니다."</string>
@ -54,4 +56,5 @@
<string name="screen_qr_code_login_no_camera_permission_state_description">"계속하려면 %1$s 가 기기의 카메라를 사용할 수 있도록 권한을 부여해야 합니다."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"카메라 액세스를 허용하여 QR 코드를 스캔하세요"</string>
<string name="screen_qr_code_login_unknown_error_description">"예기치 않은 오류가 발생했습니다. 다시 시도해 주세요."</string>
<string name="screen_qr_code_login_verify_code_loading">"다른 기기를 기다리고 있습니다"</string>
</resources>

View file

@ -34,6 +34,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Hvis du støter på det samme problemet, kan du prøve et annet wifi-nettverk eller bruke mobildata i stedet for wifi"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Hvis det ikke fungerer, kan du logge på manuelt"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Forbindelsen er ikke sikker"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Du blir bedt om å skrive inn de to sifrene som vises på denne enheten."</string>
<string name="screen_qr_code_login_device_code_title">"Skriv inn nummeret nedenfor på den andre enheten"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"Påloggingen ble kansellert på den andre enheten."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Påloggingsforespørsel kansellert"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Påloggingen ble avvist på den andre enheten."</string>
@ -54,4 +56,5 @@ Prøv å logge på manuelt, eller skann QR-koden med en annen enhet."</string>
<string name="screen_qr_code_login_no_camera_permission_state_description">"Du må gi tillatelse til at %1$s kan bruke enhetens kamera for å fortsette."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Tillat kameratilgang for å skanne QR-koden"</string>
<string name="screen_qr_code_login_unknown_error_description">"Det oppstod en uventet feil. Prøv igjen."</string>
<string name="screen_qr_code_login_verify_code_loading">"Venter på den andre enheten din"</string>
</resources>

View file

@ -17,6 +17,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Als je hetzelfde probleem ondervindt, probeer dan een ander wifi-netwerk of gebruik je mobiele data in plaats van wifi."</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Als dat niet werkt, log dan handmatig in"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Verbinding niet veilig"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Daar word je gevraagd om de twee cijfers in te voeren die op dit apparaat worden weergegeven."</string>
<string name="screen_qr_code_login_device_code_title">"Voer het onderstaande nummer in op je andere apparaat"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"De aanmelding is geannuleerd op het andere apparaat."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Login verzoek geannuleerd"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"De aanmelding is geweigerd op het andere apparaat."</string>
@ -35,4 +37,5 @@ Probeer handmatig in te loggen, of scan de QR code met een ander apparaat."</str
<string name="screen_qr_code_login_no_camera_permission_state_description">"Je moet %1$s toestemming geven om de camera van je apparaat te gebruiken om verder te gaan."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Cameratoegang toestaan om de QR-code te scannen"</string>
<string name="screen_qr_code_login_unknown_error_description">"Er is een onverwachte fout opgetreden. Probeer het opnieuw."</string>
<string name="screen_qr_code_login_verify_code_loading">"Aan het wachten op je andere apparaat"</string>
</resources>

View file

@ -1,26 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_link_new_device_desktop_scanning_title">"Skanuj kod QR"</string>
<string name="screen_link_new_device_desktop_step1">"Otwórz %1$s na laptopie lub komputerze stacjonarnym"</string>
<string name="screen_link_new_device_desktop_step3">"Zeskanuj kod QR za pomocą tego urządzenia"</string>
<string name="screen_link_new_device_desktop_submit">"Gotowy do skanowania"</string>
<string name="screen_link_new_device_desktop_title">"Otwórz %1$s na komputerze stacjonarnym, aby uzyskać kod QR"</string>
<string name="screen_link_new_device_enter_number_error_numbers_do_not_match">"Liczby nie pasują do siebie"</string>
<string name="screen_link_new_device_enter_number_notice">"Wprowadź 2-cyfrowy kod"</string>
<string name="screen_link_new_device_enter_number_subtitle">"Pozwoli to sprawdzić, czy połączenie z drugim urządzeniem jest bezpieczne."</string>
<string name="screen_link_new_device_enter_number_title">"Wprowadź numer wyświetlany na drugim urządzeniu"</string>
<string name="screen_link_new_device_error_app_not_supported_subtitle">"Twój dostawca konta nie obsługuje %1$s."</string>
<string name="screen_link_new_device_error_app_not_supported_title">"%1$s nie jest wspierany"</string>
<string name="screen_link_new_device_error_not_supported_subtitle">"Twój dostawca konta nie wspiera logowania na nowym urządzeniu za pomocą kodu QR."</string>
<string name="screen_link_new_device_error_not_supported_title">"Kod QR nie jest wspierany"</string>
<string name="screen_link_new_device_error_request_cancelled_subtitle">"Logowanie zostało anulowane na drugim urządzeniu."</string>
<string name="screen_link_new_device_error_request_cancelled_title">"Prośba o logowanie została anulowana"</string>
<string name="screen_link_new_device_error_request_timeout_subtitle">"Logowanie wygasło. Spróbuj ponownie."</string>
<string name="screen_link_new_device_error_request_timeout_title">"Logowanie nie zostało ukończone na czas"</string>
<string name="screen_link_new_device_mobile_step1">"Otwórz %1$s na drugim urządzeniu"</string>
<string name="screen_link_new_device_mobile_step2">"Wybierz %1$s"</string>
<string name="screen_link_new_device_mobile_step2_action">"“Zaloguj się za pomocą kodu QR”"</string>
<string name="screen_link_new_device_mobile_step3">"Zeskanuj kod QR pokazany tutaj za pomocą drugiego urządzenia"</string>
<string name="screen_link_new_device_mobile_title">"Otwórz %1$s na drugim urządzeniu"</string>
<string name="screen_link_new_device_root_desktop_computer">"Komputer stacjonarny"</string>
<string name="screen_link_new_device_root_loading_qr_code">"Ładowanie kodu QR…"</string>
<string name="screen_link_new_device_root_mobile_device">"Urządzenie mobilne"</string>
<string name="screen_link_new_device_root_title">"Jakiego typu urządzenie chcesz powiązać?"</string>
<string name="screen_link_new_device_wrong_number_subtitle">"Spróbuj ponownie i upewnij się, że 2-cyfrowy kod został wpisany prawidłowo. Jeśli liczby wciąż się nie zgadzają, skontaktuj się ze swoim dostawcą konta."</string>
<string name="screen_link_new_device_wrong_number_title">"Liczby nie pasują do siebie"</string>
<string name="screen_qr_code_login_connection_note_secure_state_description">"Nie udało się nawiązać bezpiecznego połączenia z nowym urządzeniem. Twoje istniejące urządzenia są nadal bezpieczne i nie musisz się o nie martwić."</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_header">"Co teraz?"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_1">"Spróbuj zalogować się ponownie za pomocą kodu QR, jeśli byłby to problem z siecią"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Jeśli napotkasz ten sam problem, użyj innej sieci Wi-FI lub danych mobilnych"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Jeśli to nie zadziała, zaloguj się ręcznie"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Połączenie nie jest bezpieczne"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Zostaniesz poproszony o wprowadzenie dwóch cyfr widocznych na tym urządzeniu."</string>
<string name="screen_qr_code_login_device_code_title">"Wprowadź numer poniżej na innym urządzeniu"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"Logowanie zostało anulowane na drugim urządzeniu."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Prośba o logowanie została anulowana"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Logowanie zostało odrzucone na drugim urządzeniu."</string>
<string name="screen_qr_code_login_error_declined_title">"Logowanie odrzucone"</string>
<string name="screen_qr_code_login_error_device_already_signed_in_subtitle">"Nie musisz już robić nic więcej."</string>
<string name="screen_qr_code_login_error_device_already_signed_in_title">"Twoje drugie urządzenie jest już zalogowane"</string>
<string name="screen_qr_code_login_error_expired_subtitle">"Logowanie wygasło. Spróbuj ponownie."</string>
<string name="screen_qr_code_login_error_expired_title">"Logowanie nie zostało ukończone na czas"</string>
<string name="screen_qr_code_login_error_linking_not_suported_subtitle">"Twoje drugie urządzenie nie wspiera logowania się do %s za pomocą kodu QR.
@ -35,4 +56,5 @@ Spróbuj zalogować się ręcznie lub zeskanuj kod QR na innym urządzeniu."</st
<string name="screen_qr_code_login_no_camera_permission_state_description">"Musisz przyznać uprawnienia %1$s do korzystania z kamery, aby kontynuować."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Zezwól na dostęp do kamery, aby zeskanować kod QR"</string>
<string name="screen_qr_code_login_unknown_error_description">"Wystąpił nieoczekiwany błąd. Spróbuj ponownie."</string>
<string name="screen_qr_code_login_verify_code_loading">"Oczekiwanie na drugie urządzenie"</string>
</resources>

View file

@ -34,6 +34,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Se o problema persistir, tente uma rede Wi-Fi diferente ou use seus dados móveis em vez de Wi-Fi"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Se isso não funcionar, entre manualmente"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Conexão insegura"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Você será solicitado a inserir os dois dígitos mostrados neste dispositivo."</string>
<string name="screen_qr_code_login_device_code_title">"Digite o número abaixo no seu outro dispositivo"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"A entrada foi cancelada no outro dispositivo."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Solicitação de entrada foi cancelada"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"A entrada foi recusada no outro dispositivo."</string>
@ -54,4 +56,5 @@ Tente entrar manualmente ou ler o código QR com outro dispositivo."</string>
<string name="screen_qr_code_login_no_camera_permission_state_description">"Você deve permitir que o %1$s use a câmera do seu dispositivo para continuar."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Permita o acesso à câmera para ler o código QR"</string>
<string name="screen_qr_code_login_unknown_error_description">"Ocorreu um erro inesperado. Tente novamente."</string>
<string name="screen_qr_code_login_verify_code_loading">"Aguardando seu outro dispositivo"</string>
</resources>

View file

@ -17,6 +17,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Se tiveres o mesmo problema, experimenta uma rede Wi-Fi diferente ou utiliza os teus dados móveis."</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Se isso não funcionar, inicia sessão manualmente"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Ligação insegura"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Ser-te-á pedido que insiras os dois dígitos indicados neste dispositivo."</string>
<string name="screen_qr_code_login_device_code_title">"Insere o número abaixo no teu dispositivo"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"O início de sessão foi cancelado no outro dispositivo."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Pedido de início de sessão cancelado"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"O início de sessão foi rejeitado no outro dispositivo."</string>
@ -35,4 +37,5 @@ Tenta iniciar a sessão manualmente ou digitaliza o código QR com outro disposi
<string name="screen_qr_code_login_no_camera_permission_state_description">"Para continuar, tens que dar permissão à %1$s para aceder à câmara do teu dispositivo."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Permitir o acesso à câmara para ler o código QR"</string>
<string name="screen_qr_code_login_unknown_error_description">"Ocorreu um erro inesperado. Tenta novamente."</string>
<string name="screen_qr_code_login_verify_code_loading">"À espera do teu outro dispositivo"</string>
</resources>

View file

@ -33,6 +33,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Dacă întâmpinați aceeași problemă, încercați o altă rețea Wi-Fi sau utilizați datele mobile în loc de Wi-Fi."</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Dacă nu funcționează, conectați-vă manual"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Conexiunea nu este sigură"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Vi se va cere să introduceți cele două cifre afișate pe acest dispozitiv."</string>
<string name="screen_qr_code_login_device_code_title">"Introduceți numărul de mai jos pe celălalt dispozitiv"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"Autentificarea a fost anulată de pe celălalt dispozitiv."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Cererea de autentificare a fost anulată"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Autentificarea a fost refuzată pe celălalt dispozitiv."</string>
@ -51,4 +53,5 @@
<string name="screen_qr_code_login_no_camera_permission_state_description">"Trebuie să acordați permisiunea ca %1$s să folosească camera dispozitivului pentru a continua."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Permiteți accesul la cameră pentru a scana codul QR"</string>
<string name="screen_qr_code_login_unknown_error_description">"A apărut o eroare neașteptată. Vă rugăm să încercați din nou."</string>
<string name="screen_qr_code_login_verify_code_loading">"În așteptarea celuilalt dispozitiv"</string>
</resources>

View file

@ -34,6 +34,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Если вы столкнулись с той же проблемой, попробуйте сменить точку доступа Wi-Fi или используйте мобильные данные"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Если это не помогло, войдите вручную"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Соединение не защищено"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Вам нужно будет ввести две цифры, показанные на этом устройстве."</string>
<string name="screen_qr_code_login_device_code_title">"Введите показанный номер на своем другом устройстве"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"Вход на другом устройстве был отменен."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Запрос на вход отменен"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Вход в систему был отклонен на другом устройстве."</string>
@ -54,4 +56,5 @@
<string name="screen_qr_code_login_no_camera_permission_state_description">"Чтобы продолжить, вам необходимо разрешить %1$s использовать камеру вашего устройства."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Разрешите доступ к камере для сканирования QR-кода"</string>
<string name="screen_qr_code_login_unknown_error_description">"Произошла непредвиденная ошибка. Пожалуйста, попробуйте еще раз."</string>
<string name="screen_qr_code_login_verify_code_loading">"Ожидание другого устройства"</string>
</resources>

View file

@ -34,6 +34,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Ak narazíte na rovnaký problém, vyskúšajte inú sieť Wi-Fi alebo namiesto siete Wi-Fi použite mobilné dáta"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Ak to nefunguje, prihláste sa manuálne"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Pripojenie nie je bezpečené"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Budete požiadaní o zadanie dvoch číslic zobrazených na tomto zariadení."</string>
<string name="screen_qr_code_login_device_code_title">"Zadajte nižšie uvedené číslo na vašom druhom zariadení"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"Prihlásenie bolo zrušené na druhom zariadení."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Žiadosť o prihlásenie bola zrušená"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Prihlásenie bolo zamietnuté na druhom zariadení."</string>
@ -54,4 +56,5 @@ Skúste sa prihlásiť manuálne alebo naskenujte QR kód pomocou iného zariade
<string name="screen_qr_code_login_no_camera_permission_state_description">"Ak chcete pokračovať, musíte udeliť povolenie aplikácii %1$s používať fotoaparát vášho zariadenia."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Povoľte prístup k fotoaparátu na naskenovanie QR kódu"</string>
<string name="screen_qr_code_login_unknown_error_description">"Vyskytla sa neočakávaná chyba. Prosím, skúste to znova."</string>
<string name="screen_qr_code_login_verify_code_loading">"Čaká sa na vaše druhé zariadenie"</string>
</resources>

View file

@ -17,6 +17,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Om du stöter på samma problem, prova ett annat wifi-nätverk eller använd din mobildata istället för wifi"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Om det inte fungerar, logga in manuellt"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Anslutningen är inte säker"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Du kommer att bli ombedd att ange de två siffrorna som visas på den här enheten."</string>
<string name="screen_qr_code_login_device_code_title">"Ange numret nedan på din andra enhet"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"Inloggningen avbröts på den andra enheten."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Inloggningsförfrågan avbröts"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Inloggningen avvisades på den andra enheten."</string>
@ -35,4 +37,5 @@ Prova att logga in manuellt eller skanna QR-koden med en annan enhet."</string>
<string name="screen_qr_code_login_no_camera_permission_state_description">"Du måste ge tillstånd för %1$s att använda enhetens kamera för att kunna fortsätta."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Tillåt kameraåtkomst för att skanna QR-koden"</string>
<string name="screen_qr_code_login_unknown_error_description">"Ett oväntat fel inträffade. Vänligen försök igen."</string>
<string name="screen_qr_code_login_verify_code_loading">"Väntar på din andra enhet"</string>
</resources>

View file

@ -33,6 +33,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Aynı sorunla karşılaşırsanız, farklı bir wifi ağı deneyin veya wifi yerine mobil verinizi kullanın"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Bu işe yaramazsa, manuel olarak oturum açın"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Bağlantı güvenli değil"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Bu cihazda gösterilen iki haneyi girmeniz istenecektir."</string>
<string name="screen_qr_code_login_device_code_title">"Aşağıdaki numarayı diğer cihazınıza girin"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"Oturum açma işlemi diğer cihazda iptal edildi."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Oturum açma isteği iptal edildi"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Diğer cihazda oturum açma işlemi reddedildi."</string>
@ -51,4 +53,5 @@ Manuel olarak oturum açmayı deneyin veya QR kodunu başka bir cihazla tarayın
<string name="screen_qr_code_login_no_camera_permission_state_description">"Devam etmek için %1$s cihazınızın kamerasını kullanmasına izin vermeniz gerekir."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"QR kodunu taramak için kamera erişimine izin verin"</string>
<string name="screen_qr_code_login_unknown_error_description">"Beklenmeyen bir hata oluştu. Lütfen tekrar deneyin."</string>
<string name="screen_qr_code_login_verify_code_loading">"Diğer cihazınız bekleniyor"</string>
</resources>

View file

@ -26,6 +26,7 @@
<string name="screen_link_new_device_root_loading_qr_code">"Завантаження QR-коду…"</string>
<string name="screen_link_new_device_root_mobile_device">"Мобільний пристрій"</string>
<string name="screen_link_new_device_root_title">"Який тип пристрою ви хочете під\'єднати?"</string>
<string name="screen_link_new_device_wrong_number_subtitle">"Спробуйте ще раз і переконайтеся, що ви правильно ввели двозначний код. Якщо цифри все одно не збігаються, зверніться до свого провайдера облікового запису."</string>
<string name="screen_link_new_device_wrong_number_title">"Цифри не збігаються"</string>
<string name="screen_qr_code_login_connection_note_secure_state_description">"Не вдалося встановити безпечне з\'єднання з новим пристроєм. Ваші наявні пристрої досі в безпеці, і вам не потрібно про них турбуватися."</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_header">"Що тепер?"</string>
@ -33,6 +34,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Якщо ви зіткнулися з тією ж проблемою, спробуйте іншу мережу Wi-Fi або використовуйте мобільний інтернет замість Wi-Fi"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Якщо це не спрацює, увійдіть вручну"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"З\'єднання не безпечне"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Вас попросять ввести дві цифри, показані на цьому пристрої."</string>
<string name="screen_qr_code_login_device_code_title">"Введіть номер нижче на іншому пристрої"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"Вхід було скасовано на іншому пристрої."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Запит на вхід скасовано"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Вхід був відхилений на іншому пристрої."</string>
@ -53,4 +56,5 @@
<string name="screen_qr_code_login_no_camera_permission_state_description">"Вам потрібно дати дозвіл %1$s на використання камери вашого пристрою, щоб продовжити."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"Надайте доступ до камери, щоб сканувати QR-код"</string>
<string name="screen_qr_code_login_unknown_error_description">"Сталася несподівана помилка. Будь ласка, спробуйте ще раз."</string>
<string name="screen_qr_code_login_verify_code_loading">"Чекаємо на ваш інший пристрій"</string>
</resources>

View file

@ -17,6 +17,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"اگر آپ کو بھی یہی مسئلہ درپیش ہو، تو کوئی دوسرا وائی فائی شبکہ آزمائیں یا وائی فائی کے بجائے اپنے محمول بیانات استعمال کریں۔"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"اگر یہ کام نہ کرے، تو دستی طور پر داخل ہوں"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"اتصال محفوظ نہیں"</string>
<string name="screen_qr_code_login_device_code_subtitle">"آپ سے اس آلے پر دکھائے گئے دو ہندسوں کو درج کرنے کو کہا جائے گا۔"</string>
<string name="screen_qr_code_login_device_code_title">"اپنے دوسرے آلے پر درج ذیل نمبر درج کریں"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"دوسرے آلے پر دخول منسوخ کر دیا گیا تھا۔"</string>
<string name="screen_qr_code_login_error_cancelled_title">"دخول کی درخواست منسوخ"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"دوسرے آلہ پر دخول کو مسترد کر دیا گیا تھا۔"</string>
@ -35,4 +37,5 @@
<string name="screen_qr_code_login_no_camera_permission_state_description">"جاری رکھنے کے لیے آپ %1$s کو اپنے آلے کا تصویرگر استعمال کرنے کی اجازت دینے کی ضرورت ہے۔"</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"کیو آر رمز کو مسح ضوئی کرنے کے لئے تصویرگر تک رسائی کی اجازت دیں"</string>
<string name="screen_qr_code_login_unknown_error_description">"ایک غیر متوقع نقص واقع ہوا۔ برائے مہربانی دوبارہ کوشش کریں۔"</string>
<string name="screen_qr_code_login_verify_code_loading">"آپکے دوسرے آلے کا منتظر"</string>
</resources>

View file

@ -34,6 +34,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"Xuddi shu muammoga duch kelsangiz, boshqa wifi tarmogʻini sinang yoki wifi oʻrniga mobil internetdan foydalaning"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"Agar bunisi ishlamasa, oddiy usulda kiring"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"Ulanish xavfsiz emas"</string>
<string name="screen_qr_code_login_device_code_subtitle">"Sizdan ushbu qurilmada koʻrsatilgan ikkita raqamni kiritish soʻraladi."</string>
<string name="screen_qr_code_login_device_code_title">"Narigi qurilmada quyidagi raqamni kiriting"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"Boshqa qurilmadan hisobga kirish bekor qilindi."</string>
<string name="screen_qr_code_login_error_cancelled_title">"Tizimga kirish soʻrovi bekor qilindi"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Boshqa qurilmadan hisobga kirish bekor qilindi."</string>
@ -54,4 +56,5 @@ Oddiy usulda kiring yoki boshqa qurilma bilan QR kodni skanerlang."</string>
<string name="screen_qr_code_login_no_camera_permission_state_description">"Davom etish uchun %1$s qurilmangiz kamerasidan foydalanishiga ruxsat berishingiz kerak."</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"QR kodni skanerlash uchun kameraga ruxsat bering"</string>
<string name="screen_qr_code_login_unknown_error_description">"Kutilmagan xatolik yuz berdi. Qayta urining."</string>
<string name="screen_qr_code_login_verify_code_loading">"Boshqa qurilmangiz kutilmoqda"</string>
</resources>

View file

@ -34,6 +34,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"如果遇到相同的問題,請嘗試使用其他 wifi 網路或您的行動數據"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"若無法運作,請手動登入"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"連線不安全"</string>
<string name="screen_qr_code_login_device_code_subtitle">"系統會要求您輸入此裝置上顯示的兩位數字。"</string>
<string name="screen_qr_code_login_device_code_title">"在您的其他裝置上輸入以下數字"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"已在其他裝置上取消登入。"</string>
<string name="screen_qr_code_login_error_cancelled_title">"已取消登入請求"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"其他裝置拒絕登入。"</string>
@ -54,4 +56,5 @@
<string name="screen_qr_code_login_no_camera_permission_state_description">"您必須授予 %1$s 權限以使用裝置相機才能繼續。"</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"允許相機權限以掃描 QR code"</string>
<string name="screen_qr_code_login_unknown_error_description">"發生意外錯誤。請再試一次。"</string>
<string name="screen_qr_code_login_verify_code_loading">"等待您的其他裝置"</string>
</resources>

View file

@ -34,6 +34,8 @@
<string name="screen_qr_code_login_connection_note_secure_state_list_item_2">"如果遇到同样的问题,请尝试使用不同的 WiFi 网络或使用移动数据代替 WiFi"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_3">"如果不起作用,请手动登录"</string>
<string name="screen_qr_code_login_connection_note_secure_state_title">"连接不安全"</string>
<string name="screen_qr_code_login_device_code_subtitle">"你将被要求输入此设备上显示的两位数字。"</string>
<string name="screen_qr_code_login_device_code_title">"在你的其它设备上输入以下数字"</string>
<string name="screen_qr_code_login_error_cancelled_subtitle">"登录被另一台设备取消"</string>
<string name="screen_qr_code_login_error_cancelled_title">"登录请求已取消"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"另一设备上的登录请求已被拒绝。"</string>
@ -54,4 +56,5 @@
<string name="screen_qr_code_login_no_camera_permission_state_description">"你需要授予 %1$s 使用设备摄像头的权限才能继续。"</string>
<string name="screen_qr_code_login_no_camera_permission_state_title">"允许访问摄像头以扫描二维码"</string>
<string name="screen_qr_code_login_unknown_error_description">"发生了意外错误。请再试一次。"</string>
<string name="screen_qr_code_login_verify_code_loading">"正在等待其它设备"</string>
</resources>

View file

@ -11,6 +11,7 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.testing.junit4.util.MainDispatcherRule
import com.google.common.truth.Truth.assertThat
import io.element.android.features.enterprise.test.FakeSessionEnterpriseService
import io.element.android.features.linknewdevice.api.LinkNewDeviceEntryPoint
import io.element.android.libraries.matrix.test.FakeMatrixClient
import io.element.android.tests.testutils.lambda.lambdaError
@ -37,6 +38,7 @@ class DefaultLinkNewDeviceEntryPointTest {
sessionCoroutineScope = backgroundScope,
linkNewMobileHandler = LinkNewMobileHandler(client),
linkNewDesktopHandler = LinkNewDesktopHandler(client),
sessionEnterpriseService = FakeSessionEnterpriseService(),
)
}
val callback: LinkNewDeviceEntryPoint.Callback = object : LinkNewDeviceEntryPoint.Callback {

View file

@ -71,6 +71,7 @@ dependencies {
implementation(projects.libraries.matrixui)
implementation(projects.libraries.uiStrings)
implementation(libs.coil.compose)
implementation(libs.datetime)
testCommonDependencies(libs)
}

View file

@ -0,0 +1,100 @@
/*
* Copyright (c) 2026 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.features.location.api
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.drawBehind
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
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.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Button
import io.element.android.libraries.designsystem.theme.components.ButtonSize
import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.ui.strings.CommonStrings
@Composable
fun LiveLocationSharingBanner(
onClick: () -> Unit,
onStopClick: () -> Unit,
modifier: Modifier = Modifier,
) {
Row(
modifier = modifier
.fillMaxWidth()
.background(ElementTheme.colors.bgCanvasDefault)
.drawBannerBorder(ElementTheme.colors.separatorPrimary)
.clickable(onClick = onClick)
.padding(horizontal = 16.dp, vertical = 12.dp),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
) {
Row(
horizontalArrangement = Arrangement.spacedBy(12.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
imageVector = CompoundIcons.LocationPinSolid(),
contentDescription = null,
tint = ElementTheme.colors.iconAccentPrimary,
modifier = Modifier.size(24.dp),
)
Text(
text = stringResource(CommonStrings.screen_room_live_location_banner),
style = ElementTheme.typography.fontBodyMdMedium,
color = ElementTheme.colors.textPrimary,
)
}
Button(
text = stringResource(CommonStrings.action_stop),
onClick = onStopClick,
destructive = true,
size = ButtonSize.Small,
)
}
}
private fun Modifier.drawBannerBorder(borderColor: Color): Modifier = drawBehind {
val strokeWidth = 1.dp.toPx()
val bottomY = size.height - strokeWidth / 2
drawLine(
color = borderColor,
start = Offset(0f, strokeWidth / 2),
end = Offset(size.width, strokeWidth / 2),
strokeWidth = strokeWidth,
)
drawLine(
color = borderColor,
start = Offset(0f, bottomY),
end = Offset(size.width, bottomY),
strokeWidth = strokeWidth,
)
}
@PreviewsDayNight
@Composable
internal fun LiveLocationSharingBannerPreview() = ElementPreview {
LiveLocationSharingBanner(
onClick = {},
onStopClick = {},
)
}

View file

@ -0,0 +1,43 @@
/*
* Copyright (c) 2026 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.features.location.api.live
import io.element.android.libraries.core.coroutine.mapState
import io.element.android.libraries.matrix.api.core.RoomId
import kotlinx.coroutines.flow.StateFlow
import kotlin.time.Duration
interface ActiveLiveLocationShareManager {
/** All rooms currently sharing live location on this device. */
val sharingRoomIds: StateFlow<Set<RoomId>>
/**
* Initializes the manager.
* This will restart or stop current location sharing and set the listener on the SDK
* and the session manager.
*/
suspend fun setup()
/**
* Starts live location sharing in the given room.
* Calls room.startLiveLocationShare() on the SDK, registers the share,
* and starts the foreground GPS service if not already running.
*/
suspend fun startShare(roomId: RoomId, duration: Duration): Result<Unit>
/**
* Stops live location sharing in the given room.
* Calls room.stopLiveLocationShare() on the SDK, removes the share,
* and stops the foreground service if no shares remain.
*/
suspend fun stopShare(roomId: RoomId): Result<Unit>
}
fun ActiveLiveLocationShareManager.isCurrentlySharing(roomId: RoomId): StateFlow<Boolean> {
return sharingRoomIds.mapState { roomId in it }
}

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