From a23463897a79fab28ed6d10aa417756e7c3caeff Mon Sep 17 00:00:00 2001 From: Michelle Tang Date: Thu, 30 Jul 2026 15:54:02 -0400 Subject: [PATCH] Add debug log option to contact support flow in regV5. Co-authored-by: Greyson Parrelli --- .../securesms/ApplicationContext.java | 9 +- .../v2/AppContactSupportController.kt | 51 +++++++++++ .../sample/RegistrationApplication.kt | 16 ++-- .../registration/ContactSupportController.kt | 18 ++++ .../registration/RegistrationDependencies.kt | 5 +- .../PinEntryForRegistrationLockViewModel.kt | 3 +- .../pinentry/PinEntryForSmsBypassViewModel.kt | 9 +- .../PinEntryForSvrRestoreViewModel.kt | 5 +- .../screens/pinentry/PinEntryScreen.kt | 20 +++-- .../pinentry/PinEntryScreenEventHandler.kt | 1 + .../screens/pinentry/PinEntryScreenEvents.kt | 1 + .../screens/pinentry/PinEntryState.kt | 1 + .../RemoteBackupRestoreScreen.kt | 13 ++- .../RemoteBackupRestoreScreenEvents.kt | 4 + .../RemoteBackupRestoreState.kt | 5 +- .../RemoteBackupRestoreViewModel.kt | 6 ++ .../screens/shared/ContactSupportDialog.kt | 90 +++++++++++++++++++ .../screens/shared/ContactSupportEvents.kt | 7 ++ .../screens/shared/ContactSupportState.kt | 7 ++ .../screens/shared/ContactSupportViewModel.kt | 48 ++++++++++ .../ContactSupportBottomSheet.kt | 12 ++- .../VerificationCodeScreen.kt | 10 +++ .../VerificationCodeScreenEvents.kt | 4 + .../verificationcode/VerificationCodeState.kt | 3 +- .../VerificationCodeViewModel.kt | 2 + .../src/main/res/values-af/strings.xml | 9 ++ .../src/main/res/values-ar/strings.xml | 9 ++ .../src/main/res/values-az/strings.xml | 9 ++ .../src/main/res/values-be/strings.xml | 9 ++ .../src/main/res/values-bg/strings.xml | 9 ++ .../src/main/res/values-bn/strings.xml | 9 ++ .../src/main/res/values-bs/strings.xml | 9 ++ .../src/main/res/values-ca/strings.xml | 9 ++ .../src/main/res/values-cs/strings.xml | 9 ++ .../src/main/res/values-da/strings.xml | 9 ++ .../src/main/res/values-de/strings.xml | 9 ++ .../src/main/res/values-el/strings.xml | 9 ++ .../src/main/res/values-es/strings.xml | 9 ++ .../src/main/res/values-et/strings.xml | 9 ++ .../src/main/res/values-eu/strings.xml | 9 ++ .../src/main/res/values-fa/strings.xml | 9 ++ .../src/main/res/values-fi/strings.xml | 9 ++ .../src/main/res/values-fr/strings.xml | 9 ++ .../src/main/res/values-ga/strings.xml | 9 ++ .../src/main/res/values-gl/strings.xml | 9 ++ .../src/main/res/values-gu/strings.xml | 9 ++ .../src/main/res/values-hi/strings.xml | 9 ++ .../src/main/res/values-hr/strings.xml | 9 ++ .../src/main/res/values-hu/strings.xml | 9 ++ .../src/main/res/values-in/strings.xml | 9 ++ .../src/main/res/values-it/strings.xml | 9 ++ .../src/main/res/values-iw/strings.xml | 9 ++ .../src/main/res/values-ja/strings.xml | 9 ++ .../src/main/res/values-ka/strings.xml | 9 ++ .../src/main/res/values-kk/strings.xml | 9 ++ .../src/main/res/values-km/strings.xml | 9 ++ .../src/main/res/values-kn/strings.xml | 9 ++ .../src/main/res/values-ko/strings.xml | 9 ++ .../src/main/res/values-ky/strings.xml | 9 ++ .../src/main/res/values-lt/strings.xml | 9 ++ .../src/main/res/values-lv/strings.xml | 9 ++ .../src/main/res/values-mk/strings.xml | 9 ++ .../src/main/res/values-ml/strings.xml | 9 ++ .../src/main/res/values-mr/strings.xml | 9 ++ .../src/main/res/values-ms/strings.xml | 9 ++ .../src/main/res/values-my/strings.xml | 9 ++ .../src/main/res/values-nb/strings.xml | 9 ++ .../src/main/res/values-nl/strings.xml | 9 ++ .../src/main/res/values-pa/strings.xml | 9 ++ .../src/main/res/values-pl/strings.xml | 9 ++ .../src/main/res/values-pt-rBR/strings.xml | 9 ++ .../src/main/res/values-pt/strings.xml | 9 ++ .../src/main/res/values-ro/strings.xml | 9 ++ .../src/main/res/values-ru/strings.xml | 9 ++ .../src/main/res/values-sk/strings.xml | 9 ++ .../src/main/res/values-sl/strings.xml | 9 ++ .../src/main/res/values-sq/strings.xml | 9 ++ .../src/main/res/values-sr/strings.xml | 9 ++ .../src/main/res/values-sv/strings.xml | 9 ++ .../src/main/res/values-sw/strings.xml | 9 ++ .../src/main/res/values-ta/strings.xml | 9 ++ .../src/main/res/values-te/strings.xml | 9 ++ .../src/main/res/values-th/strings.xml | 9 ++ .../src/main/res/values-tl/strings.xml | 9 ++ .../src/main/res/values-tr/strings.xml | 9 ++ .../src/main/res/values-ug/strings.xml | 9 ++ .../src/main/res/values-uk/strings.xml | 9 ++ .../src/main/res/values-ur/strings.xml | 9 ++ .../src/main/res/values-vi/strings.xml | 9 ++ .../src/main/res/values-yue/strings.xml | 9 ++ .../src/main/res/values-zh-rCN/strings.xml | 9 ++ .../src/main/res/values-zh-rHK/strings.xml | 9 ++ .../src/main/res/values-zh-rTW/strings.xml | 9 ++ .../src/main/res/values/strings.xml | 26 ++++-- 94 files changed, 942 insertions(+), 46 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/registration/v2/AppContactSupportController.kt create mode 100644 feature/registration/src/main/java/org/signal/registration/ContactSupportController.kt create mode 100644 feature/registration/src/main/java/org/signal/registration/screens/shared/ContactSupportDialog.kt create mode 100644 feature/registration/src/main/java/org/signal/registration/screens/shared/ContactSupportEvents.kt create mode 100644 feature/registration/src/main/java/org/signal/registration/screens/shared/ContactSupportState.kt create mode 100644 feature/registration/src/main/java/org/signal/registration/screens/shared/ContactSupportViewModel.kt diff --git a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java index 24682ff17b..e3cb310c99 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java @@ -105,6 +105,7 @@ import org.thoughtcrime.securesms.mms.SignalGlideModule; import org.thoughtcrime.securesms.ratelimit.RateLimitUtil; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.registration.util.RegistrationUtil; +import org.thoughtcrime.securesms.registration.v2.AppContactSupportController; import org.thoughtcrime.securesms.registration.v2.AppRegistrationNetworkController; import org.thoughtcrime.securesms.registration.v2.AppRegistrationStorageController; import org.thoughtcrime.securesms.ringrtc.RingRtcLogger; @@ -120,7 +121,6 @@ import org.thoughtcrime.securesms.service.webrtc.AndroidTelecomUtil; import org.thoughtcrime.securesms.storage.StorageSyncHelper; import org.thoughtcrime.securesms.util.AppStartup; import org.thoughtcrime.securesms.util.BatterySnapshotTracker; -import org.thoughtcrime.securesms.util.CommunicationActions; import org.thoughtcrime.securesms.util.DeviceProperties; import org.thoughtcrime.securesms.util.DynamicTheme; import org.thoughtcrime.securesms.util.Environment; @@ -129,7 +129,6 @@ import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.SignalLocalMetrics; import org.thoughtcrime.securesms.util.SignalUncaughtExceptionHandler; import org.thoughtcrime.securesms.util.SqlCipherLogTarget; -import org.thoughtcrime.securesms.util.SupportEmailUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.VersionTracker; import org.thoughtcrime.securesms.util.dynamiclanguage.DynamicLanguageContextWrapper; @@ -443,11 +442,7 @@ public class ApplicationContext extends Application implements AppForegroundObse context.startActivity(EditProxyActivity.intent(context)); return Unit.INSTANCE; }, - (context, subject) -> { - String body = SupportEmailUtil.generateSupportEmailBody(context, subject, null, null); - CommunicationActions.openEmail(context, SupportEmailUtil.getSupportEmailAddress(context), subject, body); - return Unit.INSTANCE; - } + new AppContactSupportController() ) ); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/v2/AppContactSupportController.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/v2/AppContactSupportController.kt new file mode 100644 index 0000000000..2999033041 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/v2/AppContactSupportController.kt @@ -0,0 +1,51 @@ +/* + * Copyright 2026 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.registration.v2 + +import android.content.Context +import kotlinx.coroutines.suspendCancellableCoroutine +import org.signal.core.util.logging.Log +import org.signal.core.util.orNull +import org.signal.registration.ContactSupportController +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.logsubmit.SubmitDebugLogRepository +import org.thoughtcrime.securesms.util.CommunicationActions +import org.thoughtcrime.securesms.util.SupportEmailUtil +import kotlin.coroutines.resume + +/** + * App-side implementation of the registration module's [ContactSupportController]. + */ +class AppContactSupportController : ContactSupportController { + + companion object { + val TAG = Log.tag(AppContactSupportController::class.java) + } + + override suspend fun uploadDebugLog(): String? { + return suspendCancellableCoroutine { continuation -> + try { + SubmitDebugLogRepository().buildAndSubmitLog { result -> + continuation.resume(result.orNull()) + } + } catch (e: Throwable) { + Log.w(TAG, "Failed to submit debug log.", e) + continuation.resume(null) + } + } + } + + override fun sendSupportEmail(context: Context, subject: String, filter: String, debugLogUrl: String?) { + val prefix = if (debugLogUrl != null) { + "\n${context.getString(R.string.HelpFragment__debug_log)} $debugLogUrl\n\n" + } else { + "" + } + + val body = SupportEmailUtil.generateSupportEmailBody(context, filter, prefix, null) + CommunicationActions.openEmail(context, SupportEmailUtil.getSupportEmailAddress(context), subject, body) + } +} diff --git a/demo/registration/src/main/java/org/signal/registration/sample/RegistrationApplication.kt b/demo/registration/src/main/java/org/signal/registration/sample/RegistrationApplication.kt index d45b9a7a44..6bb60f5129 100644 --- a/demo/registration/src/main/java/org/signal/registration/sample/RegistrationApplication.kt +++ b/demo/registration/src/main/java/org/signal/registration/sample/RegistrationApplication.kt @@ -8,6 +8,7 @@ package org.signal.registration.sample import android.app.Application import android.app.NotificationChannel import android.app.NotificationManager +import android.content.Context import android.os.Build import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.conscrypt.Conscrypt @@ -24,6 +25,7 @@ import org.signal.network.config.SignalServiceUrl import org.signal.network.config.SignalStorageUrl import org.signal.network.config.SignalSvr2Url import org.signal.network.config.TrustStore +import org.signal.registration.ContactSupportController import org.signal.registration.RegistrationDependencies import org.signal.registration.sample.debug.DebugNetworkController import org.signal.registration.sample.dependencies.DemoNetworkController @@ -76,11 +78,15 @@ class RegistrationApplication : Application() { .setPositiveButton(android.R.string.ok, null) .show() }, - contactSupportCallback = { context, subject -> - MaterialAlertDialogBuilder(context) - .setMessage("Contact support not supported in the demo. Subject: $subject") - .setPositiveButton(android.R.string.ok, null) - .show() + contactSupportController = object : ContactSupportController { + override suspend fun uploadDebugLog(): String? = null + + override fun sendSupportEmail(context: Context, subject: String, filter: String, debugLogUrl: String?) { + MaterialAlertDialogBuilder(context) + .setMessage("Contact support not supported in the demo. Subject: $subject, Filter: $filter, Debug log: $debugLogUrl") + .setPositiveButton(android.R.string.ok, null) + .show() + } }, isLinkAndSyncAvailable = true ) diff --git a/feature/registration/src/main/java/org/signal/registration/ContactSupportController.kt b/feature/registration/src/main/java/org/signal/registration/ContactSupportController.kt new file mode 100644 index 0000000000..e3f5ada255 --- /dev/null +++ b/feature/registration/src/main/java/org/signal/registration/ContactSupportController.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2026 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.signal.registration + +import android.content.Context + +/** + * Controller to let users contact support with a debug log + */ +interface ContactSupportController { + + suspend fun uploadDebugLog(): String? + + fun sendSupportEmail(context: Context, subject: String, filter: String, debugLogUrl: String?) +} diff --git a/feature/registration/src/main/java/org/signal/registration/RegistrationDependencies.kt b/feature/registration/src/main/java/org/signal/registration/RegistrationDependencies.kt index 37ba24ca6d..0ec445c05c 100644 --- a/feature/registration/src/main/java/org/signal/registration/RegistrationDependencies.kt +++ b/feature/registration/src/main/java/org/signal/registration/RegistrationDependencies.kt @@ -16,8 +16,7 @@ import org.signal.registration.util.SensitiveLog * the actual app would just pass null. * @param debugLogCallback Callback to launch the debug log viewer. The actual app provides the real implementation. * @param proxyConfigCallback Callback to launch the proxy configuration settings. The actual app provides the real implementation. - * @param contactSupportCallback Callback to let the user contact support, using the provided email subject. The actual app provides the real - * implementation. + * @param contactSupportController Lets the user contact support, optionally attaching a debug log. The actual app provides the real implementation. */ class RegistrationDependencies( val networkController: NetworkController, @@ -26,7 +25,7 @@ class RegistrationDependencies( val sensitiveLogger: Log.Logger?, val debugLogCallback: ((Context) -> Unit)?, val proxyConfigCallback: ((Context) -> Unit)?, - val contactSupportCallback: ((Context, subject: String) -> Unit)? + val contactSupportController: ContactSupportController? ) { companion object { lateinit var dependencies: RegistrationDependencies diff --git a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryForRegistrationLockViewModel.kt b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryForRegistrationLockViewModel.kt index bdc81b594f..350ecdc2ef 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryForRegistrationLockViewModel.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryForRegistrationLockViewModel.kt @@ -89,7 +89,8 @@ class PinEntryForRegistrationLockViewModel( is PinEntryScreenEvents.ToggleKeyboard, is PinEntryScreenEvents.NetworkErrorDialogDismissed, is PinEntryScreenEvents.RateLimitedDialogDismissed, - is PinEntryScreenEvents.UnknownErrorDialogDismissed -> { + is PinEntryScreenEvents.UnknownErrorDialogDismissed, + is PinEntryScreenEvents.DismissContactSupport -> { stateEmitter(PinEntryScreenEventHandler.applyEvent(state, event)) } } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryForSmsBypassViewModel.kt b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryForSmsBypassViewModel.kt index f324f99d91..551ae667e2 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryForSmsBypassViewModel.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryForSmsBypassViewModel.kt @@ -86,12 +86,15 @@ class PinEntryForSmsBypassViewModel( is PinEntryScreenEvents.Skip -> { handleSkip() } - is PinEntryScreenEvents.CreateNewPin, - is PinEntryScreenEvents.ContactSupport -> Unit + is PinEntryScreenEvents.CreateNewPin -> Unit + is PinEntryScreenEvents.ContactSupport -> { + stateEmitter(state.copy(showContactSupportDialog = true)) + } is PinEntryScreenEvents.ToggleKeyboard, is PinEntryScreenEvents.NetworkErrorDialogDismissed, is PinEntryScreenEvents.RateLimitedDialogDismissed, - is PinEntryScreenEvents.UnknownErrorDialogDismissed -> { + is PinEntryScreenEvents.UnknownErrorDialogDismissed, + is PinEntryScreenEvents.DismissContactSupport -> { stateEmitter(PinEntryScreenEventHandler.applyEvent(state, event)) } } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryForSvrRestoreViewModel.kt b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryForSvrRestoreViewModel.kt index 3b2b4b748e..b040798120 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryForSvrRestoreViewModel.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryForSvrRestoreViewModel.kt @@ -87,12 +87,13 @@ class PinEntryForSvrRestoreViewModel( } is PinEntryScreenEvents.ContactSupport -> { Log.i(TAG, "[ContactSupport] User opted to contact support after no data was found.") - stateEmitter(state.copy(showNoDataToRestoreDialog = false)) + stateEmitter(state.copy(showNoDataToRestoreDialog = false, showContactSupportDialog = true)) } is PinEntryScreenEvents.ToggleKeyboard, is PinEntryScreenEvents.NetworkErrorDialogDismissed, is PinEntryScreenEvents.RateLimitedDialogDismissed, - is PinEntryScreenEvents.UnknownErrorDialogDismissed -> { + is PinEntryScreenEvents.UnknownErrorDialogDismissed, + is PinEntryScreenEvents.DismissContactSupport -> { stateEmitter(PinEntryScreenEventHandler.applyEvent(state, event)) } is PinEntryScreenEvents.ParentStateChanged -> { diff --git a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryScreen.kt b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryScreen.kt index 4616814394..e1548d2340 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryScreen.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryScreen.kt @@ -39,7 +39,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.pluralStringResource import androidx.compose.ui.res.stringResource @@ -55,11 +54,11 @@ import org.signal.core.ui.compose.Dialogs import org.signal.core.ui.compose.Previews import org.signal.core.ui.compose.SignalIcons import org.signal.registration.R -import org.signal.registration.RegistrationDependencies import org.signal.registration.screens.PinVisualTransformation import org.signal.registration.screens.RegistrationScaffold import org.signal.registration.screens.TwoPaneRegistrationScaffold import org.signal.registration.screens.attachDebugLogHelper +import org.signal.registration.screens.shared.ContactSupportDialog import org.signal.registration.test.TestTags /** @@ -72,13 +71,11 @@ fun PinEntryScreen( onEvent: (PinEntryScreenEvents) -> Unit, modifier: Modifier = Modifier ) { - val context = LocalContext.current var pin by rememberSaveable { mutableStateOf("") } var showSkipDialog by rememberSaveable { mutableStateOf(false) } val focusRequester = remember { FocusRequester() } val canSubmitPin = pin.isNotEmpty() - val supportEmailSubject = stringResource(R.string.PinEntryScreen__contact_support_email_subject) - val onContactSupport: () -> Unit = { RegistrationDependencies.get().contactSupportCallback?.invoke(context, supportEmailSubject) } + val onContactSupport: () -> Unit = { onEvent(PinEntryScreenEvents.ContactSupport) } when (val params = RegistrationScaffold.rememberLayoutParams()) { is RegistrationScaffold.Params.OnePane -> OnePaneLayout( @@ -151,10 +148,7 @@ fun PinEntryScreen( confirm = stringResource(R.string.PinEntryScreen__create_new_pin), dismiss = stringResource(R.string.PinEntryScreen__contact_support), onConfirm = { onEvent(PinEntryScreenEvents.CreateNewPin) }, - onDeny = { - onContactSupport() - onEvent(PinEntryScreenEvents.ContactSupport) - }, + onDeny = { onEvent(PinEntryScreenEvents.ContactSupport) }, onDismissRequest = { onEvent(PinEntryScreenEvents.ContactSupport) }, properties = DialogProperties( dismissOnBackPress = false, @@ -163,6 +157,14 @@ fun PinEntryScreen( ) } + if (state.showContactSupportDialog) { + ContactSupportDialog( + subject = R.string.PinEntryScreen__contact_support_email_subject, + filter = R.string.PinEntryScreen__contact_support_email_filter, + onDismiss = { onEvent(PinEntryScreenEvents.DismissContactSupport) } + ) + } + // autofocus PIN field on initial composition LaunchedEffect(Unit) { focusRequester.requestFocus() diff --git a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryScreenEventHandler.kt b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryScreenEventHandler.kt index 32104921a3..2cd5484aa8 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryScreenEventHandler.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryScreenEventHandler.kt @@ -13,6 +13,7 @@ object PinEntryScreenEventHandler { PinEntryScreenEvents.NetworkErrorDialogDismissed -> state.copy(dialogs = state.dialogs.copy(networkError = false)) PinEntryScreenEvents.RateLimitedDialogDismissed -> state.copy(dialogs = state.dialogs.copy(rateLimitedRetryAfter = null)) PinEntryScreenEvents.UnknownErrorDialogDismissed -> state.copy(dialogs = state.dialogs.copy(unknownError = false)) + PinEntryScreenEvents.DismissContactSupport -> state.copy(showContactSupportDialog = false) else -> throw UnsupportedOperationException("This even is not handled generically!") } } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryScreenEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryScreenEvents.kt index 051e68bd46..0bcf4849a3 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryScreenEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryScreenEvents.kt @@ -27,4 +27,5 @@ sealed class PinEntryScreenEvents { data object Skip : PinEntryScreenEvents() data object CreateNewPin : PinEntryScreenEvents() data object ContactSupport : PinEntryScreenEvents() + data object DismissContactSupport : PinEntryScreenEvents() } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryState.kt b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryState.kt index 90ae92fd2f..596f95bf51 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryState.kt @@ -13,6 +13,7 @@ data class PinEntryState( val isAlphanumericKeyboard: Boolean = false, val loading: Boolean = false, val showNoDataToRestoreDialog: Boolean = false, + val showContactSupportDialog: Boolean = false, val triesRemaining: Int? = null, /** True when the last wrong PIN the user entered matched the code they used to verify their phone number. */ val enteredVerificationCode: Boolean = false, diff --git a/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreScreen.kt b/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreScreen.kt index 5e2920dc8e..27fbc7d40a 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreScreen.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreScreen.kt @@ -43,11 +43,11 @@ import org.signal.core.ui.compose.Previews import org.signal.core.ui.compose.SignalIcons import org.signal.core.ui.compose.theme.SignalTheme import org.signal.registration.R -import org.signal.registration.RegistrationDependencies import org.signal.registration.screens.OnePaneRegistrationScaffold import org.signal.registration.screens.RegistrationScaffold import org.signal.registration.screens.TwoPaneRegistrationScaffold import org.signal.registration.screens.attachDebugLogHelper +import org.signal.registration.screens.shared.ContactSupportDialog import org.signal.registration.screens.shared.RestoreProgressDialog import org.signal.registration.test.TestTags import java.util.Date @@ -300,8 +300,13 @@ private fun RestoreStateDialogs( state: RemoteBackupRestoreState, onEvent: (RemoteBackupRestoreScreenEvents) -> Unit ) { - val context = LocalContext.current - val contactSupportEmailSubject = stringResource(R.string.RemoteRestoreScreen__contact_support_email_subject) + if (state.showContactSupportDialog) { + ContactSupportDialog( + subject = R.string.RemoteRestoreScreen__contact_support_email_subject, + filter = R.string.RemoteRestoreScreen__contact_support_email_filter, + onDismiss = { onEvent(RemoteBackupRestoreScreenEvents.DismissContactSupport) } + ) + } when (state.restoreState) { RemoteBackupRestoreState.RestoreState.None -> Unit @@ -338,7 +343,7 @@ private fun RestoreStateDialogs( confirm = stringResource(R.string.RemoteRestoreScreen__contact_support), dismiss = stringResource(android.R.string.ok), onConfirm = { - RegistrationDependencies.get().contactSupportCallback?.invoke(context, contactSupportEmailSubject) + onEvent(RemoteBackupRestoreScreenEvents.ContactSupport) onEvent(RemoteBackupRestoreScreenEvents.DismissError) }, onDismiss = { onEvent(RemoteBackupRestoreScreenEvents.DismissError) } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreScreenEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreScreenEvents.kt index ea762522ed..5c887e8ffb 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreScreenEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreScreenEvents.kt @@ -13,4 +13,8 @@ sealed class RemoteBackupRestoreScreenEvents { data object Cancel : RemoteBackupRestoreScreenEvents() data object DismissError : RemoteBackupRestoreScreenEvents() + + data object ContactSupport : RemoteBackupRestoreScreenEvents() + + data object DismissContactSupport : RemoteBackupRestoreScreenEvents() } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreState.kt b/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreState.kt index e23f282d9a..a7687ada6a 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreState.kt @@ -16,10 +16,11 @@ data class RemoteBackupRestoreState( val backupSize: Long = 0, val restoreState: RestoreState = RestoreState.None, val restoreProgress: RestoreProgress? = null, - val loadAttempts: Int = 0 + val loadAttempts: Int = 0, + val showContactSupportDialog: Boolean = false ) { - override fun toString(): String = "RemoteBackupRestoreState(aep=${aep.displayValue.censor()}, loadState=$loadState, backupTime=$backupTime, backupSize=$backupSize, restoreState=$restoreState, restoreProgress=$restoreProgress, loadAttempts=$loadAttempts)" + override fun toString(): String = "RemoteBackupRestoreState(aep=${aep.displayValue.censor()}, loadState=$loadState, backupTime=$backupTime, backupSize=$backupSize, restoreState=$restoreState, restoreProgress=$restoreProgress, loadAttempts=$loadAttempts, showContactSupportDialog=$showContactSupportDialog)" enum class LoadState { Loading, diff --git a/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreViewModel.kt b/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreViewModel.kt index addb83cb59..ae4fdbaf4e 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreViewModel.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreViewModel.kt @@ -82,6 +82,12 @@ class RemoteBackupRestoreViewModel( is RemoteBackupRestoreScreenEvents.DismissError -> { stateEmitter(state.copy(restoreState = RemoteBackupRestoreState.RestoreState.None, restoreProgress = null)) } + is RemoteBackupRestoreScreenEvents.ContactSupport -> { + stateEmitter(state.copy(showContactSupportDialog = true)) + } + is RemoteBackupRestoreScreenEvents.DismissContactSupport -> { + stateEmitter(state.copy(showContactSupportDialog = false)) + } } } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/shared/ContactSupportDialog.kt b/feature/registration/src/main/java/org/signal/registration/screens/shared/ContactSupportDialog.kt new file mode 100644 index 0000000000..1d7de10833 --- /dev/null +++ b/feature/registration/src/main/java/org/signal/registration/screens/shared/ContactSupportDialog.kt @@ -0,0 +1,90 @@ +/* + * Copyright 2026 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.signal.registration.screens.shared + +import androidx.annotation.StringRes +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.lifecycle.viewmodel.compose.viewModel +import org.signal.core.ui.compose.DayNightPreviews +import org.signal.core.ui.compose.Dialogs +import org.signal.core.ui.compose.Previews +import org.signal.registration.R +import org.signal.registration.RegistrationDependencies + +/** + * Three-option contact support dialog. Mirrors the app-module ContactSupportDialog. + */ +@Composable +fun ContactSupportDialog( + state: ContactSupportState, + onEvent: (ContactSupportEvents) -> Unit +) { + if (state.showAsProgress) { + Dialogs.IndeterminateProgressDialog() + } else { + Dialogs.AdvancedAlertDialog( + title = stringResource(R.string.ContactSupportDialog__submit_debug_log), + body = stringResource(R.string.ContactSupportDialog__your_debug_logs), + positive = stringResource(R.string.ContactSupportDialog__submit_with_debug_log), + onPositive = { onEvent(ContactSupportEvents.SubmitWithDebugLog) }, + neutral = stringResource(R.string.ContactSupportDialog__submit_without_debug_log), + onNeutral = { onEvent(ContactSupportEvents.SubmitWithoutDebugLog) }, + negative = stringResource(android.R.string.cancel), + onNegative = { onEvent(ContactSupportEvents.Cancel) } + ) + } +} + +@Composable +fun ContactSupportDialog( + @StringRes subject: Int, + @StringRes filter: Int, + onDismiss: () -> Unit +) { + val controller = RegistrationDependencies.get().contactSupportController ?: throw AssertionError("Missing support controller") + val viewModel: ContactSupportViewModel = viewModel(factory = ContactSupportViewModel.Factory(controller)) + val state by viewModel.state.collectAsStateWithLifecycle() + + val context = LocalContext.current + val subjectString = stringResource(subject) + val filterString = stringResource(filter) + + LaunchedEffect(state.sendEmail) { + if (state.sendEmail) { + controller.sendSupportEmail(context, subjectString, filterString, state.debugLogUrl) + viewModel.onEvent(ContactSupportEvents.Cancel) + onDismiss() + } + } + + ContactSupportDialog( + state = state, + onEvent = { event -> + if (event is ContactSupportEvents.Cancel) { + viewModel.onEvent(ContactSupportEvents.Cancel) + onDismiss() + } else { + viewModel.onEvent(event) + } + } + ) +} + +@DayNightPreviews +@Composable +private fun ContactSupportDialogPreview() { + Previews.Preview { + ContactSupportDialog( + state = ContactSupportState(), + onEvent = {} + ) + } +} diff --git a/feature/registration/src/main/java/org/signal/registration/screens/shared/ContactSupportEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/shared/ContactSupportEvents.kt new file mode 100644 index 0000000000..ce511421e9 --- /dev/null +++ b/feature/registration/src/main/java/org/signal/registration/screens/shared/ContactSupportEvents.kt @@ -0,0 +1,7 @@ +package org.signal.registration.screens.shared + +sealed class ContactSupportEvents { + data object SubmitWithDebugLog : ContactSupportEvents() + data object SubmitWithoutDebugLog : ContactSupportEvents() + data object Cancel : ContactSupportEvents() +} diff --git a/feature/registration/src/main/java/org/signal/registration/screens/shared/ContactSupportState.kt b/feature/registration/src/main/java/org/signal/registration/screens/shared/ContactSupportState.kt new file mode 100644 index 0000000000..850ee0b088 --- /dev/null +++ b/feature/registration/src/main/java/org/signal/registration/screens/shared/ContactSupportState.kt @@ -0,0 +1,7 @@ +package org.signal.registration.screens.shared + +data class ContactSupportState( + val showAsProgress: Boolean = false, + val sendEmail: Boolean = false, + val debugLogUrl: String? = null +) diff --git a/feature/registration/src/main/java/org/signal/registration/screens/shared/ContactSupportViewModel.kt b/feature/registration/src/main/java/org/signal/registration/screens/shared/ContactSupportViewModel.kt new file mode 100644 index 0000000000..2c926c809a --- /dev/null +++ b/feature/registration/src/main/java/org/signal/registration/screens/shared/ContactSupportViewModel.kt @@ -0,0 +1,48 @@ +package org.signal.registration.screens.shared + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import org.signal.core.ui.compose.EventDrivenViewModel +import org.signal.core.util.logging.Log +import org.signal.registration.ContactSupportController + +/** + * Intended to be used to drive [ContactSupportDialog] + */ +class ContactSupportViewModel( + private val controller: ContactSupportController +) : EventDrivenViewModel(TAG) { + + companion object { + private val TAG = Log.tag(ContactSupportViewModel::class) + } + + private val _state = MutableStateFlow(ContactSupportState()) + val state: StateFlow = _state.asStateFlow() + + override suspend fun processEvent(event: ContactSupportEvents) { + when (event) { + is ContactSupportEvents.SubmitWithDebugLog -> submitWithLogs() + is ContactSupportEvents.SubmitWithoutDebugLog -> _state.value = ContactSupportState(sendEmail = true) + is ContactSupportEvents.Cancel -> _state.value = ContactSupportState() + } + } + + private suspend fun submitWithLogs() { + _state.value = _state.value.copy(showAsProgress = true) + val debugLogUrl = controller.uploadDebugLog() + if (debugLogUrl == null) { + Log.w(TAG, "Failed to upload a debug log. Continuing without one.") + } + _state.value = ContactSupportState(sendEmail = true, debugLogUrl = debugLogUrl) + } + + class Factory(private val controller: ContactSupportController) : ViewModelProvider.Factory { + override fun create(modelClass: Class): T { + return modelClass.cast(ContactSupportViewModel(controller)) as T + } + } +} diff --git a/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/ContactSupportBottomSheet.kt b/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/ContactSupportBottomSheet.kt index b57e0fc4f5..155f9362c3 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/ContactSupportBottomSheet.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/ContactSupportBottomSheet.kt @@ -34,7 +34,6 @@ import org.signal.core.ui.compose.Previews import org.signal.core.ui.compose.dismissWithAnimation import org.signal.core.util.LinkActions import org.signal.registration.R -import org.signal.registration.RegistrationDependencies /** * Bottom sheet shown during registration when the user is having trouble entering their verification code. Offers @@ -42,11 +41,13 @@ import org.signal.registration.RegistrationDependencies */ @OptIn(ExperimentalMaterial3Api::class) @Composable -fun ContactSupportBottomSheet(onDismiss: () -> Unit) { +fun ContactSupportBottomSheet( + onContactSupport: () -> Unit, + onDismiss: () -> Unit +) { val sheetState = rememberModalBottomSheetState() val scope = rememberCoroutineScope() val context = LocalContext.current - val supportEmailSubject = stringResource(R.string.VerificationCodeScreen__contact_support_email_subject) val supportCenterUrl = stringResource(R.string.VerificationCodeScreen__support_center_url) BottomSheets.BottomSheet( @@ -60,7 +61,10 @@ fun ContactSupportBottomSheet(onDismiss: () -> Unit) { } }, onContactSupportClick = { - RegistrationDependencies.get().contactSupportCallback?.invoke(context, supportEmailSubject) + sheetState.dismissWithAnimation(scope) { + onDismiss() + onContactSupport() + } } ) } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeScreen.kt b/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeScreen.kt index 61c03a1cc3..d200429d52 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeScreen.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeScreen.kt @@ -61,6 +61,7 @@ import org.signal.registration.screens.OnePaneRegistrationScaffold import org.signal.registration.screens.RegistrationScaffold import org.signal.registration.screens.TwoPaneRegistrationScaffold import org.signal.registration.screens.attachDebugLogHelper +import org.signal.registration.screens.shared.ContactSupportDialog import org.signal.registration.test.TestTags import kotlin.time.Duration.Companion.seconds @@ -123,10 +124,19 @@ fun VerificationCodeScreen( if (state.showContactSupportSheet) { ContactSupportBottomSheet( + onContactSupport = { onEvent(VerificationCodeScreenEvents.ContactSupportDialog) }, onDismiss = { onEvent(VerificationCodeScreenEvents.DismissContactSupport) } ) } + if (state.showContactSupportDialog) { + ContactSupportDialog( + subject = R.string.VerificationCodeScreen__contact_support_email_subject, + filter = R.string.VerificationCodeScreen__contact_support_email_filter, + onDismiss = { onEvent(VerificationCodeScreenEvents.DismissContactSupportDialog) } + ) + } + Scaffold( snackbarHost = { SnackbarHost(snackbarHostState) }, modifier = modifier diff --git a/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeScreenEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeScreenEvents.kt index 5317a0234b..cf256657bc 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeScreenEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeScreenEvents.kt @@ -45,6 +45,10 @@ sealed class VerificationCodeScreenEvents { data object DismissContactSupport : VerificationCodeScreenEvents() + data object ContactSupportDialog : VerificationCodeScreenEvents() + + data object DismissContactSupportDialog : VerificationCodeScreenEvents() + /** The network error snackbar was shown and dismissed. */ data object NetworkErrorSnackbarDismissed : VerificationCodeScreenEvents() diff --git a/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeState.kt b/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeState.kt index 824266dd58..95109f6c1e 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeState.kt @@ -20,10 +20,11 @@ data class VerificationCodeState( val digits: List = List(CODE_LENGTH) { "" }, val focusedDigitIndex: Int = 0, val showContactSupportSheet: Boolean = false, + val showContactSupportDialog: Boolean = false, val snackbars: Snackbars = Snackbars(), val dialogs: Dialogs = Dialogs() ) { - override fun toString(): String = "VerificationCodeState(sessionMetadata=$sessionMetadata, e164=$e164, isSubmittingCode=$isSubmittingCode, rateLimits=$rateLimits, incorrectCodeAttempts=$incorrectCodeAttempts, autoFillCode=${autoFillCode?.let { "present" }}, digitsEntered=${digits.count { it.isNotEmpty() }}, focusedDigitIndex=$focusedDigitIndex, showContactSupportSheet=$showContactSupportSheet, snackbars=$snackbars, dialogs=$dialogs)" + override fun toString(): String = "VerificationCodeState(sessionMetadata=$sessionMetadata, e164=$e164, isSubmittingCode=$isSubmittingCode, rateLimits=$rateLimits, incorrectCodeAttempts=$incorrectCodeAttempts, autoFillCode=${autoFillCode?.let { "present" }}, digitsEntered=${digits.count { it.isNotEmpty() }}, focusedDigitIndex=$focusedDigitIndex, showContactSupportSheet=$showContactSupportSheet, showContactSupportDialog=$showContactSupportDialog, snackbars=$snackbars, dialogs=$dialogs)" /** * The full code as currently entered. Only meaningful when [isComplete] is true. diff --git a/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeViewModel.kt b/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeViewModel.kt index 16d355da5b..45e5177805 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeViewModel.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeViewModel.kt @@ -136,6 +136,8 @@ class VerificationCodeViewModel( is VerificationCodeScreenEvents.CallMe -> applyResendCode(state, VerificationCodeTransport.VOICE) is VerificationCodeScreenEvents.HavingTrouble -> state.copy(showContactSupportSheet = true) is VerificationCodeScreenEvents.DismissContactSupport -> state.copy(showContactSupportSheet = false) + is VerificationCodeScreenEvents.ContactSupportDialog -> state.copy(showContactSupportDialog = true) + is VerificationCodeScreenEvents.DismissContactSupportDialog -> state.copy(showContactSupportDialog = false) is VerificationCodeScreenEvents.NetworkErrorSnackbarDismissed -> state.copy(snackbars = state.snackbars.copy(networkError = false)) is VerificationCodeScreenEvents.UnknownErrorSnackbarDismissed -> state.copy(snackbars = state.snackbars.copy(unknownError = false)) is VerificationCodeScreenEvents.RateLimitedSnackbarDismissed -> state.copy(snackbars = state.snackbars.copy(rateLimitedRetryAfter = null)) diff --git a/feature/registration/src/main/res/values-af/strings.xml b/feature/registration/src/main/res/values-af/strings.xml index 324d138ad1..b98fad2c3c 100644 --- a/feature/registration/src/main/res/values-af/strings.xml +++ b/feature/registration/src/main/res/values-af/strings.xml @@ -591,4 +591,13 @@ Kon nie captcha laai nie Kanselleer + + + Dien ontfout-log in? + + Jou ontfout-logs sal ons help om jou probleem vinniger op te los. Die indiening van jou logs is opsioneel. + + Dien met ontfout-log in + + Dien sonder ontfout-log in diff --git a/feature/registration/src/main/res/values-ar/strings.xml b/feature/registration/src/main/res/values-ar/strings.xml index 210668ad49..ac34ae47bd 100644 --- a/feature/registration/src/main/res/values-ar/strings.xml +++ b/feature/registration/src/main/res/values-ar/strings.xml @@ -599,4 +599,13 @@ تعذَّر تحميل اختبار التحقُّق إلغاء + + + هل ترغبُ بإرسال سجل الأخطاء؟ + + تساعدنا سجلات الأخطاء في استكشاف مشاكلك وإصلاحها في أسرع وقت. إرسال سجلاتك إلينا أمر اختياري. + + إرسال مع سجل الأخطاء + + إرسال بدون سجل الأخطاء diff --git a/feature/registration/src/main/res/values-az/strings.xml b/feature/registration/src/main/res/values-az/strings.xml index adbe8db93a..8d8e802904 100644 --- a/feature/registration/src/main/res/values-az/strings.xml +++ b/feature/registration/src/main/res/values-az/strings.xml @@ -591,4 +591,13 @@ Captcha yüklənmədi Ləğv et + + + Sazlama jurnalı göndərilsin? + + Sazlama jurnallarınız qarşılaşdığınız problemi daha tez həll etməyimizə kömək edir. Jurnallarınızın təqdim olunması öz seçiminizdən asılıdır. + + Sazlama jurnalı ilə təqdim edin + + Sazlama jurnalı olmadan təqdim edin diff --git a/feature/registration/src/main/res/values-be/strings.xml b/feature/registration/src/main/res/values-be/strings.xml index dd4c7668d4..fbed509b31 100644 --- a/feature/registration/src/main/res/values-be/strings.xml +++ b/feature/registration/src/main/res/values-be/strings.xml @@ -595,4 +595,13 @@ Не атрымалася загрузіць капчу Скасаваць + + + Адправіць журнал адладкі? + + З вашымі журналамі адладкі мы хутчэй выправім вашу праблему. Вам неабавязкова адпраўляць вашы журналы. + + Адправіць з журналам адладкі + + Адправіць без журнала адладкі diff --git a/feature/registration/src/main/res/values-bg/strings.xml b/feature/registration/src/main/res/values-bg/strings.xml index 46fed63457..d4d162cb2f 100644 --- a/feature/registration/src/main/res/values-bg/strings.xml +++ b/feature/registration/src/main/res/values-bg/strings.xml @@ -591,4 +591,13 @@ Неуспешно зареждане на captcha Отказ + + + Желаете ли да изпратите доклад за дебъг? + + Вашите доклади за дебъг ще ни помогнат по-бързо да отстраним неизправностите, свързани с вашия проблем. Изпращането на докладите ви е по желание. + + Изпращане с доклад за дебъг + + Изпращане без доклад за дебъг diff --git a/feature/registration/src/main/res/values-bn/strings.xml b/feature/registration/src/main/res/values-bn/strings.xml index 1c5fc3409a..f2c944b3d5 100644 --- a/feature/registration/src/main/res/values-bn/strings.xml +++ b/feature/registration/src/main/res/values-bn/strings.xml @@ -591,4 +591,13 @@ ক্যাপচা লোড করা যায়নি বাতিল করুন + + + ডিবাগ লগ জমা দেবেন? + + আপনার ডিবাগ লগগুলি আমাদেরকে সমস্যা দ্রুত সমাধানে সহায়তা করবে। আপনার লগ জমা দেওয়া বাধ্যতামূলক নয়। + + ডিবাগ লগ সহ জমা দিন + + ডিবাগ লগ ছাড়াই জমা দিন diff --git a/feature/registration/src/main/res/values-bs/strings.xml b/feature/registration/src/main/res/values-bs/strings.xml index 60572c9e5f..b2aea398ef 100644 --- a/feature/registration/src/main/res/values-bs/strings.xml +++ b/feature/registration/src/main/res/values-bs/strings.xml @@ -595,4 +595,13 @@ Učitavanje captcha koda nije uspjelo Otkaži + + + Pošalji zapisnik o otklanjanju grešaka? + + Vaši zapisnici o otklanjanju grešaka će nam pomoći da brže dijagnosticiramo problem. Slanje zapisnika je opcionalno. + + Pošaljite sa zapisnikom o otklanjanju grešaka + + Pošaljite bez zapisnika o otklanjanju grešaka diff --git a/feature/registration/src/main/res/values-ca/strings.xml b/feature/registration/src/main/res/values-ca/strings.xml index 4cc4736b40..60609929e0 100644 --- a/feature/registration/src/main/res/values-ca/strings.xml +++ b/feature/registration/src/main/res/values-ca/strings.xml @@ -591,4 +591,13 @@ No s\'ha pogut carregar el captcha Cancel·lar + + + Vols enviar un registre de depuració? + + Els vostres registres de depuració ens ajudaran a solucionar el problema més de pressa. Enviar-nos-els és opcional. + + Envia-ho amb el registre de depuració + + Envia-ho sense el registre de depuració diff --git a/feature/registration/src/main/res/values-cs/strings.xml b/feature/registration/src/main/res/values-cs/strings.xml index d78596f889..fc1fab43d3 100644 --- a/feature/registration/src/main/res/values-cs/strings.xml +++ b/feature/registration/src/main/res/values-cs/strings.xml @@ -595,4 +595,13 @@ Nepodařilo se načíst kontrolu captcha Zrušit + + + Odeslat protokol ladění? + + Protokoly ladění nám pomohou rychleji vyřešit váš problém. Odeslání protokolů je nepovinné. + + Odeslat s protokolem ladění + + Odeslat bez protokolu ladění diff --git a/feature/registration/src/main/res/values-da/strings.xml b/feature/registration/src/main/res/values-da/strings.xml index 3080c62a6e..ed456e8129 100644 --- a/feature/registration/src/main/res/values-da/strings.xml +++ b/feature/registration/src/main/res/values-da/strings.xml @@ -591,4 +591,13 @@ Captchaen kunne ikke indlæses Annuller + + + Vil du indsende fejlsøgningslog? + + Dine fejlsøgningslogs hjælper os med at fejlsøge hurtigere. Det er frivilligt om du ønsker at vedhæfte dem. + + Send med fejlsøgningslog + + Send uden fejlsøgningslog diff --git a/feature/registration/src/main/res/values-de/strings.xml b/feature/registration/src/main/res/values-de/strings.xml index 1d6dbcfbde..ba0dbc9d08 100644 --- a/feature/registration/src/main/res/values-de/strings.xml +++ b/feature/registration/src/main/res/values-de/strings.xml @@ -591,4 +591,13 @@ Captcha konnte nicht geladen werden Abbrechen + + + Diagnoseprotokoll übermitteln? + + Deine Diagnoseprotokolle helfen uns, dein Problem schneller zu lösen. Das Übermitteln deiner Protokolle ist optional. + + Mit Diagnoseprotokoll übermitteln + + Ohne Diagnoseprotokoll übermitteln diff --git a/feature/registration/src/main/res/values-el/strings.xml b/feature/registration/src/main/res/values-el/strings.xml index 954c80fda5..dd0b15e868 100644 --- a/feature/registration/src/main/res/values-el/strings.xml +++ b/feature/registration/src/main/res/values-el/strings.xml @@ -591,4 +591,13 @@ Αποτυχία φόρτωσης captcha Ακύρωση + + + Αποστολή αρχείου καταγραφής αποσφαλμάτωσης; + + Τα αρχεία καταγραφής θα μας βοηθήσουν στην γρηγορότερη επίλυση του προβλήματος. Η υποβολή των αρχείων είναι προαιρετική. + + Υποβολή με αρχείο καταγραφής + + Υποβολή χωρίς αρχείο καταγραφής diff --git a/feature/registration/src/main/res/values-es/strings.xml b/feature/registration/src/main/res/values-es/strings.xml index 0742e7a10c..7e11cf01a9 100644 --- a/feature/registration/src/main/res/values-es/strings.xml +++ b/feature/registration/src/main/res/values-es/strings.xml @@ -591,4 +591,13 @@ No se ha podido cargar el captcha Cancelar + + + ¿Enviar registro de depuración? + + El registro de depuración nos ayudará a solucionar tu problema más rápido. Enviar tu registro es opcional. + + Enviar con registro de depuración + + Enviar sin registro de depuración diff --git a/feature/registration/src/main/res/values-et/strings.xml b/feature/registration/src/main/res/values-et/strings.xml index 37cd39e772..8a2e15da9e 100644 --- a/feature/registration/src/main/res/values-et/strings.xml +++ b/feature/registration/src/main/res/values-et/strings.xml @@ -591,4 +591,13 @@ Captcha laadimine ebaõnnestus Loobu + + + Kas saata silumislogi? + + Sinu silumislogid aitavad meil su probleemi kiiremini lahendada. Logide saatmine on valikuline. + + Postita koos silumislogiga + + Postita ilma silumislogita diff --git a/feature/registration/src/main/res/values-eu/strings.xml b/feature/registration/src/main/res/values-eu/strings.xml index ea0baa0522..9dd1603056 100644 --- a/feature/registration/src/main/res/values-eu/strings.xml +++ b/feature/registration/src/main/res/values-eu/strings.xml @@ -591,4 +591,13 @@ Ezin izan da kargatu captcha Utzi + + + Arazketa-erregistroa bidali nahi duzu? + + Arazketa-erregistroarekin, zure arazoa bizkorrago konpondu ahalko dugu. Erregistroa bidaltzea hautazkoa da. + + Bidali arazketa-erregistroarekin + + Bidali arazketa-erregistrorik gabe diff --git a/feature/registration/src/main/res/values-fa/strings.xml b/feature/registration/src/main/res/values-fa/strings.xml index 78a6796bc4..257900e206 100644 --- a/feature/registration/src/main/res/values-fa/strings.xml +++ b/feature/registration/src/main/res/values-fa/strings.xml @@ -591,4 +591,13 @@ کپچا بارگیری نشد لغو + + + گزارش اشکال‌زدایی ارسال شود؟ + + گزارش‌های اشکال‌زدایی شما به ما کمک خواهد کرد تا مشکل‌تان را سریع‌تر حل کنیم. ارسال این گزارش‌ها اختیاری است. + + ارسال با گزارش اشکال‌زدایی + + ارسال بدون گزارش اشکال‌زدایی diff --git a/feature/registration/src/main/res/values-fi/strings.xml b/feature/registration/src/main/res/values-fi/strings.xml index a88a11d16e..5a13aea78c 100644 --- a/feature/registration/src/main/res/values-fi/strings.xml +++ b/feature/registration/src/main/res/values-fi/strings.xml @@ -591,4 +591,13 @@ Captchan lataaminen epäonnistui Peruuta + + + Lähetetäänkö vianetsintäloki? + + Voimme selvittää vian nopeammin virheenkorjauslokisi avulla. Lokien lähettäminen on valinnaista. + + Lähetä virheenkorjauslokilla + + Lähetä ilman virheenkorjauslokia diff --git a/feature/registration/src/main/res/values-fr/strings.xml b/feature/registration/src/main/res/values-fr/strings.xml index 7fa6df9cb9..f7270b13b6 100644 --- a/feature/registration/src/main/res/values-fr/strings.xml +++ b/feature/registration/src/main/res/values-fr/strings.xml @@ -591,4 +591,13 @@ Impossible de charger le captcha Annuler + + + Envoyer le journal de débogage ? + + Les journaux de débogage nous permettent d\'accélérer la résolution des problèmes. Leur envoi est facultatif. + + Envoyer avec journal de débogage + + Envoyer sans journal de débogage diff --git a/feature/registration/src/main/res/values-ga/strings.xml b/feature/registration/src/main/res/values-ga/strings.xml index 5449c83505..7c56082f34 100644 --- a/feature/registration/src/main/res/values-ga/strings.xml +++ b/feature/registration/src/main/res/values-ga/strings.xml @@ -597,4 +597,13 @@ Theip ar lódáil CAPTCHA Cuir ar ceal + + + Cuir isteach loga dífhabhtaithe? + + Cabhróidh na logaí dífhabhtaithe linn d\'fhadhb a réiteach níos sciobtha. É sin ráite, níl siad riachtanach. + + Seol loga dífhabhtaithe isteach freisin + + Ná seol loga dífhabhtaithe isteach freisin diff --git a/feature/registration/src/main/res/values-gl/strings.xml b/feature/registration/src/main/res/values-gl/strings.xml index 0098d33014..d2822d7c5e 100644 --- a/feature/registration/src/main/res/values-gl/strings.xml +++ b/feature/registration/src/main/res/values-gl/strings.xml @@ -591,4 +591,13 @@ Erro ao cargar o captcha Cancelar + + + Enviar rexistro de depuración? + + Os teus rexistros de depuración axúdannos a solucionar os problemas de forma máis rápida. Non é obrigatorio que envíes o rexistro. + + Enviar con rexistro de depuración + + Enviar sen rexistro de depuración diff --git a/feature/registration/src/main/res/values-gu/strings.xml b/feature/registration/src/main/res/values-gu/strings.xml index 9448a7cc0f..c7477484d3 100644 --- a/feature/registration/src/main/res/values-gu/strings.xml +++ b/feature/registration/src/main/res/values-gu/strings.xml @@ -591,4 +591,13 @@ કેપ્ચા લોડ કરવામાં નિષ્ફળ રદ કરો + + + ડીબગ લૉગ સબમિટ કરવો છે? + + તમારા ડીબગ લૉગ તમારી સમસ્યાને ઝડપથી નિવારણ કરવામાં મદદ કરશે. તમારા લૉગ સબમિટ કરવું વૈકલ્પિક છે. + + ડીબગ લૉગ સાથે સબમિટ કરો + + ડીબગ લૉગ વિના સબમિટ કરો diff --git a/feature/registration/src/main/res/values-hi/strings.xml b/feature/registration/src/main/res/values-hi/strings.xml index bc92d74e9b..f130ae1ec1 100644 --- a/feature/registration/src/main/res/values-hi/strings.xml +++ b/feature/registration/src/main/res/values-hi/strings.xml @@ -591,4 +591,13 @@ कैप्चा लोड नहीं हो सका कैंसिल करें + + + डीबग लॉग सबमिट करना है? + + आपके डीबग लाॅग से हमें आपकी समस्या तेज़ी से सुलझाने में मदद मिलेगी। लॉग सबमिट करना आपकी मर्ज़ी के ऊपर है। + + डीबग लाॅग के साथ सबमिट करें + + डीबग लाॅग के बिना सबमिट करें diff --git a/feature/registration/src/main/res/values-hr/strings.xml b/feature/registration/src/main/res/values-hr/strings.xml index ed83123174..2fa08d65fe 100644 --- a/feature/registration/src/main/res/values-hr/strings.xml +++ b/feature/registration/src/main/res/values-hr/strings.xml @@ -595,4 +595,13 @@ Učitavanje captcha provjere nije uspjelo Poništi + + + Želite li poslati zapisnik otklanjanja pogreške? + + Vaši zapisnici pogrešaka pomoći će nam da brže riješimo vaš problem. Slanje zapisnika nije obavezno. + + Pošalji sa zapisnikom pogreške + + Pošalji bez zapisnika pogreške diff --git a/feature/registration/src/main/res/values-hu/strings.xml b/feature/registration/src/main/res/values-hu/strings.xml index 2ca2ef1318..fadd12fc46 100644 --- a/feature/registration/src/main/res/values-hu/strings.xml +++ b/feature/registration/src/main/res/values-hu/strings.xml @@ -591,4 +591,13 @@ A captcha betöltése sikertelen Mégse + + + Hibanapló küldése? + + A hibanapló fájlok segítenek a hibák gyorsabb javításában. Beküldésük opcionális. + + Beküldés hibanaplóval együtt + + Beküldés hibanapló nélkül diff --git a/feature/registration/src/main/res/values-in/strings.xml b/feature/registration/src/main/res/values-in/strings.xml index 330d136002..408154dfd1 100644 --- a/feature/registration/src/main/res/values-in/strings.xml +++ b/feature/registration/src/main/res/values-in/strings.xml @@ -589,4 +589,13 @@ Gagal memuat captcha Batal + + + Kirim log debug? + + Kami dapat menangani masalah dengan lebih cepat jika Anda mengirimkan log debug (opsional). + + Kirimkan dengan log debug + + Kirim tanpa log debug diff --git a/feature/registration/src/main/res/values-it/strings.xml b/feature/registration/src/main/res/values-it/strings.xml index 6094652553..0a0f206a0c 100644 --- a/feature/registration/src/main/res/values-it/strings.xml +++ b/feature/registration/src/main/res/values-it/strings.xml @@ -591,4 +591,13 @@ Impossibile caricare il CAPTCHA Annulla + + + Vuoi inviarci un log di debug? + + I log di debug ci aiutano a risolvere il problema più rapidamente. L\'invio dei log è facoltativo. + + Invia con log di debug + + Invia senza log di debug diff --git a/feature/registration/src/main/res/values-iw/strings.xml b/feature/registration/src/main/res/values-iw/strings.xml index 855fe2af76..ab4ee8fde0 100644 --- a/feature/registration/src/main/res/values-iw/strings.xml +++ b/feature/registration/src/main/res/values-iw/strings.xml @@ -595,4 +595,13 @@ טעינה ׳אני לא רובוט׳ נכשלה ביטול + + + רוצה להגיש יומן ניפוי באגים? + + יומני ניפוי הבאגים שלך יעזרו לנו לפתור מהר יותר את הסוגייה שלך. הגשת יומנים היא רשות. + + שליחה עם יומן ניפוי באגים + + שליחה בלי יומן ניפוי באגים diff --git a/feature/registration/src/main/res/values-ja/strings.xml b/feature/registration/src/main/res/values-ja/strings.xml index 506f43345d..71ac4817ee 100644 --- a/feature/registration/src/main/res/values-ja/strings.xml +++ b/feature/registration/src/main/res/values-ja/strings.xml @@ -589,4 +589,13 @@ キャプチャの読み込みに失敗しました キャンセル + + + デバッグログを送信しますか? + + デバッグログがあると、問題の早い解決に役立ちます。ログの提出は任意です。 + + デバッグログを添付して送信する + + デバッグログなしで送信する diff --git a/feature/registration/src/main/res/values-ka/strings.xml b/feature/registration/src/main/res/values-ka/strings.xml index 9065dc6a04..b0d0623e75 100644 --- a/feature/registration/src/main/res/values-ka/strings.xml +++ b/feature/registration/src/main/res/values-ka/strings.xml @@ -591,4 +591,13 @@ Captcha-ს ჩატვირთვა ვერ მოხერხდა გაუქმება + + + გსურს გაუმართაობის რეესტრის ატვირთვა? + + გაუმართაობის რეესტრში ატვირთვა დაგვეხმარება, შენი პრობლემა უფრო სწრაფად მოვაგვაროთ. რეესტრში ატვირთვა არჩევითია. + + გაუმართაობის რეესტრით ატვირთვა + + გაუმართაობის რეესტრის გარეშე ატვირთვა diff --git a/feature/registration/src/main/res/values-kk/strings.xml b/feature/registration/src/main/res/values-kk/strings.xml index a9fb4c0afe..8e113018b6 100644 --- a/feature/registration/src/main/res/values-kk/strings.xml +++ b/feature/registration/src/main/res/values-kk/strings.xml @@ -591,4 +591,13 @@ CAPTCHA жүктелмеді Бас тарту + + + Ақауларды түзету журналын жіберу керек пе? + + Ақауларды түзету журналдары ақауларды жылдам түзетуге мүмкіндік береді. Журналдарды жіберу міндетті емес. + + Ақауларды түзету журналын жіберу + + Ақауларды түзету журналын жібермеу diff --git a/feature/registration/src/main/res/values-km/strings.xml b/feature/registration/src/main/res/values-km/strings.xml index 41bcfcb41f..8dbadfdef7 100644 --- a/feature/registration/src/main/res/values-km/strings.xml +++ b/feature/registration/src/main/res/values-km/strings.xml @@ -589,4 +589,13 @@ មិនអាចផ្ទុក captcha បានទេ បោះបង់ + + + ដាក់បញ្ជូនកំណត់ត្រាបញ្ហា? + + កំណត់ត្រាបញ្ហារបស់អ្នកនឹងជួយយើងដោះស្រាយបញ្ហារបស់អ្នកឱ្យបានកាន់តែលឿន។ អ្នកមានជម្រើសដាក់ឬមិនដាក់បញ្ជូនកំណត់ត្រារបស់អ្នក។ + + ដាក់បញ្ជូនជាមួយកំណត់ត្រាបញ្ហា + + ដាក់បញ្ជូនដោយគ្មានកំណត់ត្រាបញ្ហា diff --git a/feature/registration/src/main/res/values-kn/strings.xml b/feature/registration/src/main/res/values-kn/strings.xml index 8464b9d458..68994a1421 100644 --- a/feature/registration/src/main/res/values-kn/strings.xml +++ b/feature/registration/src/main/res/values-kn/strings.xml @@ -591,4 +591,13 @@ ಕ್ಯಾಪ್ಚ ಲೋಡ್ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ ರದ್ದುಮಾಡಿ + + + ಡೀಬಗ್ ಲಾಗ್ ಸಲ್ಲಿಸಬೇಕೆ? + + ನಿಮ್ಮ ಡೀಬಗ್ ಲಾಗ್‌ಗಳು ನಿಮ್ಮ ಸಮಸ್ಯೆಯನ್ನು ವೇಗವಾಗಿ ಪರಿಹರಿಸಲು ನಮಗೆ ಸಹಾಯ ಮಾಡುತ್ತವೆ. ನಿಮ್ಮ ಲಾಗ್‌ಗಳನ್ನು ಸಲ್ಲಿಸುವುದು ಐಚ್ಛಿಕವಾಗಿದೆ. + + ಡೀಬಗ್ ಲಾಗ್ ಜೊತೆಗೆ ಸಲ್ಲಿಸಿ + + ಡೀಬಗ್ ಲಾಗ್ ಇಲ್ಲದೆಯೇ ಸಲ್ಲಿಸಿ diff --git a/feature/registration/src/main/res/values-ko/strings.xml b/feature/registration/src/main/res/values-ko/strings.xml index 385951e5ab..f43d4c04e9 100644 --- a/feature/registration/src/main/res/values-ko/strings.xml +++ b/feature/registration/src/main/res/values-ko/strings.xml @@ -589,4 +589,13 @@ CAPTCHA를 로드하지 못했습니다. 취소 + + + 디버그 로그를 제출할까요? + + 디버그 로그를 보내 문제 해결에 도움을 주실 수 있습니다. 로그 보내기는 선택 사항입니다. + + 디버그 로그와 함께 보내기 + + 디버그 로그를 제외하고 보내기 diff --git a/feature/registration/src/main/res/values-ky/strings.xml b/feature/registration/src/main/res/values-ky/strings.xml index 724abdd704..02e49cc312 100644 --- a/feature/registration/src/main/res/values-ky/strings.xml +++ b/feature/registration/src/main/res/values-ky/strings.xml @@ -591,4 +591,13 @@ Captcha жүктөлгөн жок Жок + + + Мүчүлүштүктөр журналын жөнөтөсүзбү? + + Мүчүлүштүктөрдү аныктоо таржымалдары аркылуу көйгөйлөрүңүздү тезирээк чечесиз. Кааласаңыз таржымалды жөнөтпөй деле койсоңуз болот. + + Мүчүлүштүктөрдү аныктоо таржымалы менен тапшыруу + + Мүчүлүштүктөрдү аныктоо таржымалысыз тапшыруу diff --git a/feature/registration/src/main/res/values-lt/strings.xml b/feature/registration/src/main/res/values-lt/strings.xml index c753a53b8f..8a6c0a223e 100644 --- a/feature/registration/src/main/res/values-lt/strings.xml +++ b/feature/registration/src/main/res/values-lt/strings.xml @@ -595,4 +595,13 @@ Nepavyko įkelti „Captcha“ Atšaukti + + + Pateikti derinimo žurnalą? + + Turėdami derinimo žurnalus greičiau išspręsime jūsų problemą. Žurnalų pateikti neprivaloma. + + Pateikti su derinimo žurnalu + + Pateikti be derinimo žurnalo diff --git a/feature/registration/src/main/res/values-lv/strings.xml b/feature/registration/src/main/res/values-lv/strings.xml index 9c2c3ea813..c32fec5c43 100644 --- a/feature/registration/src/main/res/values-lv/strings.xml +++ b/feature/registration/src/main/res/values-lv/strings.xml @@ -593,4 +593,13 @@ Neizdevās ielādēt captcha Atcelt + + + Vai iesniegt atkļūdošanas žurnālu? + + Jūsu atkļūdošanas žurnāli mums palīdzēs ātrāk novērst jūsu problēmu. Žurnālu iesniegšana nav obligāta. + + Iesniegt ar atkļūdošanas žurnālu + + Iesniegt bez atkļūdošanas žurnāla diff --git a/feature/registration/src/main/res/values-mk/strings.xml b/feature/registration/src/main/res/values-mk/strings.xml index 98347be5cd..91faba901f 100644 --- a/feature/registration/src/main/res/values-mk/strings.xml +++ b/feature/registration/src/main/res/values-mk/strings.xml @@ -591,4 +591,13 @@ Вчитувањето на captcha е неуспешно Откажи + + + Сакате да испратите запис за отстранување грешки? + + Вашите записи за дебагирање ни помагаат побрзо да го решиме вашиот проблем. Поднесувањето на записите не е задолжително. + + Испратете со запис за дебагирање + + Испратете без запис за дебагирање diff --git a/feature/registration/src/main/res/values-ml/strings.xml b/feature/registration/src/main/res/values-ml/strings.xml index 1994e7f194..75a0a25415 100644 --- a/feature/registration/src/main/res/values-ml/strings.xml +++ b/feature/registration/src/main/res/values-ml/strings.xml @@ -591,4 +591,13 @@ ക്യാപ്‌ച ലോഡ് ചെയ്യാനായില്ല റദ്ദാക്കുക + + + ഡീബഗ് ലോഗ് സമർപ്പിക്കണോ? + + നിങ്ങളുടെ ഡീബഗ് ലോഗുകൾ പ്രശ്നം വേഗത്തിൽ പരിഹരിക്കാൻ ഞങ്ങളെ സഹായിക്കും. നിങ്ങളുടെ ലോഗുകൾ സമർപ്പിക്കുന്നത് ഓപ്ഷണലാണ്. + + ഡീബഗ് ലോഗ് ഉപയോഗിച്ച് സമർപ്പിക്കുക + + ഡീബഗ് ലോഗ് ഇല്ലാതെ സമർപ്പിക്കുക diff --git a/feature/registration/src/main/res/values-mr/strings.xml b/feature/registration/src/main/res/values-mr/strings.xml index ba54557d87..22adbb5cf7 100644 --- a/feature/registration/src/main/res/values-mr/strings.xml +++ b/feature/registration/src/main/res/values-mr/strings.xml @@ -591,4 +591,13 @@ कॅप्चा लोड करता आला नाही रद्द करा + + + डीबग लॉग सबमिट करायचा? + + आपले डीबग लॉग आम्हाला आपल्या समस्या जलदतेने सोडविण्यात मदत करतील. आपले लॉग प्रविष्ट करणे पर्यायी आहे. + + डीबग लॉग सोबत प्रविष्ट करा + + डीबग लॉग विना प्रविष्ट करा diff --git a/feature/registration/src/main/res/values-ms/strings.xml b/feature/registration/src/main/res/values-ms/strings.xml index 0430449d75..8b5591c2f2 100644 --- a/feature/registration/src/main/res/values-ms/strings.xml +++ b/feature/registration/src/main/res/values-ms/strings.xml @@ -589,4 +589,13 @@ Gagal memuatkan captcha Batal + + + Hantar log nyahpepijat? + + Log nyahpepijat anda akan membantu kami menyelesaikan masalah anda dengan lebih pantas. Menghantar log anda adalah pilihan, + + Hantar dengan Log Nyahpepijat + + Hantar tanpa Log Nyahpepijat diff --git a/feature/registration/src/main/res/values-my/strings.xml b/feature/registration/src/main/res/values-my/strings.xml index acee1b8ffb..4d16e310c7 100644 --- a/feature/registration/src/main/res/values-my/strings.xml +++ b/feature/registration/src/main/res/values-my/strings.xml @@ -589,4 +589,13 @@ စက်ရုပ်မဟုတ်ကြောင်း အတည်ပြုချက်ကို ဖွင့်၍မရပါ မလုပ်တော့ပါ + + + ပြစ်ချက်မှတ်တမ်း ပေးပို့မည်လား။ + + ပြစ်ချက်မှတ်တမ်းများသည် သင့်ပြဿနာကို ပိုမိုမြန်ဆန်စွာ ဖြေရှင်းရန် အထောက်အကူပေးမည်။ သင်၏မှတ်တမ်းများကို ဆန္ဒရှိမှတင်သွင်းနိုင်သည်။ + + ပြစ်ချက်မှတ်တမ်းဖြင့် တင်ပြရန် + + ပြစ်ချက်မှတ်တမ်းမပါဘဲ တင်ပြရန် diff --git a/feature/registration/src/main/res/values-nb/strings.xml b/feature/registration/src/main/res/values-nb/strings.xml index 5dc988620e..1bce9e6421 100644 --- a/feature/registration/src/main/res/values-nb/strings.xml +++ b/feature/registration/src/main/res/values-nb/strings.xml @@ -591,4 +591,13 @@ Kunne ikke laste inn captcha Avbryt + + + Vil du sende inn en feilsøkingslogg? + + Feilsøkingsloggene hjelper oss med å feilsøke problemet ditt raskere. Det er valgfritt å sende inn disse loggene. + + Send inn med feilsøkingslogg + + Send inn uten feilsøkingslogg diff --git a/feature/registration/src/main/res/values-nl/strings.xml b/feature/registration/src/main/res/values-nl/strings.xml index d2369d3434..3930216447 100644 --- a/feature/registration/src/main/res/values-nl/strings.xml +++ b/feature/registration/src/main/res/values-nl/strings.xml @@ -591,4 +591,13 @@ Laden van captcha mislukt Annuleren + + + Foutopsporingslog indienen? + + Je foutopsporingslog helpt ons om je probleem sneller te ontdekken en op te lossen. Het indienen van een foutopsporingslog is optioneel. + + Indienen met foutopsporingslog + + Indienen zonder foutopsporingslog diff --git a/feature/registration/src/main/res/values-pa/strings.xml b/feature/registration/src/main/res/values-pa/strings.xml index 17202d0b48..102bc45233 100644 --- a/feature/registration/src/main/res/values-pa/strings.xml +++ b/feature/registration/src/main/res/values-pa/strings.xml @@ -591,4 +591,13 @@ ਕੈਪਚਾ ਲੋਡ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਰਹੇ ਰੱਦ ਕਰੋ + + + ਕੀ ਤੁਸੀਂ ਡੀਬੱਗ ਲੌਗ ਦਰਜ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ? + + ਤੁਹਾਡੇ ਡੀਬੱਗ ਲੌਗ ਤੁਹਾਡੀ ਸਮੱਸਿਆ ਦਾ ਤੇਜ਼ੀ ਨਾਲ ਨਿਪਟਾਰਾ ਕਰਨ ਵਿੱਚ ਸਾਡੀ ਮਦਦ ਕਰਨਗੇ। ਲੌਗ ਜਮ੍ਹਾਂ ਕਰਨਾ ਤੁਹਾਡੀ ਇੱਛਾ ਉੱਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ। + + ਡੀਬੱਗ ਲੌਗ ਦੇ ਨਾਲ ਦਰਜ ਕਰੋ + + ਡੀਬੱਗ ਲੌਗ ਤੋਂ ਬਿਨਾਂ ਦਰਜ ਕਰੋ diff --git a/feature/registration/src/main/res/values-pl/strings.xml b/feature/registration/src/main/res/values-pl/strings.xml index 6125f3ca82..2bf27460fc 100644 --- a/feature/registration/src/main/res/values-pl/strings.xml +++ b/feature/registration/src/main/res/values-pl/strings.xml @@ -595,4 +595,13 @@ Nie udało się wczytać captcha Anuluj + + + Przesłać dziennik debugowania? + + Dziennik debugowania pomoże nam szybciej rozwiązać problem. Załączenie dziennika jest opcjonalne. + + Prześlij z dziennikiem debugowania + + Prześlij bez dziennika debugowania diff --git a/feature/registration/src/main/res/values-pt-rBR/strings.xml b/feature/registration/src/main/res/values-pt-rBR/strings.xml index 02aeb6c857..2f56f7bc4c 100644 --- a/feature/registration/src/main/res/values-pt-rBR/strings.xml +++ b/feature/registration/src/main/res/values-pt-rBR/strings.xml @@ -591,4 +591,13 @@ Falha ao carregar captcha Cancelar + + + Enviar registro de depuração? + + Seus registros de depuração nos ajudarão a resolver o problema mais rápido. O envio é opcional. + + Enviar com registro de depuração + + Enviar sem registro de depuração diff --git a/feature/registration/src/main/res/values-pt/strings.xml b/feature/registration/src/main/res/values-pt/strings.xml index b67b81a553..55f5b848d5 100644 --- a/feature/registration/src/main/res/values-pt/strings.xml +++ b/feature/registration/src/main/res/values-pt/strings.xml @@ -591,4 +591,13 @@ Falha ao carregar o captcha Cancelar + + + Enviar registo de depuração? + + Os seus registos de depuração irão ajudar-nos a resolver mais rapidamente o seu problema. A submissão dos seus registos é opcional. + + Enviar com relatório de depuração + + Enviar sem relatório de depuração diff --git a/feature/registration/src/main/res/values-ro/strings.xml b/feature/registration/src/main/res/values-ro/strings.xml index e1c36d5592..04bece261e 100644 --- a/feature/registration/src/main/res/values-ro/strings.xml +++ b/feature/registration/src/main/res/values-ro/strings.xml @@ -593,4 +593,13 @@ Nu s-a putut încărca captcha Anulează + + + Trimiți jurnalul de depanare? + + Jurnalele tale de depanare ne vor ajuta să rezolvăm mai rapid problema. Trimiterea lor este opțională. + + Trimite împreună cu jurnalul de depanare + + Trimite fără jurnalul de depanare diff --git a/feature/registration/src/main/res/values-ru/strings.xml b/feature/registration/src/main/res/values-ru/strings.xml index 9886313bef..4436bf05fa 100644 --- a/feature/registration/src/main/res/values-ru/strings.xml +++ b/feature/registration/src/main/res/values-ru/strings.xml @@ -595,4 +595,13 @@ Не удалось загрузить капчу Отменить + + + Отправить журналы отладки? + + Ваши журналы отладки помогут нам быстрее устранить проблему. Отправка журналов не является обязательной. + + Отправить с журналом отладки + + Отправить без журнала отладки diff --git a/feature/registration/src/main/res/values-sk/strings.xml b/feature/registration/src/main/res/values-sk/strings.xml index 182f5b80a8..0821533416 100644 --- a/feature/registration/src/main/res/values-sk/strings.xml +++ b/feature/registration/src/main/res/values-sk/strings.xml @@ -595,4 +595,13 @@ Nepodarilo sa načítať captcha Zrušiť + + + Odoslať denník ladenia? + + Vaše denníky ladenia nám pomôžu vyriešiť váš problém rýchlejšie. Ich odoslanie nie je povinné. + + Odoslať s denníkom ladenia + + Odoslať bez denníka ladenia diff --git a/feature/registration/src/main/res/values-sl/strings.xml b/feature/registration/src/main/res/values-sl/strings.xml index 2df758ca97..a7ae11b5b7 100644 --- a/feature/registration/src/main/res/values-sl/strings.xml +++ b/feature/registration/src/main/res/values-sl/strings.xml @@ -595,4 +595,13 @@ CAPTCHA ni bilo mogoče naložiti Prekliči + + + Želite poslati sistemsko zabeležbo? + + Vaše sistemske zabeležbe nam bodo pomagale hitreje odpraviti težavo. Pošiljanje zabeležb ni obvezno. + + Pošlji s sistemsko zabeležbo + + Pošlji brez sistemske zabeležbe diff --git a/feature/registration/src/main/res/values-sq/strings.xml b/feature/registration/src/main/res/values-sq/strings.xml index d9b20681cf..7d6f9c405e 100644 --- a/feature/registration/src/main/res/values-sq/strings.xml +++ b/feature/registration/src/main/res/values-sq/strings.xml @@ -591,4 +591,13 @@ Nuk u ngarkua captcha Anulo + + + Të paraqitet regjistri i diagnostikimeve? + + Regjistri i diagnostikimeve do të na ndihmojë ta zgjidhim problemin më shpejt. Dërgimi i regjistrit është opsional. + + Dërgo me regjistër diagnostikimesh + + Dërgo pa regjistër diagnostikimesh diff --git a/feature/registration/src/main/res/values-sr/strings.xml b/feature/registration/src/main/res/values-sr/strings.xml index 2bc928ca54..8616d571c6 100644 --- a/feature/registration/src/main/res/values-sr/strings.xml +++ b/feature/registration/src/main/res/values-sr/strings.xml @@ -591,4 +591,13 @@ Учитавање captcha-е није успело Откажи + + + Желите ли да пошаљете извештај о грешкама? + + Извештаји о грешкама нам помажу да лакше отклонимо проблем. Слање извештаја није обавезно. + + Пошаљи са извештајем о грешкама + + Пошаљи без извештаја о грешкама diff --git a/feature/registration/src/main/res/values-sv/strings.xml b/feature/registration/src/main/res/values-sv/strings.xml index 7e596aa117..6b192dd479 100644 --- a/feature/registration/src/main/res/values-sv/strings.xml +++ b/feature/registration/src/main/res/values-sv/strings.xml @@ -591,4 +591,13 @@ Det gick inte att läsa in captchan Avbryt + + + Skicka felsökningslogg? + + Dina felsökningsloggar kommer att hjälpa oss att felsöka problemet snabbare. Att skicka in dina loggar är valfritt. + + Skicka med felsökningslogg + + Skicka utan felsökningslogg diff --git a/feature/registration/src/main/res/values-sw/strings.xml b/feature/registration/src/main/res/values-sw/strings.xml index e3472ee8b5..527d03f2fd 100644 --- a/feature/registration/src/main/res/values-sw/strings.xml +++ b/feature/registration/src/main/res/values-sw/strings.xml @@ -591,4 +591,13 @@ Imeshindwa kupakia captcha Ghairi + + + Je, wasilisha kumbukumbu za utatuzi? + + Faili zako la rekebisho zitatusaidia kutatua tatizo lako haraka. Kuwasilisha faili zako za rekebisho ni hiari. + + Wasilisha faili la rekebisho + + Wasilisha bila faili la rekebisho diff --git a/feature/registration/src/main/res/values-ta/strings.xml b/feature/registration/src/main/res/values-ta/strings.xml index bead205085..89ca1c16a5 100644 --- a/feature/registration/src/main/res/values-ta/strings.xml +++ b/feature/registration/src/main/res/values-ta/strings.xml @@ -591,4 +591,13 @@ கேப்ட்சாவை ஏற்ற முடியவில்லை ரத்துசெய் + + + பிழைத்திருத்தப் பதிவு சமர்ப்பிப்பதா? + + உங்கள் பிழைத்திருத்தப் பதிவுகள் உங்கள் சிக்கலை விரைவாகச் சரிசெய்ய உதவும். உங்கள் பதிவுகளைச் சமர்ப்பிப்பது விருப்பத்தேர்வுக்குரியது. + + பிழைத்திருத்தப் பதிவுடன் சமர்ப்பி + + பிழைத்திருத்தப் பதிவு இல்லாமல் சமர்ப்பி diff --git a/feature/registration/src/main/res/values-te/strings.xml b/feature/registration/src/main/res/values-te/strings.xml index 4ab7aae8fb..08c01e8929 100644 --- a/feature/registration/src/main/res/values-te/strings.xml +++ b/feature/registration/src/main/res/values-te/strings.xml @@ -591,4 +591,13 @@ క్యాప్చాను లోడ్ చేయడంలో విఫలమైంది రద్దు చేయండి + + + డీబగ్ లాగ్‌ను సమర్పించేదా? + + మీ సమస్యను వేగంగా పరిష్కరించడానికి మీ డీబగ్ లాగ్స్ మాకు సహాయపడతాయి. మీ లాగ్స్‌ను సమర్పించడం అనేది ఐచ్ఛికం. + + డీబగ్ లాగ్‌తో సమర్పించండి + + డీబగ్ లాగ్ లేకుండా సమర్పించండి diff --git a/feature/registration/src/main/res/values-th/strings.xml b/feature/registration/src/main/res/values-th/strings.xml index 72f1fd36a0..2cd03c5180 100644 --- a/feature/registration/src/main/res/values-th/strings.xml +++ b/feature/registration/src/main/res/values-th/strings.xml @@ -589,4 +589,13 @@ โหลด CAPTCHA ไม่สำเร็จ ยกเลิก + + + คุณต้องการส่งบันทึกดีบักหรือไม่ + + บันทึกดีบักของคุณจะช่วยให้เราแก้ไขปัญหาของคุณได้เร็วขึ้น คุณจะส่งบันทึกของคุณหรือไม่ก็ได้ + + ส่งพร้อมกับบันทึกดีบัก + + ส่งโดยไม่มีบันทึกดีบัก diff --git a/feature/registration/src/main/res/values-tl/strings.xml b/feature/registration/src/main/res/values-tl/strings.xml index daa167a8b4..4dd516452d 100644 --- a/feature/registration/src/main/res/values-tl/strings.xml +++ b/feature/registration/src/main/res/values-tl/strings.xml @@ -591,4 +591,13 @@ Nagkaroon ng error sa pag-load ng captcha I-cancel + + + Gusto mo bang mag-submit ng debug log? + + Makatutulong ang debug logs para mas mabilis naming maayos ang isyung ibinahagi mo. Optional ang pag-submit ng iyong logs. + + I-submit kasama ang debug log + + I-submit na walang debug log diff --git a/feature/registration/src/main/res/values-tr/strings.xml b/feature/registration/src/main/res/values-tr/strings.xml index 45d7c02b5e..7b941d0904 100644 --- a/feature/registration/src/main/res/values-tr/strings.xml +++ b/feature/registration/src/main/res/values-tr/strings.xml @@ -591,4 +591,13 @@ Captcha yüklenemedi İptal + + + Hata ayıklama günlüğü gönderilsin mi? + + Hata ayıklama günlükleriniz sorununuzu çözmemizi hızlandıracaktır. Günlüklerinizi göndermeniz isteğe bağlıdır. + + Hata Ayıklama Günlüğü ile gönder + + Hata Ayıklama Günlüğü olmadan gönder diff --git a/feature/registration/src/main/res/values-ug/strings.xml b/feature/registration/src/main/res/values-ug/strings.xml index 082b81b72d..b667254b10 100644 --- a/feature/registration/src/main/res/values-ug/strings.xml +++ b/feature/registration/src/main/res/values-ug/strings.xml @@ -589,4 +589,13 @@ ماشىنا ئادەم ئەمەسلىكىنى تەكشۈرۈدىغان «captcha» ئىقتىدارىنى يۈكلەش مەغلۇب بولدى بىكار قىلىش + + + كاشىلا ھەل قىلىش خاتىرىسىنى يوللامسىز؟ + + سازلاش خاتىرىڭىز مەسىلىنى تېخىمۇ تېز ھەل قىلىشىمىزغا ياردەم بېرىدۇ. خاتىرە يوللاش ئىختىيارىي. + + سازلاش خاتىرىسىنى قوشۇپ يوللا + + سازلاش خاتىرەسىز يوللا diff --git a/feature/registration/src/main/res/values-uk/strings.xml b/feature/registration/src/main/res/values-uk/strings.xml index 8ed646c00c..760f289b0f 100644 --- a/feature/registration/src/main/res/values-uk/strings.xml +++ b/feature/registration/src/main/res/values-uk/strings.xml @@ -595,4 +595,13 @@ Не вдалося завантажити перевірку CAPTCHA Скасувати + + + Надіслати журнал налагодження? + + Ваш журнал налагодження допоможе нам швидше усунути проблему. Надсилати журнал необов\'язково. + + Відправити з журналом налагодження + + Відправити без журналу налагодження diff --git a/feature/registration/src/main/res/values-ur/strings.xml b/feature/registration/src/main/res/values-ur/strings.xml index 91cb1ac933..0219dc7220 100644 --- a/feature/registration/src/main/res/values-ur/strings.xml +++ b/feature/registration/src/main/res/values-ur/strings.xml @@ -591,4 +591,13 @@ کیپچا لوڈ نہیں ہوا منسوخ کریں + + + ڈی بگ لاگ جمع کروائیں؟ + + آپ کے ڈیبگ لاگس آپ کے مسئلے کو تیزی سے ازالہ کرنے میں ہماری مدد کریں گے۔ اپنے لاگس جمع کروانا اختیاری ہے۔ + + ڈیبگ لاگ کے ساتھ جمع کروائیں + + ڈیبگ لاگ کے بغیر جمع کروائیں diff --git a/feature/registration/src/main/res/values-vi/strings.xml b/feature/registration/src/main/res/values-vi/strings.xml index d02cd56e4d..456ef71ef3 100644 --- a/feature/registration/src/main/res/values-vi/strings.xml +++ b/feature/registration/src/main/res/values-vi/strings.xml @@ -589,4 +589,13 @@ Không thể tải mã captcha Hủy + + + Gửi nhật ký gỡ lỗi? + + Nhật ký gỡ lỗi của bạn sẽ giúp chúng tôi giải quyết vấn đề nhanh hơn. Không bắt buộc gửi nhật ký gỡ lỗi. + + Gửi cùng nhật ký gỡ lỗi + + Gửi không có nhật ký gỡ lỗi diff --git a/feature/registration/src/main/res/values-yue/strings.xml b/feature/registration/src/main/res/values-yue/strings.xml index d51496f151..1d7cbad095 100644 --- a/feature/registration/src/main/res/values-yue/strings.xml +++ b/feature/registration/src/main/res/values-yue/strings.xml @@ -589,4 +589,13 @@ 載入唔到「我不是機械人」驗證 取消 + + + 係咪要提交除錯記錄? + + 您嘅除錯記錄檔會幫到我哋更快搵出問題嘅箇中原因。有就錦上添花,但唔係事必要您提交您嘅記錄檔嘅。 + + 連同除錯記錄檔提交 + + 抽起除錯記錄檔提交 diff --git a/feature/registration/src/main/res/values-zh-rCN/strings.xml b/feature/registration/src/main/res/values-zh-rCN/strings.xml index f69a52835b..4f7141ca6c 100644 --- a/feature/registration/src/main/res/values-zh-rCN/strings.xml +++ b/feature/registration/src/main/res/values-zh-rCN/strings.xml @@ -589,4 +589,13 @@ 无法加载人机验证 取消 + + + 要提交调试日志吗? + + 你可以选择上传调试日志,这些日志能帮助我们更快地解决问题。 + + 提交并附上调试日志 + + 提交但不附调试日志 diff --git a/feature/registration/src/main/res/values-zh-rHK/strings.xml b/feature/registration/src/main/res/values-zh-rHK/strings.xml index 76721ecbcc..31a3c81c3e 100644 --- a/feature/registration/src/main/res/values-zh-rHK/strings.xml +++ b/feature/registration/src/main/res/values-zh-rHK/strings.xml @@ -589,4 +589,13 @@ 載入「我不是機械人」驗證失敗 取消 + + + 要提交除錯日誌嗎? + + 除錯日誌會幫助我們更快地修正問題。上載除錯日誌是可選項目。 + + 連同除錯日誌一同上交 + + 不要連同除錯日誌一同上交 diff --git a/feature/registration/src/main/res/values-zh-rTW/strings.xml b/feature/registration/src/main/res/values-zh-rTW/strings.xml index bacb99b2f2..1cc535e925 100644 --- a/feature/registration/src/main/res/values-zh-rTW/strings.xml +++ b/feature/registration/src/main/res/values-zh-rTW/strings.xml @@ -589,4 +589,13 @@ 載入「我不是機械人」驗證失敗 取消 + + + 要提交除錯日誌嗎? + + 你的錯誤偵測紀錄將幫助我們盡快的解決你的問題。上傳你的紀錄是選擇性的。 + + 上傳錯誤偵測紀錄 + + 上傳不含錯誤偵測紀錄 diff --git a/feature/registration/src/main/res/values/strings.xml b/feature/registration/src/main/res/values/strings.xml index 9cea5c7ba6..b055d2684c 100644 --- a/feature/registration/src/main/res/values/strings.xml +++ b/feature/registration/src/main/res/values/strings.xml @@ -124,7 +124,9 @@ Contact Support - Signal Registration - Verification Code for Android + Signal Registration - Verification Code for Android + + Signal Registration - Verification Code for Android https://support.signal.org/ @@ -308,8 +310,10 @@ An error occurred while restoring your backup. Your backup is not recoverable. Please contact support for help. Contact support - - Signal Android Backup restore permanent failure + + Signal Android Backup Restore Permanent Failure + + Android SignalBackups Import Permanent Failure Downloading backup… @@ -431,8 +435,10 @@ No data could be found to restore your account. Please create a new PIN. Contact support - - Signal Registration - Need Help with PIN for Android + + Signal Registration - Need Help with PIN for Android + + Signal Registration - Need Help with PIN for Android Allow Notifications @@ -593,4 +599,14 @@ Failed to load captcha Cancel + + + + Submit debug log? + + Your debug logs will help us troubleshoot your issue faster. Submitting your logs is optional. + + Submit with debug log + + Submit without debug log