diff --git a/.github/workflows/publish-github-release-bwa.yml b/.github/workflows/publish-github-release-bwa.yml index eede7b9b9a..59fe758002 100644 --- a/.github/workflows/publish-github-release-bwa.yml +++ b/.github/workflows/publish-github-release-bwa.yml @@ -1,4 +1,4 @@ -name: Publish Password Manager and Authenticator GitHub Release as newest +name: Publish Authenticator GitHub Release as newest on: workflow_dispatch: @@ -7,7 +7,7 @@ on: permissions: contents: write id-token: write - actions: read + actions: write jobs: publish-release-authenticator: diff --git a/.github/workflows/publish-github-release-bwpm.yml b/.github/workflows/publish-github-release-bwpm.yml index 073fb8e4dd..8874602bf2 100644 --- a/.github/workflows/publish-github-release-bwpm.yml +++ b/.github/workflows/publish-github-release-bwpm.yml @@ -1,4 +1,4 @@ -name: Publish Password Manager and Authenticator GitHub Release as newest +name: Publish Password Manager GitHub Release as newest on: workflow_dispatch: @@ -8,7 +8,7 @@ on: permissions: contents: write id-token: write - actions: read + actions: write jobs: publish-release-password-manager: diff --git a/app/src/main/assets/fido2_privileged_community.json b/app/src/main/assets/fido2_privileged_community.json index 27eb8b5bcd..0e2e4e5dd4 100644 --- a/app/src/main/assets/fido2_privileged_community.json +++ b/app/src/main/assets/fido2_privileged_community.json @@ -48,6 +48,18 @@ ] } }, + { + "type": "android", + "info": { + "package_name": "org.ironfoxoss.ironfox.nightly", + "signatures": [ + { + "build": "release", + "cert_fingerprint_sha256": "C5:E2:91:B5:A5:71:F9:C8:CD:9A:97:99:C2:C9:4E:02:EC:97:03:94:88:93:F2:CA:75:6D:67:B9:42:04:F9:04" + } + ] + } + }, { "type": "android", "info": { diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/accessibility/util/BrowserUtil.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/accessibility/util/BrowserUtil.kt index 5d67127f61..287862a35a 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/accessibility/util/BrowserUtil.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/accessibility/util/BrowserUtil.kt @@ -136,6 +136,11 @@ private val ACCESSIBILITY_SUPPORTED_BROWSERS = listOf( // 2nd = Legacy possibleUrlFieldIds = listOf("mozac_browser_toolbar_url_view", "url_bar_title"), ), + Browser( + packageName = "org.ironfoxoss.ironfox.nightly", + // 2nd = Legacy + possibleUrlFieldIds = listOf("mozac_browser_toolbar_url_view", "url_bar_title"), + ), Browser(packageName = "org.mozilla.fenix", urlFieldId = "mozac_browser_toolbar_url_view"), // [DEPRECATED ENTRY] Browser( diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/PushManagerImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/PushManagerImpl.kt index 1f00b22e9a..d9ce889da3 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/PushManagerImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/PushManagerImpl.kt @@ -1,5 +1,6 @@ package com.x8bit.bitwarden.data.platform.manager +import com.bitwarden.core.data.manager.model.FlagKey import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow import com.bitwarden.core.data.util.decodeFromStringOrNull import com.bitwarden.data.manager.DispatcherManager @@ -13,6 +14,7 @@ import com.x8bit.bitwarden.data.platform.manager.model.NotificationLogoutData import com.x8bit.bitwarden.data.platform.manager.model.NotificationPayload import com.x8bit.bitwarden.data.platform.manager.model.NotificationType import com.x8bit.bitwarden.data.platform.manager.model.PasswordlessRequestData +import com.x8bit.bitwarden.data.platform.manager.model.PushNotificationLogOutReason import com.x8bit.bitwarden.data.platform.manager.model.SyncCipherDeleteData import com.x8bit.bitwarden.data.platform.manager.model.SyncCipherUpsertData import com.x8bit.bitwarden.data.platform.manager.model.SyncFolderDeleteData @@ -44,12 +46,14 @@ private val PUSH_TOKEN_UPDATE_DELAY: Duration = 7.days /** * Primary implementation of [PushManager]. */ +@Suppress("LongParameterList") class PushManagerImpl @Inject constructor( private val authDiskSource: AuthDiskSource, private val pushDiskSource: PushDiskSource, private val pushService: PushService, private val clock: Clock, private val json: Json, + private val featureFlagManager: FeatureFlagManager, dispatcherManager: DispatcherManager, ) : PushManager { private val ioScope = CoroutineScope(dispatcherManager.io) @@ -157,8 +161,15 @@ class PushManagerImpl @Inject constructor( .decodeFromString( string = notification.payload, ) - .userId - ?.let { mutableLogoutSharedFlow.tryEmit(NotificationLogoutData(it)) } + .takeUnless { + featureFlagManager.getFeatureFlag(FlagKey.NoLogoutOnKdfChange) && + it.pushNotificationLogOutReason == + PushNotificationLogOutReason.KDF_CHANGE + } + ?.userId + ?.let { + mutableLogoutSharedFlow.tryEmit(NotificationLogoutData(userId = it)) + } } NotificationType.SYNC_CIPHER_CREATE, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/di/PlatformManagerModule.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/di/PlatformManagerModule.kt index 59c93a0652..8f62e2ff66 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/di/PlatformManagerModule.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/di/PlatformManagerModule.kt @@ -302,6 +302,7 @@ object PlatformManagerModule { dispatcherManager: DispatcherManager, clock: Clock, json: Json, + featureFlagManager: FeatureFlagManager, ): PushManager = PushManagerImpl( authDiskSource = authDiskSource, pushDiskSource = pushDiskSource, @@ -309,6 +310,7 @@ object PlatformManagerModule { dispatcherManager = dispatcherManager, clock = clock, json = json, + featureFlagManager = featureFlagManager, ) @Provides diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/NotificationPayload.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/NotificationPayload.kt index 111197aa1d..558884f1b3 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/NotificationPayload.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/NotificationPayload.kt @@ -50,9 +50,15 @@ sealed class NotificationPayload { */ @Serializable data class UserNotification( - @JsonNames("UserId", "userId") override val userId: String?, + @JsonNames("UserId", "userId") + override val userId: String?, + @Contextual - @JsonNames("Date", "date") val date: ZonedDateTime?, + @JsonNames("Date", "date") + val date: ZonedDateTime?, + + @JsonNames("PushNotificationLogOutReason", "pushNotificationLogOutReason") + val pushNotificationLogOutReason: PushNotificationLogOutReason?, ) : NotificationPayload() /** diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/PushNotificationLogOutReason.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/PushNotificationLogOutReason.kt new file mode 100644 index 0000000000..805f342a9a --- /dev/null +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/PushNotificationLogOutReason.kt @@ -0,0 +1,11 @@ +package com.x8bit.bitwarden.data.platform.manager.model + +import kotlinx.serialization.SerialName + +/** + * Enumerated values to represent the possible reasons for a log out push notification + */ +enum class PushNotificationLogOutReason { + @SerialName("0") + KDF_CHANGE, +} diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordScreen.kt index 1ec2249723..9781359b5d 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordScreen.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.verticalScroll @@ -15,8 +16,10 @@ import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -29,14 +32,18 @@ import com.bitwarden.cxf.ui.composition.LocalCredentialExchangeCompletionManager import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.components.button.BitwardenFilledButton +import com.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog import com.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog import com.bitwarden.ui.platform.components.field.BitwardenPasswordField import com.bitwarden.ui.platform.components.model.CardStyle +import com.bitwarden.ui.platform.components.snackbar.model.BitwardenSnackbarHostState +import com.bitwarden.ui.platform.components.snackbar.model.rememberBitwardenSnackbarHostState import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme +import com.bitwarden.ui.util.asText import com.x8bit.bitwarden.ui.vault.feature.exportitems.component.AccountSummaryListItem import com.x8bit.bitwarden.ui.vault.feature.exportitems.component.ExportItemsScaffold import com.x8bit.bitwarden.ui.vault.feature.exportitems.model.AccountSelectionListItem @@ -53,6 +60,7 @@ fun VerifyPasswordScreen( viewModel: VerifyPasswordViewModel = hiltViewModel(), credentialExchangeCompletionManager: CredentialExchangeCompletionManager = LocalCredentialExchangeCompletionManager.current, + snackbarHostState: BitwardenSnackbarHostState = rememberBitwardenSnackbarHostState(), ) { val state by viewModel.stateFlow.collectAsStateWithLifecycle() val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) @@ -75,6 +83,10 @@ fun VerifyPasswordScreen( is VerifyPasswordEvent.PasswordVerified -> { onPasswordVerified(event.userId) } + + is VerifyPasswordEvent.ShowSnackbar -> { + snackbarHostState.showSnackbar(event.data) + } } } @@ -99,10 +111,9 @@ fun VerifyPasswordScreen( VerifyPasswordContent( state = state, onInputChanged = handler.onInputChanged, - onUnlockClick = handler.onUnlockClick, - modifier = Modifier - .fillMaxSize() - .standardHorizontalMargin(), + onContinueClick = handler.onContinueClick, + onResendCodeClick = handler.onSendCodeClick, + modifier = Modifier.fillMaxSize(), ) } } @@ -130,11 +141,13 @@ private fun VerifyPasswordDialogs( } } +@Suppress("LongMethod") @Composable private fun VerifyPasswordContent( state: VerifyPasswordState, onInputChanged: (String) -> Unit, - onUnlockClick: () -> Unit, + onContinueClick: () -> Unit, + onResendCodeClick: () -> Unit, modifier: Modifier = Modifier, ) { Column( @@ -145,61 +158,121 @@ private fun VerifyPasswordContent( Spacer(Modifier.height(24.dp)) Text( - text = stringResource(BitwardenString.verify_your_master_password), + text = state.title(), textAlign = TextAlign.Center, style = BitwardenTheme.typography.titleMedium, - modifier = Modifier.fillMaxWidth(), + modifier = Modifier + .fillMaxWidth() + .standardHorizontalMargin(), ) + state.subtext?.let { subtext -> + Spacer(Modifier.height(8.dp)) + Text( + text = subtext(), + textAlign = TextAlign.Center, + style = BitwardenTheme.typography.bodyMedium, + modifier = Modifier + .fillMaxWidth() + .standardHorizontalMargin(), + ) + } + Spacer(Modifier.height(16.dp)) AccountSummaryListItem( item = state.accountSummaryListItem, cardStyle = CardStyle.Full, clickable = false, - modifier = Modifier.fillMaxWidth(), + modifier = Modifier + .fillMaxWidth() + .standardHorizontalMargin(), ) Spacer(Modifier.height(16.dp)) - BitwardenPasswordField( - label = stringResource(BitwardenString.master_password), - value = state.input, - onValueChange = onInputChanged, - showPasswordTestTag = "PasswordVisibilityToggle", - imeAction = ImeAction.Done, - keyboardActions = KeyboardActions( - onDone = { - if (state.isUnlockButtonEnabled) { - onUnlockClick() - } else { - defaultKeyboardAction(ImeAction.Done) - } - }, - ), - supportingText = stringResource(BitwardenString.vault_locked_master_password), - passwordFieldTestTag = "MasterPasswordEntry", - cardStyle = CardStyle.Full, - modifier = Modifier.fillMaxWidth(), - ) + if (state.showResendCodeButton) { + BitwardenPasswordField( + label = stringResource(id = BitwardenString.verification_code), + value = state.input, + onValueChange = onInputChanged, + keyboardType = KeyboardType.Number, + imeAction = ImeAction.Done, + keyboardActions = KeyboardActions( + onDone = { + if (state.isContinueButtonEnabled) { + onContinueClick() + } else { + defaultKeyboardAction(ImeAction.Done) + } + }, + ), + autoFocus = true, + cardStyle = CardStyle.Full, + passwordFieldTestTag = "VerificationCodeEntry", + showPasswordTestTag = "VerificationCodeVisibilityToggle", + modifier = Modifier + .fillMaxWidth() + .standardHorizontalMargin(), + ) + } else { + BitwardenPasswordField( + label = stringResource(BitwardenString.master_password), + value = state.input, + onValueChange = onInputChanged, + showPasswordTestTag = "PasswordVisibilityToggle", + imeAction = ImeAction.Done, + keyboardActions = KeyboardActions( + onDone = { + if (state.isContinueButtonEnabled) { + onContinueClick() + } else { + defaultKeyboardAction(ImeAction.Done) + } + }, + ), + autoFocus = true, + supportingText = stringResource(BitwardenString.vault_locked_master_password), + passwordFieldTestTag = "MasterPasswordEntry", + cardStyle = CardStyle.Full, + modifier = Modifier + .fillMaxWidth() + .standardHorizontalMargin(), + ) + } Spacer(Modifier.height(16.dp)) BitwardenFilledButton( - label = stringResource(BitwardenString.unlock), - onClick = onUnlockClick, - isEnabled = state.isUnlockButtonEnabled, - modifier = Modifier.fillMaxWidth(), + label = stringResource(BitwardenString.continue_text), + onClick = onContinueClick, + isEnabled = state.isContinueButtonEnabled, + modifier = Modifier + .testTag("ContinueImportButton") + .fillMaxWidth() + .standardHorizontalMargin(), ) + if (state.showResendCodeButton) { + BitwardenOutlinedButton( + label = stringResource(BitwardenString.resend_code), + onClick = onResendCodeClick, + modifier = Modifier + .testTag("ResendTOTPCodeButton") + .fillMaxWidth() + .standardHorizontalMargin(), + ) + } + Spacer(Modifier.height(12.dp)) + Spacer(Modifier.navigationBarsPadding()) } } @OptIn(ExperimentalMaterial3Api::class) @Preview(showBackground = true) @Composable -private fun VerifyPasswordContent_Preview() { +private fun VerifyPasswordContent_MasterPassword_preview() { val accountSummaryListItem = AccountSelectionListItem( userId = "userId", isItemRestricted = false, @@ -208,15 +281,67 @@ private fun VerifyPasswordContent_Preview() { email = "john.doe@example.com", ) val state = VerifyPasswordState( + title = BitwardenString.verify_your_master_password.asText(), + subtext = null, hasOtherAccounts = true, accountSummaryListItem = accountSummaryListItem, ) - VerifyPasswordContent( - state = state, - onInputChanged = {}, - onUnlockClick = {}, - modifier = Modifier - .fillMaxSize() - .standardHorizontalMargin(), + ExportItemsScaffold( + navIcon = rememberVectorPainter( + BitwardenDrawable.ic_back, + ), + onNavigationIconClick = {}, + navigationIconContentDescription = stringResource(BitwardenString.back), + scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()), + modifier = Modifier.fillMaxSize(), + ) { + VerifyPasswordContent( + state = state, + onInputChanged = {}, + onContinueClick = {}, + onResendCodeClick = {}, + modifier = Modifier + .fillMaxSize(), + ) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Preview(showBackground = true) +@Composable +private fun VerifyPasswordContent_Otp_preview() { + val accountSummaryListItem = AccountSelectionListItem( + userId = "userId", + isItemRestricted = false, + avatarColorHex = "#FF0000", + initials = "JD", + email = "john.doe@example.com", ) + val state = VerifyPasswordState( + title = BitwardenString.verify_your_account_email_address.asText(), + subtext = BitwardenString + .enter_the_6_digit_code_that_was_emailed_to_the_address_below + .asText(), + accountSummaryListItem = accountSummaryListItem, + showResendCodeButton = true, + hasOtherAccounts = true, + ) + ExportItemsScaffold( + navIcon = rememberVectorPainter( + BitwardenDrawable.ic_back, + ), + onNavigationIconClick = {}, + navigationIconContentDescription = stringResource(BitwardenString.back), + scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()), + modifier = Modifier.fillMaxSize(), + ) { + VerifyPasswordContent( + state = state, + onInputChanged = {}, + onContinueClick = {}, + onResendCodeClick = {}, + modifier = Modifier + .fillMaxSize(), + ) + } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordViewModel.kt index 34632b0385..31c24ac619 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordViewModel.kt @@ -5,12 +5,15 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.bitwarden.network.model.PolicyTypeJson import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.components.snackbar.model.BitwardenSnackbarData import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.x8bit.bitwarden.data.auth.repository.AuthRepository +import com.x8bit.bitwarden.data.auth.repository.model.RequestOtpResult import com.x8bit.bitwarden.data.auth.repository.model.SwitchAccountResult import com.x8bit.bitwarden.data.auth.repository.model.ValidatePasswordResult +import com.x8bit.bitwarden.data.auth.repository.model.VerifyOtpResult import com.x8bit.bitwarden.data.platform.manager.PolicyManager import com.x8bit.bitwarden.data.vault.repository.VaultRepository import com.x8bit.bitwarden.data.vault.repository.model.VaultUnlockResult @@ -65,6 +68,15 @@ class VerifyPasswordViewModel @Inject constructor( .map { it.organizationId } VerifyPasswordState( + title = if (account.hasMasterPassword) { + BitwardenString.verify_your_master_password.asText() + } else { + BitwardenString.verify_your_account_email_address.asText() + }, + subtext = BitwardenString + .enter_the_6_digit_code_that_was_emailed_to_the_address_below + .asText() + .takeUnless { account.hasMasterPassword }, accountSummaryListItem = AccountSelectionListItem( userId = args.userId, avatarColorHex = account.avatarColorHex, @@ -74,6 +86,7 @@ class VerifyPasswordViewModel @Inject constructor( .organizations .any { it.id in restrictedItemPolicyOrgIds }, ), + showResendCodeButton = !account.hasMasterPassword, hasOtherAccounts = !singleAccount, ) }, @@ -84,6 +97,16 @@ class VerifyPasswordViewModel @Inject constructor( stateFlow .onEach { savedStateHandle[KEY_STATE] = it } .launchIn(viewModelScope) + + if (stateFlow.value.showResendCodeButton) { + viewModelScope.launch { + sendAction( + VerifyPasswordAction.Internal.SendOtpCodeResultReceive( + result = authRepository.requestOneTimePasscode(), + ), + ) + } + } } override fun onCleared() { @@ -99,8 +122,8 @@ class VerifyPasswordViewModel @Inject constructor( handleNavigateBackClick() } - VerifyPasswordAction.UnlockClick -> { - handleUnlockClick() + VerifyPasswordAction.ContinueClick -> { + handleContinueClick() } is VerifyPasswordAction.PasswordInputChangeReceive -> { @@ -111,6 +134,10 @@ class VerifyPasswordViewModel @Inject constructor( handleDismissDialog() } + VerifyPasswordAction.ResendCodeClick -> { + handleResendCodeClick() + } + is VerifyPasswordAction.Internal -> { handleInternalAction(action) } @@ -125,7 +152,7 @@ class VerifyPasswordViewModel @Inject constructor( } } - private fun handleUnlockClick() { + private fun handleContinueClick() { if (state.input.isBlank()) { mutableStateFlow.update { it.copy( @@ -165,6 +192,23 @@ class VerifyPasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy(dialog = null) } } + private fun handleResendCodeClick() { + mutableStateFlow.update { + it.copy( + dialog = VerifyPasswordState.DialogState.Loading( + message = BitwardenString.sending.asText(), + ), + ) + } + viewModelScope.launch { + sendAction( + VerifyPasswordAction.Internal.SendOtpCodeResultReceive( + result = authRepository.requestOneTimePasscode(), + ), + ) + } + } + private fun handleInternalAction(action: VerifyPasswordAction.Internal) { when (action) { is VerifyPasswordAction.Internal.ValidatePasswordResultReceive -> { @@ -174,6 +218,14 @@ class VerifyPasswordViewModel @Inject constructor( is VerifyPasswordAction.Internal.UnlockVaultResultReceive -> { handleUnlockVaultResultReceive(action) } + + is VerifyPasswordAction.Internal.SendOtpCodeResultReceive -> { + handleSendOtpCodeResultReceive(action) + } + + is VerifyPasswordAction.Internal.VerifyOtpResultReceive -> { + handleVerifyOtpResultReceive(action) + } } } @@ -232,6 +284,60 @@ class VerifyPasswordViewModel @Inject constructor( } } + private fun handleSendOtpCodeResultReceive( + action: VerifyPasswordAction.Internal.SendOtpCodeResultReceive, + ) { + when (val result = action.result) { + is RequestOtpResult.Error -> { + val message = result.message?.asText() + ?: BitwardenString.generic_error_message.asText() + mutableStateFlow.update { + it.copy( + dialog = VerifyPasswordState.DialogState.General( + title = BitwardenString.an_error_has_occurred.asText(), + message = message, + ), + ) + } + } + + RequestOtpResult.Success -> { + mutableStateFlow.update { + it.copy(dialog = null) + } + sendEvent( + VerifyPasswordEvent.ShowSnackbar(BitwardenString.code_sent.asText()), + ) + } + } + } + + private fun handleVerifyOtpResultReceive( + action: VerifyPasswordAction.Internal.VerifyOtpResultReceive, + ) { + when (action.result) { + is VerifyOtpResult.Verified -> { + mutableStateFlow.update { it.copy(dialog = null) } + sendEvent( + VerifyPasswordEvent.PasswordVerified( + state.accountSummaryListItem.userId, + ), + ) + } + + is VerifyOtpResult.NotVerified -> { + mutableStateFlow.update { + it.copy( + dialog = VerifyPasswordState.DialogState.General( + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.invalid_verification_code.asText(), + ), + ) + } + } + } + } + private fun switchAccountAndVerifyPassword() { val switchAccountResult = authRepository .switchAccount(userId = state.accountSummaryListItem.userId) @@ -255,7 +361,15 @@ class VerifyPasswordViewModel @Inject constructor( val userId = state.accountSummaryListItem.userId viewModelScope.launch { - if (vaultRepository.isVaultUnlocked(userId)) { + if (state.showResendCodeButton) { + sendAction( + VerifyPasswordAction.Internal.VerifyOtpResultReceive( + result = authRepository.verifyOneTimePasscode( + oneTimePasscode = state.input, + ), + ), + ) + } else if (vaultRepository.isVaultUnlocked(userId)) { // If the vault is already unlocked, validate the password directly. sendAction( VerifyPasswordAction.Internal.ValidatePasswordResultReceive( @@ -311,21 +425,26 @@ class VerifyPasswordViewModel @Inject constructor( * @param accountSummaryListItem The account summary to display. * @param input The current password input. * @param dialog The current dialog state, or null if no dialog is shown. + * @param showResendCodeButton Whether to show the send code button. */ @Parcelize data class VerifyPasswordState( val accountSummaryListItem: AccountSelectionListItem, + val title: Text, + val subtext: Text?, val hasOtherAccounts: Boolean, - // We never want this saved since the input is sensitive data. - @IgnoredOnParcel val input: String = "", - val dialog: DialogState? = null, +// We never want this saved since the input is sensitive data. +@IgnoredOnParcel +val input: String = "", +val dialog: DialogState? = null, +val showResendCodeButton: Boolean = false, ) : Parcelable { /** * Whether the unlock button should be enabled. */ - val isUnlockButtonEnabled: Boolean - get() = input.isNotBlank() && dialog !is DialogState.Loading + val isContinueButtonEnabled: Boolean + get() = input.isNotBlank() && dialog !is DialogState.Loading /** * Represents the state of a dialog. @@ -373,6 +492,27 @@ sealed class VerifyPasswordEvent { * Cancel the export request. */ data object CancelExport : VerifyPasswordEvent() + + /** + * Show a snackbar with the given data . + */ + data class ShowSnackbar( + val data: BitwardenSnackbarData, + ) : VerifyPasswordEvent() { + constructor( + message: Text, + messageHeader: Text? = null, + actionLabel: Text? = null, + withDismissAction: Boolean = false, + ) : this( + data = BitwardenSnackbarData( + message = message, + messageHeader = messageHeader, + actionLabel = actionLabel, + withDismissAction = withDismissAction, + ), + ) + } } /** @@ -385,15 +525,20 @@ sealed class VerifyPasswordAction { data object NavigateBackClick : VerifyPasswordAction() /** - * Represents a click on the unlock button. + * Represents a click on the Continue button. */ - data object UnlockClick : VerifyPasswordAction() + data object ContinueClick : VerifyPasswordAction() /** * Dismiss the current dialog. */ data object DismissDialog : VerifyPasswordAction() + /** + * Represents a click on the resend code button. + */ + data object ResendCodeClick : VerifyPasswordAction() + /** * Represents a change in the password input. * @param input The new password input. @@ -420,5 +565,17 @@ sealed class VerifyPasswordAction { data class UnlockVaultResultReceive( val vaultUnlockResult: VaultUnlockResult, ) : Internal() + + /** + * Represents a result of requesting an OTP code. + * @param result The result of requesting an OTP code. + */ + data class SendOtpCodeResultReceive(val result: RequestOtpResult) : Internal() + + /** + * Represents a result of verifying an OTP code. + * @param result The result of verifying an OTP code. + */ + data class VerifyOtpResultReceive(val result: VerifyOtpResult) : Internal() } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/handlers/VerifyPasswordHandlers.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/handlers/VerifyPasswordHandlers.kt index bfc11d8a9b..04cbfdea70 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/handlers/VerifyPasswordHandlers.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/handlers/VerifyPasswordHandlers.kt @@ -10,8 +10,9 @@ import com.x8bit.bitwarden.ui.vault.feature.exportitems.verifypassword.VerifyPas */ data class VerifyPasswordHandlers( val onNavigateBackClick: () -> Unit, - val onUnlockClick: () -> Unit, + val onContinueClick: () -> Unit, val onInputChanged: (String) -> Unit, + val onSendCodeClick: () -> Unit, val onDismissDialog: () -> Unit, ) { @@ -26,14 +27,17 @@ data class VerifyPasswordHandlers( onNavigateBackClick = { viewModel.trySendAction(VerifyPasswordAction.NavigateBackClick) }, - onUnlockClick = { - viewModel.trySendAction(VerifyPasswordAction.UnlockClick) + onContinueClick = { + viewModel.trySendAction(VerifyPasswordAction.ContinueClick) }, onInputChanged = { viewModel.trySendAction( VerifyPasswordAction.PasswordInputChangeReceive(it), ) }, + onSendCodeClick = { + viewModel.trySendAction(VerifyPasswordAction.ResendCodeClick) + }, onDismissDialog = { viewModel.trySendAction(VerifyPasswordAction.DismissDialog) }, diff --git a/app/src/main/res/xml/autofill_service_configuration.xml b/app/src/main/res/xml/autofill_service_configuration.xml index 67a2f5a8e8..428e67ea91 100644 --- a/app/src/main/res/xml/autofill_service_configuration.xml +++ b/app/src/main/res/xml/autofill_service_configuration.xml @@ -244,6 +244,9 @@ + diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/PushManagerTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/PushManagerTest.kt index 0d1f7a86f2..269f8b78ec 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/PushManagerTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/PushManagerTest.kt @@ -1,6 +1,7 @@ package com.x8bit.bitwarden.data.platform.manager import app.cash.turbine.test +import com.bitwarden.core.data.manager.model.FlagKey import com.bitwarden.core.data.util.asFailure import com.bitwarden.core.data.util.asSuccess import com.bitwarden.core.di.CoreModule @@ -26,6 +27,7 @@ import com.x8bit.bitwarden.data.platform.manager.model.SyncSendDeleteData import com.x8bit.bitwarden.data.platform.manager.model.SyncSendUpsertData import io.mockk.coEvery import io.mockk.coVerify +import io.mockk.every import io.mockk.mockk import kotlinx.coroutines.test.runTest import org.junit.jupiter.api.Assertions.assertEquals @@ -55,6 +57,10 @@ class PushManagerTest { coEvery { putDeviceToken(any()) } returns Unit.asSuccess() } + private val mockFeatureFlagManager = mockk(relaxed = true) { + every { getFeatureFlag(FlagKey.NoLogoutOnKdfChange) } returns false + } + private lateinit var pushManager: PushManager @BeforeEach @@ -66,6 +72,7 @@ class PushManagerTest { dispatcherManager = dispatcherManager, clock = clock, json = CoreModule.providesJson(), + featureFlagManager = mockFeatureFlagManager, ) } @@ -135,6 +142,28 @@ class PushManagerTest { } } + @Test + @Suppress("MaxLineLength") + fun `onMessageReceived with logout with kdf change as reason should not emit to logoutFlow`() = + runTest { + every { + mockFeatureFlagManager.getFeatureFlag(FlagKey.NoLogoutOnKdfChange) + } returns true + + val accountTokens = AccountTokensJson( + accessToken = "accessToken", + refreshToken = "refreshToken", + ) + authDiskSource.storeAccountTokens(userId, accountTokens) + authDiskSource.userState = + UserStateJson(userId, mapOf(userId to mockk())) + + pushManager.logoutFlow.test { + pushManager.onMessageReceived(LOGOUT_KDF_NOTIFICATION_MAP) + expectNoEvents() + } + } + @Nested inner class LoggedOutUserState { @BeforeEach @@ -156,6 +185,18 @@ class PushManagerTest { } } + @Test + fun `onMessageReceived with logout with KDF reason do not emits to logoutFlow`() = + runTest { + every { + mockFeatureFlagManager.getFeatureFlag(FlagKey.NoLogoutOnKdfChange) + } returns true + pushManager.logoutFlow.test { + pushManager.onMessageReceived(LOGOUT_KDF_NOTIFICATION_MAP) + expectNoEvents() + } + } + @Test fun `onMessageReceived with ciphers emits to fullSyncFlow`() = runTest { pushManager.fullSyncFlow.test { @@ -517,6 +558,14 @@ class PushManagerTest { } } + @Test + fun `onMessageReceived with logout with kdf reason does nothing`() = runTest { + pushManager.logoutFlow.test { + pushManager.onMessageReceived(LOGOUT_KDF_NOTIFICATION_MAP) + expectNoEvents() + } + } + @Test fun `onMessageReceived with sync ciphers does nothing`() = runTest { pushManager.fullSyncFlow.test { @@ -575,6 +624,18 @@ class PushManagerTest { } } + @Test + fun `onMessageReceived with logout with kdf reason does not emit to logoutFlow`() = + runTest { + every { + mockFeatureFlagManager.getFeatureFlag(FlagKey.NoLogoutOnKdfChange) + } returns true + pushManager.logoutFlow.test { + pushManager.onMessageReceived(LOGOUT_KDF_NOTIFICATION_MAP) + expectNoEvents() + } + } + @Test fun `onMessageReceived with sync ciphers emits to fullSyncFlow`() = runTest { pushManager.fullSyncFlow.test { @@ -908,6 +969,16 @@ private val LOGOUT_NOTIFICATION_MAP = mapOf( }""", ) +private val LOGOUT_KDF_NOTIFICATION_MAP = mapOf( + "contextId" to "801f459d-8e51-47d0-b072-3f18c9f66f64", + "type" to "11", + "payload" to """{ + "UserId": "078966a2-93c2-4618-ae2a-0a2394c88d37", + "Date": "2023-10-27T12:00:00.000Z", + "PushNotificationLogOutReason": "0" + }""", +) + private val SYNC_CIPHER_CREATE_NOTIFICATION_MAP = mapOf( "contextId" to "801f459d-8e51-47d0-b072-3f18c9f66f64", "type" to "1", diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordScreenTest.kt index 3412dcbf45..ef335c579e 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordScreenTest.kt @@ -1,5 +1,6 @@ package com.x8bit.bitwarden.ui.vault.feature.exportitems.verifypassword +import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsEnabled import androidx.compose.ui.test.assertIsNotEnabled import androidx.compose.ui.test.filterToOne @@ -15,6 +16,7 @@ import androidx.compose.ui.test.performTextInput import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow import com.bitwarden.data.repository.model.Environment import com.bitwarden.network.model.OrganizationType +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.model.Organization @@ -81,10 +83,34 @@ class VerifyPasswordScreenTest : BitwardenComposeTest() { .onNodeWithText("You vault is locked. Verify your master password to continue.") composeTestRule - .onNodeWithText("Unlock") + .onNodeWithText("Continue") .assertIsNotEnabled() } + @Test + fun `otp state should be correct`() = runTest { + mockStateFlow.emit( + DEFAULT_STATE.copy( + title = BitwardenString.verify_your_account_email_address.asText(), + subtext = BitwardenString + .enter_the_6_digit_code_that_was_emailed_to_the_address_below + .asText(), + showResendCodeButton = true, + ), + ) + + composeTestRule + .onNodeWithText("Verify your account email address") + + composeTestRule + .onNodeWithText("Enter the 6-digit code that was emailed to the address below") + .assertIsDisplayed() + + composeTestRule + .onNodeWithText("Resend code") + .assertIsDisplayed() + } + @Test fun `input should update based on state`() = runTest { composeTestRule @@ -105,10 +131,6 @@ class VerifyPasswordScreenTest : BitwardenComposeTest() { composeTestRule .onNodeWithText("Master password") .performTextInput("abc123") - - composeTestRule - .onNodeWithTag("PasswordVisibilityToggle") - .performClick() verify { viewModel.trySendAction( VerifyPasswordAction.PasswordInputChangeReceive("abc123"), @@ -117,26 +139,37 @@ class VerifyPasswordScreenTest : BitwardenComposeTest() { } @Test - fun `Unlock button should should update based on input`() = runTest { + fun `Continue button should should update based on input`() = runTest { composeTestRule - .onNodeWithText("Unlock") + .onNodeWithText("Continue") .assertIsNotEnabled() mockStateFlow.emit(DEFAULT_STATE.copy(input = "abc123")) composeTestRule - .onNodeWithText("Unlock") + .onNodeWithText("Continue") .assertIsEnabled() } @Test - fun `Unlock button should send UnlockClick action`() = runTest { + fun `Continue button should send ContinueClick action`() = runTest { mockStateFlow.emit(DEFAULT_STATE.copy(input = "abc123")) composeTestRule - .onNodeWithText("Unlock") + .onNodeWithText("Continue") .performClick() verify { - viewModel.trySendAction(VerifyPasswordAction.UnlockClick) + viewModel.trySendAction(VerifyPasswordAction.ContinueClick) + } + } + + @Test + fun `Resend code button should send SendCodeClick action`() = runTest { + mockStateFlow.emit(DEFAULT_STATE.copy(showResendCodeButton = true)) + composeTestRule + .onNodeWithText("Resend code") + .performClick() + verify { + viewModel.trySendAction(VerifyPasswordAction.ResendCodeClick) } } @@ -259,6 +292,8 @@ private val DEFAULT_ACCOUNT_SELECTION_LIST_ITEM = AccountSelectionListItem( initials = DEFAULT_USER_STATE.activeAccount.initials, ) private val DEFAULT_STATE = VerifyPasswordState( + title = BitwardenString.verify_your_master_password.asText(), + subtext = null, accountSummaryListItem = DEFAULT_ACCOUNT_SELECTION_LIST_ITEM, input = "", dialog = null, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordViewModelTest.kt index 27376504a6..9f713293b0 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordViewModelTest.kt @@ -12,9 +12,11 @@ import com.bitwarden.ui.util.asText import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.Organization +import com.x8bit.bitwarden.data.auth.repository.model.RequestOtpResult import com.x8bit.bitwarden.data.auth.repository.model.SwitchAccountResult import com.x8bit.bitwarden.data.auth.repository.model.UserState import com.x8bit.bitwarden.data.auth.repository.model.ValidatePasswordResult +import com.x8bit.bitwarden.data.auth.repository.model.VerifyOtpResult import com.x8bit.bitwarden.data.platform.manager.PolicyManager import com.x8bit.bitwarden.data.platform.manager.model.FirstTimeState import com.x8bit.bitwarden.data.vault.repository.VaultRepository @@ -34,6 +36,7 @@ import kotlinx.coroutines.test.runTest import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test class VerifyPasswordViewModelTest : BaseViewModelTest() { @@ -42,6 +45,7 @@ class VerifyPasswordViewModelTest : BaseViewModelTest() { private val authRepository = mockk { every { userStateFlow } returns mutableUserStateFlow every { activeUserId } returns DEFAULT_USER_ID + coEvery { requestOneTimePasscode() } returns RequestOtpResult.Success } private val vaultRepository = mockk { every { isVaultUnlocked(any()) } returns true @@ -73,325 +77,427 @@ class VerifyPasswordViewModelTest : BaseViewModelTest() { ) } - @Test - fun `initial state should be correct when account is not restricted`() = runTest { - createViewModel() - .also { - assertEquals( - VerifyPasswordState( - AccountSelectionListItem( - userId = DEFAULT_USER_ID, - email = DEFAULT_USER_STATE.activeAccount.email, - avatarColorHex = DEFAULT_USER_STATE.activeAccount.avatarColorHex, - isItemRestricted = false, - initials = DEFAULT_USER_STATE.activeAccount.initials, - ), - hasOtherAccounts = true, - ), - it.stateFlow.value, - ) - } - } + @Nested + inner class State { + @Test + fun `initial state should be correct when account has no master password`() = runTest { + mutableUserStateFlow.value = DEFAULT_USER_STATE.copy( + accounts = DEFAULT_USER_STATE.accounts.map { + it.copy(hasMasterPassword = false) + }, + ) + coEvery { authRepository.requestOneTimePasscode() } returns RequestOtpResult.Success - @Test - fun `initial state should be correct when account has item restrictions`() = runTest { - every { - policyManager.getActivePolicies(PolicyTypeJson.RESTRICT_ITEM_TYPES) - } returns listOf( - createMockPolicy( - number = 1, - organizationId = DEFAULT_ORGANIZATION_ID, - isEnabled = true, - ), - ) - - createViewModel() - .also { - assertEquals( - VerifyPasswordState( - hasOtherAccounts = true, - accountSummaryListItem = DEFAULT_ACCOUNT_SELECTION_LIST_ITEM - .copy(isItemRestricted = true), - ), - it.stateFlow.value, - ) - } - } - - @Test - fun `NavigateBackClick should send NavigateBack event`() = runTest { - createViewModel().also { - it.trySendAction(VerifyPasswordAction.NavigateBackClick) - it.eventFlow.test { - assertEquals( - VerifyPasswordEvent.NavigateBack, - awaitItem(), - ) - } - } - } - - @Test - fun `UnlockClick with empty input should show error dialog`() = runTest { - createViewModel().also { - it.trySendAction(VerifyPasswordAction.UnlockClick) - it.stateFlow.test { - assertEquals( - DEFAULT_STATE.copy( - dialog = VerifyPasswordState.DialogState.General( - title = BitwardenString.an_error_has_occurred.asText(), - message = BitwardenString.validation_field_required.asText( - BitwardenString.master_password.asText(), - ), - ), - ), - awaitItem(), - ) - coVerify(exactly = 0) { - authRepository.activeUserId - authRepository.validatePassword(password = any()) - authRepository.switchAccount(userId = any()) - } - } - } - } - - @Suppress("MaxLineLength") - @Test - fun `UnlockClick with non-empty input should show loading dialog, validate password and send validates password`() = - runTest { - val initialState = DEFAULT_STATE.copy(input = "mockInput") - coEvery { authRepository.validatePassword(password = "mockInput") } just awaits - - createViewModel(state = initialState).also { viewModel -> - viewModel.trySendAction(VerifyPasswordAction.UnlockClick) - - viewModel.stateFlow.test { + createViewModel() + .also { assertEquals( - initialState.copy( - dialog = VerifyPasswordState.DialogState.Loading( - message = BitwardenString.loading.asText(), + VerifyPasswordState( + title = BitwardenString.verify_your_account_email_address.asText(), + subtext = BitwardenString + .enter_the_6_digit_code_that_was_emailed_to_the_address_below + .asText(), + accountSummaryListItem = AccountSelectionListItem( + userId = DEFAULT_USER_ID, + email = DEFAULT_USER_STATE.activeAccount.email, + avatarColorHex = DEFAULT_USER_STATE.activeAccount.avatarColorHex, + isItemRestricted = false, + initials = DEFAULT_USER_STATE.activeAccount.initials, + ), + showResendCodeButton = true, + hasOtherAccounts = true, + ), + it.stateFlow.value, + ) + coVerify { authRepository.requestOneTimePasscode() } + } + } + + @Test + fun `initial state should be correct when account is not restricted`() = runTest { + createViewModel() + .also { + assertEquals( + VerifyPasswordState( + title = BitwardenString.verify_your_master_password.asText(), + subtext = null, + hasOtherAccounts = true, + accountSummaryListItem = AccountSelectionListItem( + userId = DEFAULT_USER_ID, + email = DEFAULT_USER_STATE.activeAccount.email, + avatarColorHex = DEFAULT_USER_STATE.activeAccount.avatarColorHex, + isItemRestricted = false, + initials = DEFAULT_USER_STATE.activeAccount.initials, ), ), - awaitItem(), + it.stateFlow.value, ) } - - coVerify(exactly = 1) { - authRepository.activeUserId - authRepository.validatePassword(password = "mockInput") - } - coVerify(exactly = 0) { - authRepository.switchAccount(userId = any()) - } - } } - @Suppress("MaxLineLength") - @Test - fun `UnlockClick with non-empty input should show loading dialog, switch accounts, then validate password when selected account is not active and switch is successful`() = - runTest { - val initialState = DEFAULT_STATE.copy( - accountSummaryListItem = DEFAULT_ACCOUNT_SELECTION_LIST_ITEM - .copy(userId = "otherUserId"), - input = "mockInput", - ) + @Test + fun `initial state should be correct when account has item restrictions`() = runTest { every { - authRepository.switchAccount("otherUserId") - } returns SwitchAccountResult.AccountSwitched - coEvery { authRepository.validatePassword(password = "mockInput") } just awaits - createViewModel(state = initialState).also { viewModel -> - viewModel.trySendAction(VerifyPasswordAction.UnlockClick) - viewModel.stateFlow.test { + policyManager.getActivePolicies(PolicyTypeJson.RESTRICT_ITEM_TYPES) + } returns listOf( + createMockPolicy( + number = 1, + organizationId = DEFAULT_ORGANIZATION_ID, + isEnabled = true, + ), + ) + + createViewModel() + .also { assertEquals( - initialState.copy( - dialog = VerifyPasswordState.DialogState.Loading( - message = BitwardenString.loading.asText(), - ), + VerifyPasswordState( + title = BitwardenString.verify_your_master_password.asText(), + subtext = null, + hasOtherAccounts = true, + accountSummaryListItem = DEFAULT_ACCOUNT_SELECTION_LIST_ITEM + .copy(isItemRestricted = true), ), - awaitItem(), + it.stateFlow.value, ) } - coVerify { - authRepository.activeUserId - authRepository.switchAccount(userId = "otherUserId") - authRepository.validatePassword(password = "mockInput") - } - } } + } - @Suppress("MaxLineLength") - @Test - fun `UnlockClick with non-empty input should show error dialog when switch account is unsuccessful`() = - runTest { + @Nested + inner class ViewActions { + + @Test + fun `SendCodeClick should request otp code`() = runTest { val initialState = DEFAULT_STATE.copy( - accountSummaryListItem = DEFAULT_ACCOUNT_SELECTION_LIST_ITEM - .copy(userId = "otherUserId"), - input = "mockInput", + title = BitwardenString.verify_your_account_email_address.asText(), + subtext = BitwardenString + .enter_the_6_digit_code_that_was_emailed_to_the_address_below + .asText(), + showResendCodeButton = true, ) - every { - authRepository.switchAccount("otherUserId") - } returns SwitchAccountResult.NoChange - coEvery { authRepository.validatePassword(password = "mockInput") } just awaits - + coEvery { authRepository.requestOneTimePasscode() } returns RequestOtpResult.Success createViewModel(state = initialState).also { viewModel -> - viewModel.stateFlow.test { - // Await initial state update - awaitItem() - viewModel.trySendAction(VerifyPasswordAction.UnlockClick) - coVerify { - authRepository.activeUserId - authRepository.switchAccount(userId = "otherUserId") - } - coVerify(exactly = 0) { - authRepository.validatePassword(password = any()) - } - assertEquals( - initialState.copy( - dialog = VerifyPasswordState.DialogState.General( - title = BitwardenString.an_error_has_occurred.asText(), - message = BitwardenString.generic_error_message.asText(), - ), - ), - awaitItem(), - ) - } + viewModel.trySendAction(VerifyPasswordAction.ResendCodeClick) + coVerify { authRepository.requestOneTimePasscode() } } } - @Suppress("MaxLineLength") - @Test - fun `UnlockClick with non-empty input should show loading dialog, then unlock vault when vault is locked`() = - runTest { - val initialState = DEFAULT_STATE.copy(input = "mockInput") - every { vaultRepository.isVaultUnlocked(any()) } returns false - coEvery { - vaultRepository.unlockVaultWithMasterPassword(masterPassword = "mockInput") - } just awaits - createViewModel(state = initialState).also { viewModel -> - viewModel.trySendAction(VerifyPasswordAction.UnlockClick) - viewModel.stateFlow.test { - assertEquals( - initialState.copy( - dialog = VerifyPasswordState.DialogState.Loading( - message = BitwardenString.loading.asText(), - ), - ), - awaitItem(), - ) - coVerify { - vaultRepository.unlockVaultWithMasterPassword(masterPassword = "mockInput") - } - } - } - } - - @Test - fun `PasswordInputChangeReceive should update state`() = runTest { - createViewModel(state = DEFAULT_STATE).also { viewModel -> - viewModel.trySendAction( - VerifyPasswordAction.PasswordInputChangeReceive("mockInput"), - ) - assertEquals( - DEFAULT_STATE.copy(input = "mockInput"), - viewModel.stateFlow.value, - ) - } - } - - @Test - fun `DismissDialog should update state`() = runTest { - val initialState = DEFAULT_STATE.copy( - dialog = VerifyPasswordState.DialogState.Loading( - message = BitwardenString.loading.asText(), - ), - ) - createViewModel(state = initialState).also { viewModel -> - viewModel.trySendAction(VerifyPasswordAction.DismissDialog) - assertEquals(null, viewModel.stateFlow.value.dialog) - } - } - - @Suppress("MaxLineLength") - @Test - fun `ValidatePasswordResultReceive should send PasswordVerified event and clear input when result is Success and isValid is true`() = - runTest { - createViewModel(state = DEFAULT_STATE.copy(input = "mockInput")) - .also { viewModel -> - viewModel.trySendAction( - VerifyPasswordAction.Internal.ValidatePasswordResultReceive( - ValidatePasswordResult.Success(isValid = true), - ), - ) - assertEquals( - DEFAULT_STATE.copy(input = ""), - viewModel.stateFlow.value, - ) - viewModel.eventFlow.test { - assertEquals( - VerifyPasswordEvent.PasswordVerified(DEFAULT_USER_ID), - awaitItem(), - ) - } - } - } - - @Suppress("MaxLineLength") - @Test - fun `ValidatePasswordResultReceive should show error dialog when result is Success and isValid is false`() = - runTest { + @Test + fun `SendOtpCodeResultReceive success should show snackbar`() = runTest { createViewModel().also { viewModel -> viewModel.trySendAction( - VerifyPasswordAction.Internal.ValidatePasswordResultReceive( - ValidatePasswordResult.Success(isValid = false), + VerifyPasswordAction.Internal.SendOtpCodeResultReceive( + RequestOtpResult.Success, ), ) + + viewModel.eventFlow.test { + assertEquals( + VerifyPasswordEvent.ShowSnackbar(BitwardenString.code_sent.asText()), + awaitItem(), + ) + } + } + } + + @Test + fun `SendOtpCodeResultReceive error should show dialog`() = runTest { + createViewModel().also { viewModel -> + viewModel.trySendAction( + VerifyPasswordAction.Internal.SendOtpCodeResultReceive( + RequestOtpResult.Error( + message = "error", + error = IllegalStateException(), + ), + ), + ) + assertEquals( VerifyPasswordState.DialogState.General( title = BitwardenString.an_error_has_occurred.asText(), - message = BitwardenString.invalid_master_password.asText(), - error = null, + message = "error".asText(), ), viewModel.stateFlow.value.dialog, ) } } - @Test - fun `ValidatePasswordResultReceive should show error dialog when result is Error`() = runTest { - val throwable = Throwable() - createViewModel().also { viewModel -> - viewModel.trySendAction( - VerifyPasswordAction.Internal.ValidatePasswordResultReceive( - ValidatePasswordResult.Error(error = throwable), + @Test + fun `ContinueClick with otp should verify otp`() = runTest { + val initialState = DEFAULT_STATE.copy(showResendCodeButton = true, input = "123456") + coEvery { + authRepository.verifyOneTimePasscode("123456") + } returns VerifyOtpResult.Verified + + createViewModel(state = initialState).also { viewModel -> + viewModel.trySendAction(VerifyPasswordAction.ContinueClick) + + coVerify { authRepository.verifyOneTimePasscode("123456") } + } + } + + @Test + fun `VerifyOtpResultReceive verified should send event`() = runTest { + createViewModel().also { viewModel -> + viewModel.trySendAction( + VerifyPasswordAction.Internal.VerifyOtpResultReceive( + VerifyOtpResult.Verified, + ), + ) + + viewModel.eventFlow.test { + assertEquals( + VerifyPasswordEvent.PasswordVerified(DEFAULT_USER_ID), + awaitItem(), + ) + } + } + } + + @Test + fun `VerifyOtpResultReceive not verified should show dialog`() = runTest { + createViewModel().also { viewModel -> + viewModel.trySendAction( + VerifyPasswordAction.Internal.VerifyOtpResultReceive( + VerifyOtpResult.NotVerified( + error = IllegalStateException(), + errorMessage = null, + ), + ), + ) + + assertEquals( + VerifyPasswordState.DialogState.General( + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.invalid_verification_code.asText(), + ), + viewModel.stateFlow.value.dialog, + ) + } + } + + @Test + fun `NavigateBackClick should send NavigateBack event`() = runTest { + createViewModel().also { + it.trySendAction(VerifyPasswordAction.NavigateBackClick) + it.eventFlow.test { + assertEquals( + VerifyPasswordEvent.NavigateBack, + awaitItem(), + ) + } + } + } + + @Test + fun `NavigateBackClick should send CancelExport event when hasOtherAccounts is false`() = + runTest { + val initialState = DEFAULT_STATE.copy(hasOtherAccounts = false) + createViewModel(state = initialState).also { + it.trySendAction(VerifyPasswordAction.NavigateBackClick) + it.eventFlow.test { + assertEquals( + VerifyPasswordEvent.CancelExport, + awaitItem(), + ) + } + } + } + + @Test + fun `ContinueClick with empty input should show error dialog`() = runTest { + createViewModel().also { + it.trySendAction(VerifyPasswordAction.ContinueClick) + it.stateFlow.test { + assertEquals( + DEFAULT_STATE.copy( + dialog = VerifyPasswordState.DialogState.General( + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required.asText( + BitwardenString.master_password.asText(), + ), + ), + ), + awaitItem(), + ) + coVerify(exactly = 0) { + authRepository.activeUserId + authRepository.validatePassword(password = any()) + authRepository.switchAccount(userId = any()) + } + } + } + } + + @Suppress("MaxLineLength") + @Test + fun `ContinueClick with non-empty input should show loading dialog, validate password and send validates password`() = + runTest { + val initialState = DEFAULT_STATE.copy(input = "mockInput") + coEvery { authRepository.validatePassword(password = "mockInput") } just awaits + + createViewModel(state = initialState).also { viewModel -> + viewModel.trySendAction(VerifyPasswordAction.ContinueClick) + + viewModel.stateFlow.test { + assertEquals( + initialState.copy( + dialog = VerifyPasswordState.DialogState.Loading( + message = BitwardenString.loading.asText(), + ), + ), + awaitItem(), + ) + } + + coVerify(exactly = 1) { + authRepository.activeUserId + authRepository.validatePassword(password = "mockInput") + } + coVerify(exactly = 0) { + authRepository.switchAccount(userId = any()) + } + } + } + + @Suppress("MaxLineLength") + @Test + fun `ContinueClick with non-empty input should show loading dialog, switch accounts, then validate password when selected account is not active and switch is successful`() = + runTest { + val initialState = DEFAULT_STATE.copy( + accountSummaryListItem = DEFAULT_ACCOUNT_SELECTION_LIST_ITEM + .copy(userId = "otherUserId"), + input = "mockInput", + ) + every { + authRepository.switchAccount("otherUserId") + } returns SwitchAccountResult.AccountSwitched + coEvery { authRepository.validatePassword(password = "mockInput") } just awaits + createViewModel(state = initialState).also { viewModel -> + viewModel.trySendAction(VerifyPasswordAction.ContinueClick) + viewModel.stateFlow.test { + assertEquals( + initialState.copy( + dialog = VerifyPasswordState.DialogState.Loading( + message = BitwardenString.loading.asText(), + ), + ), + awaitItem(), + ) + } + coVerify { + authRepository.activeUserId + authRepository.switchAccount(userId = "otherUserId") + authRepository.validatePassword(password = "mockInput") + } + } + } + + @Suppress("MaxLineLength") + @Test + fun `ContinueClick with non-empty input should show error dialog when switch account is unsuccessful`() = + runTest { + val initialState = DEFAULT_STATE.copy( + accountSummaryListItem = DEFAULT_ACCOUNT_SELECTION_LIST_ITEM + .copy(userId = "otherUserId"), + input = "mockInput", + ) + every { + authRepository.switchAccount("otherUserId") + } returns SwitchAccountResult.NoChange + coEvery { authRepository.validatePassword(password = "mockInput") } just awaits + + createViewModel(state = initialState).also { viewModel -> + viewModel.stateFlow.test { + // Await initial state update + awaitItem() + viewModel.trySendAction(VerifyPasswordAction.ContinueClick) + coVerify { + authRepository.activeUserId + authRepository.switchAccount(userId = "otherUserId") + } + coVerify(exactly = 0) { + authRepository.validatePassword(password = any()) + } + assertEquals( + initialState.copy( + dialog = VerifyPasswordState.DialogState.General( + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), + ), + ), + awaitItem(), + ) + } + } + } + + @Suppress("MaxLineLength") + @Test + fun `ContinueClick with non-empty input should show loading dialog, then unlock vault when vault is locked`() = + runTest { + val initialState = DEFAULT_STATE.copy(input = "mockInput") + every { vaultRepository.isVaultUnlocked(any()) } returns false + coEvery { + vaultRepository.unlockVaultWithMasterPassword(masterPassword = "mockInput") + } just awaits + createViewModel(state = initialState).also { viewModel -> + viewModel.trySendAction(VerifyPasswordAction.ContinueClick) + viewModel.stateFlow.test { + assertEquals( + initialState.copy( + dialog = VerifyPasswordState.DialogState.Loading( + message = BitwardenString.loading.asText(), + ), + ), + awaitItem(), + ) + coVerify { + vaultRepository.unlockVaultWithMasterPassword(masterPassword = "mockInput") + } + } + } + } + + @Test + fun `PasswordInputChangeReceive should update state`() = runTest { + createViewModel(state = DEFAULT_STATE).also { viewModel -> + viewModel.trySendAction( + VerifyPasswordAction.PasswordInputChangeReceive("mockInput"), + ) + assertEquals( + DEFAULT_STATE.copy(input = "mockInput"), + viewModel.stateFlow.value, + ) + } + } + + @Test + fun `DismissDialog should update state`() = runTest { + val initialState = DEFAULT_STATE.copy( + dialog = VerifyPasswordState.DialogState.Loading( + message = BitwardenString.loading.asText(), ), ) - assertEquals( - VerifyPasswordState.DialogState.General( - title = BitwardenString.an_error_has_occurred.asText(), - message = BitwardenString.generic_error_message.asText(), - error = throwable, - ), - viewModel.stateFlow.value.dialog, - ) + createViewModel(state = initialState).also { viewModel -> + viewModel.trySendAction(VerifyPasswordAction.DismissDialog) + assertEquals(null, viewModel.stateFlow.value.dialog) + } } } - @Suppress("MaxLineLength") - @Test - fun `UnlockVaultResultReceive should send PasswordVerified event and clear inputs when vault unlock result is Success`() = - runTest { - createViewModel(state = DEFAULT_STATE.copy(input = "mockInput")) - .also { viewModel -> + @Nested + inner class InternalActions { + + @Suppress("MaxLineLength") + @Test + fun `ValidatePasswordResultReceive should send PasswordVerified event when result is Success and isValid is true`() = + runTest { + createViewModel().also { viewModel -> viewModel.trySendAction( - VerifyPasswordAction.Internal.UnlockVaultResultReceive( - VaultUnlockResult.Success, + VerifyPasswordAction.Internal.ValidatePasswordResultReceive( + ValidatePasswordResult.Success(isValid = true), ), ) - assertEquals( - DEFAULT_STATE.copy(input = ""), - viewModel.stateFlow.value, - ) viewModel.eventFlow.test { assertEquals( VerifyPasswordEvent.PasswordVerified(DEFAULT_USER_ID), @@ -399,126 +505,189 @@ class VerifyPasswordViewModelTest : BaseViewModelTest() { ) } } - } - - @Test - fun `UnlockVaultResultReceive should show error dialog when vault unlock result is Error`() = - runTest { - val throwable = Throwable() - createViewModel().also { viewModel -> - viewModel.trySendAction( - VerifyPasswordAction.Internal.UnlockVaultResultReceive( - VaultUnlockResult.GenericError(error = throwable), - ), - ) - assertEquals( - DEFAULT_STATE.copy( - dialog = VerifyPasswordState.DialogState.General( - title = BitwardenString.an_error_has_occurred.asText(), - message = BitwardenString.generic_error_message.asText(), - error = throwable, - ), - ), - viewModel.stateFlow.value, - ) } - } - @Suppress("MaxLineLength") - @Test - fun `UnlockVaultResultReceive should show error dialog when vault unlock result is AuthenticationError`() = - runTest { - val throwable = Throwable() - createViewModel().also { viewModel -> - viewModel.trySendAction( - VerifyPasswordAction.Internal.UnlockVaultResultReceive( - VaultUnlockResult.AuthenticationError(error = throwable), - ), - ) - assertEquals( - DEFAULT_STATE.copy( - dialog = VerifyPasswordState.DialogState.General( + @Suppress("MaxLineLength") + @Test + fun `ValidatePasswordResultReceive should show error dialog when result is Success and isValid is false`() = + runTest { + createViewModel().also { viewModel -> + viewModel.trySendAction( + VerifyPasswordAction.Internal.ValidatePasswordResultReceive( + ValidatePasswordResult.Success(isValid = false), + ), + ) + assertEquals( + VerifyPasswordState.DialogState.General( title = BitwardenString.an_error_has_occurred.asText(), message = BitwardenString.invalid_master_password.asText(), - error = throwable, + error = null, ), - ), - viewModel.stateFlow.value, - ) + viewModel.stateFlow.value.dialog, + ) + } } - } - @Suppress("MaxLineLength") - @Test - fun `UnlockVaultResultReceive should show error dialog when vault unlock result is BiometricDecodingError`() = - runTest { - val throwable = Throwable() - createViewModel().also { viewModel -> - viewModel.trySendAction( - VerifyPasswordAction.Internal.UnlockVaultResultReceive( - VaultUnlockResult.BiometricDecodingError(error = throwable), - ), - ) - assertEquals( - DEFAULT_STATE.copy( - dialog = VerifyPasswordState.DialogState.General( + @Test + fun `ValidatePasswordResultReceive should show error dialog when result is Error`() = + runTest { + val throwable = Throwable() + createViewModel().also { viewModel -> + viewModel.trySendAction( + VerifyPasswordAction.Internal.ValidatePasswordResultReceive( + ValidatePasswordResult.Error(error = throwable), + ), + ) + assertEquals( + VerifyPasswordState.DialogState.General( title = BitwardenString.an_error_has_occurred.asText(), message = BitwardenString.generic_error_message.asText(), error = throwable, ), - ), - viewModel.stateFlow.value, - ) + viewModel.stateFlow.value.dialog, + ) + } } - } - @Suppress("MaxLineLength") - @Test - fun `UnlockVaultResultReceive should show error dialog when vault unlock result is InvalidStateError`() = - runTest { - val throwable = Throwable() - createViewModel().also { viewModel -> - viewModel.trySendAction( - VerifyPasswordAction.Internal.UnlockVaultResultReceive( - VaultUnlockResult.InvalidStateError(error = throwable), - ), - ) - assertEquals( - DEFAULT_STATE.copy( - dialog = VerifyPasswordState.DialogState.General( - title = BitwardenString.an_error_has_occurred.asText(), - message = BitwardenString.generic_error_message.asText(), - error = throwable, + @Suppress("MaxLineLength") + @Test + fun `UnlockVaultResultReceive should send PasswordVerified event when vault unlock result is Success`() = + runTest { + createViewModel().also { viewModel -> + viewModel.trySendAction( + VerifyPasswordAction.Internal.UnlockVaultResultReceive( + VaultUnlockResult.Success, ), - ), - viewModel.stateFlow.value, - ) + ) + viewModel.eventFlow.test { + assertEquals( + VerifyPasswordEvent.PasswordVerified(DEFAULT_USER_ID), + awaitItem(), + ) + } + } } - } - @Suppress("MaxLineLength") - @Test - fun `UnlockVaultResultReceive should show error dialog when vault unlock result is GenericError`() = - runTest { - val throwable = Throwable() - createViewModel().also { viewModel -> - viewModel.trySendAction( - VerifyPasswordAction.Internal.UnlockVaultResultReceive( - VaultUnlockResult.GenericError(error = throwable), - ), - ) - assertEquals( - DEFAULT_STATE.copy( - dialog = VerifyPasswordState.DialogState.General( - title = BitwardenString.an_error_has_occurred.asText(), - message = BitwardenString.generic_error_message.asText(), - error = throwable, + @Suppress("MaxLineLength") + @Test + fun `UnlockVaultResultReceive should show error dialog when vault unlock result is Error`() = + runTest { + val throwable = Throwable() + createViewModel().also { viewModel -> + viewModel.trySendAction( + VerifyPasswordAction.Internal.UnlockVaultResultReceive( + VaultUnlockResult.GenericError(error = throwable), ), - ), - viewModel.stateFlow.value, - ) + ) + assertEquals( + DEFAULT_STATE.copy( + dialog = VerifyPasswordState.DialogState.General( + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), + error = throwable, + ), + ), + viewModel.stateFlow.value, + ) + } } - } + + @Suppress("MaxLineLength") + @Test + fun `UnlockVaultResultReceive should show error dialog when vault unlock result is AuthenticationError`() = + runTest { + val throwable = Throwable() + createViewModel().also { viewModel -> + viewModel.trySendAction( + VerifyPasswordAction.Internal.UnlockVaultResultReceive( + VaultUnlockResult.AuthenticationError(error = throwable), + ), + ) + assertEquals( + DEFAULT_STATE.copy( + dialog = VerifyPasswordState.DialogState.General( + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.invalid_master_password.asText(), + error = throwable, + ), + ), + viewModel.stateFlow.value, + ) + } + } + + @Suppress("MaxLineLength") + @Test + fun `UnlockVaultResultReceive should show error dialog when vault unlock result is BiometricDecodingError`() = + runTest { + val throwable = Throwable() + createViewModel().also { viewModel -> + viewModel.trySendAction( + VerifyPasswordAction.Internal.UnlockVaultResultReceive( + VaultUnlockResult.BiometricDecodingError(error = throwable), + ), + ) + assertEquals( + DEFAULT_STATE.copy( + dialog = VerifyPasswordState.DialogState.General( + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), + error = throwable, + ), + ), + viewModel.stateFlow.value, + ) + } + } + + @Suppress("MaxLineLength") + @Test + fun `UnlockVaultResultReceive should show error dialog when vault unlock result is InvalidStateError`() = + runTest { + val throwable = Throwable() + createViewModel().also { viewModel -> + viewModel.trySendAction( + VerifyPasswordAction.Internal.UnlockVaultResultReceive( + VaultUnlockResult.InvalidStateError(error = throwable), + ), + ) + assertEquals( + DEFAULT_STATE.copy( + dialog = VerifyPasswordState.DialogState.General( + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), + error = throwable, + ), + ), + viewModel.stateFlow.value, + ) + } + } + + @Suppress("MaxLineLength") + @Test + fun `UnlockVaultResultReceive should show error dialog when vault unlock result is GenericError`() = + runTest { + val throwable = Throwable() + createViewModel().also { viewModel -> + viewModel.trySendAction( + VerifyPasswordAction.Internal.UnlockVaultResultReceive( + VaultUnlockResult.GenericError(error = throwable), + ), + ) + assertEquals( + DEFAULT_STATE.copy( + dialog = VerifyPasswordState.DialogState.General( + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), + error = throwable, + ), + ), + viewModel.stateFlow.value, + ) + } + } + } private fun createViewModel( state: VerifyPasswordState? = null, @@ -613,6 +782,8 @@ private val DEFAULT_ACCOUNT_SELECTION_LIST_ITEM = AccountSelectionListItem( initials = DEFAULT_USER_STATE.activeAccount.initials, ) private val DEFAULT_STATE = VerifyPasswordState( + title = BitwardenString.verify_your_master_password.asText(), + subtext = null, hasOtherAccounts = true, accountSummaryListItem = DEFAULT_ACCOUNT_SELECTION_LIST_ITEM, input = "", diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/SettingsRepository.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/SettingsRepository.kt index de08e0b83e..51241506da 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/SettingsRepository.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/SettingsRepository.kt @@ -67,16 +67,16 @@ interface SettingsRepository { */ var isScreenCaptureAllowed: Boolean - /** - * A set of Bitwarden account IDs that have previously been synced. - */ - var previouslySyncedBitwardenAccountIds: Set - /** * Whether or not screen capture is allowed for the current user. */ val isScreenCaptureAllowedStateFlow: StateFlow + /** + * A set of Bitwarden account IDs that have previously been synced. + */ + var previouslySyncedBitwardenAccountIds: Set + /** * Clears any previously stored encrypted user key used with biometrics for the current user. */ diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingGraphNavigation.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingGraphNavigation.kt index 119679c67a..a61f2d1da2 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingGraphNavigation.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingGraphNavigation.kt @@ -49,6 +49,7 @@ fun NavGraphBuilder.itemListingGraph( ) itemSearchDestination( onNavigateBack = { navController.popBackStack() }, + onNavigateToEdit = navigateToEditItem, ) qrCodeScanDestination( onNavigateBack = { navController.popBackStack() }, diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingScreen.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingScreen.kt index 2c36540758..98be4a7819 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingScreen.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingScreen.kt @@ -665,8 +665,8 @@ private fun ContentPreview() { ItemListingContent( state = ItemListingState.ViewState.Content( actionCard = ItemListingState.ActionCardState.None, - favoriteItems = emptyList(), - itemList = listOf( + favoriteItems = persistentListOf(), + itemList = persistentListOf( VerificationCodeDisplayItem( id = "", title = "Local item", @@ -677,17 +677,17 @@ private fun ContentPreview() { authCode = "123456", favorite = false, showMoveToBitwarden = true, - allowLongPressActions = true, + showOverflow = true, ), ), sharedItems = SharedCodesDisplayState.Codes( - sections = listOf( + sections = persistentListOf( SharedCodesDisplayState.SharedCodesAccountSection( id = "id", label = "longemailaddress+verification+codes@email.com | Bitawrden.eu (1)" .asText(), - codes = listOf( + codes = persistentListOf( VerificationCodeDisplayItem( id = "", title = "Shared item", @@ -698,7 +698,7 @@ private fun ContentPreview() { authCode = "123456", favorite = false, showMoveToBitwarden = false, - allowLongPressActions = false, + showOverflow = false, ), ), isExpanded = true, diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingViewModel.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingViewModel.kt index 501c525b66..cae7f4b223 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingViewModel.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingViewModel.kt @@ -1,7 +1,7 @@ package com.bitwarden.authenticator.ui.authenticator.feature.itemlisting -import android.net.Uri import android.os.Parcelable +import androidx.core.net.toUri import androidx.lifecycle.viewModelScope import com.bitwarden.authenticator.data.authenticator.datasource.disk.entity.AuthenticatorItemAlgorithm import com.bitwarden.authenticator.data.authenticator.datasource.disk.entity.AuthenticatorItemEntity @@ -31,6 +31,9 @@ import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.launchIn @@ -478,7 +481,7 @@ class ItemListingViewModel @Inject constructor( SharedVerificationCodesState.Loading, SharedVerificationCodesState.OsVersionNotSupported, SharedVerificationCodesState.SyncNotEnabled, - -> SharedCodesDisplayState.Codes(emptyList()) + -> SharedCodesDisplayState.Codes(persistentListOf()) is SharedVerificationCodesState.Success -> { val viewState = state.viewState as? ItemListingState.ViewState.Content @@ -509,9 +512,10 @@ class ItemListingViewModel @Inject constructor( sharedVerificationCodesState = authenticatorRepository .sharedCodesStateFlow .value, - allowLongPressActions = true, + showOverflow = true, ) - }, + } + .toImmutableList(), itemList = localItems .filter { it.source is AuthenticatorItem.Source.Local && !it.source.isFavorite } .map { @@ -520,9 +524,10 @@ class ItemListingViewModel @Inject constructor( sharedVerificationCodesState = authenticatorRepository .sharedCodesStateFlow .value, - allowLongPressActions = true, + showOverflow = true, ) - }, + } + .toImmutableList(), sharedItems = sharedItemsState, actionCard = action.sharedCodesState.toActionCard(), ) @@ -590,15 +595,18 @@ class ItemListingViewModel @Inject constructor( private fun handleSectionExpandedClick(action: ItemListingAction.SectionExpandedClick) { updateSharedItems { codes -> codes.copy( - sections = codes.sections.map { - it.copy( - isExpanded = if (it == action.section) { - !it.isExpanded - } else { - it.isExpanded - }, - ) - }, + sections = codes + .sections + .map { + it.copy( + isExpanded = if (it == action.section) { + !it.isExpanded + } else { + it.isExpanded + }, + ) + } + .toImmutableList(), ) } } @@ -631,7 +639,7 @@ class ItemListingViewModel @Inject constructor( } private fun String.toAuthenticatorEntityOrNull(): AuthenticatorItemEntity? { - val uri = Uri.parse(this) + val uri = this.toUri() val type = AuthenticatorItemType .entries @@ -747,8 +755,8 @@ data class ItemListingState( @Parcelize data class Content( val actionCard: ActionCardState, - val favoriteItems: List, - val itemList: List, + val favoriteItems: ImmutableList, + val itemList: ImmutableList, val sharedItems: SharedCodesDisplayState, ) : ViewState() { diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchContent.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchContent.kt index 27ffb2d496..b130cbd080 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchContent.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchContent.kt @@ -16,6 +16,8 @@ import androidx.compose.ui.unit.dp import com.bitwarden.authenticator.ui.authenticator.feature.search.handlers.SearchHandlers import com.bitwarden.authenticator.ui.platform.components.listitem.VaultVerificationCodeItem import com.bitwarden.authenticator.ui.platform.components.listitem.model.SharedCodesDisplayState +import com.bitwarden.authenticator.ui.platform.components.listitem.model.VaultDropdownMenuAction +import com.bitwarden.authenticator.ui.platform.components.listitem.model.VerificationCodeDisplayItem import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.base.util.toListItemCardStyle import com.bitwarden.ui.platform.components.header.BitwardenListHeaderText @@ -53,7 +55,7 @@ fun ItemSearchContent( VaultVerificationCodeItem( displayItem = item, onItemClick = { searchHandlers.onItemClick(item.authCode) }, - onDropdownMenuClick = { }, + onDropdownMenuClick = { searchHandlers.onDropdownMenuClick(it, item) }, cardStyle = viewState.itemList.toListItemCardStyle(index = index), modifier = Modifier .fillMaxWidth() @@ -70,6 +72,7 @@ fun ItemSearchContent( sharedCodes( sharedItems = viewState.sharedItems, onCopyClick = searchHandlers.onItemClick, + onDropdownMenuClick = searchHandlers.onDropdownMenuClick, ) item { @@ -82,6 +85,7 @@ fun ItemSearchContent( private fun LazyListScope.sharedCodes( sharedItems: SharedCodesDisplayState, onCopyClick: (authCode: String) -> Unit, + onDropdownMenuClick: (VaultDropdownMenuAction, VerificationCodeDisplayItem) -> Unit, ) { when (sharedItems) { is SharedCodesDisplayState.Codes -> { @@ -101,7 +105,7 @@ private fun LazyListScope.sharedCodes( VaultVerificationCodeItem( displayItem = item, onItemClick = { onCopyClick(item.authCode) }, - onDropdownMenuClick = { }, + onDropdownMenuClick = { onDropdownMenuClick(it, item) }, cardStyle = section.codes.toListItemCardStyle(index = index), modifier = Modifier .fillMaxWidth() diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchNavigation.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchNavigation.kt index 6bb71bc0a0..869178f1e1 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchNavigation.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchNavigation.kt @@ -16,10 +16,12 @@ data object ItemSearchRoute */ fun NavGraphBuilder.itemSearchDestination( onNavigateBack: () -> Unit, + onNavigateToEdit: (String) -> Unit, ) { composableWithSlideTransitions { ItemSearchScreen( onNavigateBack = onNavigateBack, + onNavigateToEdit = onNavigateToEdit, ) } } diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchScreen.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchScreen.kt index d8c67ea6a0..de2893a495 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchScreen.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchScreen.kt @@ -1,6 +1,5 @@ package com.bitwarden.authenticator.ui.authenticator.feature.search -import android.widget.Toast import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.TopAppBarDefaults @@ -10,8 +9,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalResources import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -22,36 +19,41 @@ import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.bottomDivider import com.bitwarden.ui.platform.components.appbar.BitwardenSearchTopAppBar import com.bitwarden.ui.platform.components.appbar.NavigationIcon +import com.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog +import com.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog +import com.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog import com.bitwarden.ui.platform.components.scaffold.BitwardenScaffold +import com.bitwarden.ui.platform.components.snackbar.BitwardenSnackbarHost +import com.bitwarden.ui.platform.components.snackbar.model.rememberBitwardenSnackbarHostState import com.bitwarden.ui.platform.resource.BitwardenDrawable import com.bitwarden.ui.platform.resource.BitwardenString /** * The search screen for authenticator items. */ -@Suppress("LongMethod") @OptIn(ExperimentalMaterial3Api::class) @Composable fun ItemSearchScreen( viewModel: ItemSearchViewModel = hiltViewModel(), onNavigateBack: () -> Unit, + onNavigateToEdit: (String) -> Unit, ) { val state by viewModel.stateFlow.collectAsStateWithLifecycle() val searchHandlers = remember(viewModel) { SearchHandlers.create(viewModel) } - val context = LocalContext.current - val resources = LocalResources.current - + val snackbarHostState = rememberBitwardenSnackbarHostState() EventsEffect(viewModel = viewModel) { event -> when (event) { is ItemSearchEvent.NavigateBack -> onNavigateBack() - is ItemSearchEvent.ShowToast -> { - Toast - .makeText(context, event.message(resources), Toast.LENGTH_SHORT) - .show() - } + is ItemSearchEvent.ShowSnackbar -> snackbarHostState.showSnackbar(event.data) + is ItemSearchEvent.NavigateToEditItem -> onNavigateToEdit(event.itemId) } } + ItemSearchDialogs( + dialogState = state.dialog, + searchHandlers = searchHandlers, + ) + val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) BitwardenScaffold( modifier = Modifier @@ -73,6 +75,7 @@ fun ItemSearchScreen( ), ) }, + snackbarHost = { BitwardenSnackbarHost(bitwardenHostState = snackbarHostState) }, ) { when (val viewState = state.viewState) { is ItemSearchState.ViewState.Content -> { @@ -92,3 +95,38 @@ fun ItemSearchScreen( } } } + +@Composable +private fun ItemSearchDialogs( + dialogState: ItemSearchState.DialogState?, + searchHandlers: SearchHandlers, +) { + when (dialogState) { + is ItemSearchState.DialogState.Error -> { + BitwardenBasicDialog( + title = dialogState.title(), + message = dialogState.message(), + throwable = dialogState.throwable, + onDismissRequest = searchHandlers.onDismissDialog, + ) + } + + is ItemSearchState.DialogState.DeleteConfirmationPrompt -> { + BitwardenTwoButtonDialog( + title = stringResource(id = BitwardenString.delete), + message = dialogState.message(), + confirmButtonText = stringResource(id = BitwardenString.okay), + dismissButtonText = stringResource(id = BitwardenString.cancel), + onConfirmClick = { searchHandlers.onConfirmDeleteClick(dialogState.itemId) }, + onDismissClick = searchHandlers.onDismissDialog, + onDismissRequest = searchHandlers.onDismissDialog, + ) + } + + ItemSearchState.DialogState.Loading -> { + BitwardenLoadingDialog(text = stringResource(id = BitwardenString.loading)) + } + + null -> Unit + } +} diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchViewModel.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchViewModel.kt index d4469b277b..591d3e7cca 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchViewModel.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchViewModel.kt @@ -5,23 +5,32 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.bitwarden.authenticator.data.authenticator.manager.model.VerificationCodeItem import com.bitwarden.authenticator.data.authenticator.repository.AuthenticatorRepository +import com.bitwarden.authenticator.data.authenticator.repository.model.DeleteItemResult import com.bitwarden.authenticator.data.authenticator.repository.model.SharedVerificationCodesState import com.bitwarden.authenticator.data.platform.manager.clipboard.BitwardenClipboardManager import com.bitwarden.authenticator.ui.authenticator.feature.util.toDisplayItem import com.bitwarden.authenticator.ui.authenticator.feature.util.toSharedCodesDisplayState import com.bitwarden.authenticator.ui.platform.components.listitem.model.SharedCodesDisplayState +import com.bitwarden.authenticator.ui.platform.components.listitem.model.VaultDropdownMenuAction import com.bitwarden.authenticator.ui.platform.components.listitem.model.VerificationCodeDisplayItem +import com.bitwarden.authenticatorbridge.manager.AuthenticatorBridgeManager import com.bitwarden.core.data.repository.model.DataState import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.platform.base.util.removeDiacritics +import com.bitwarden.ui.platform.components.snackbar.model.BitwardenSnackbarData import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch import kotlinx.parcelize.Parcelize import javax.inject.Inject @@ -36,11 +45,13 @@ class ItemSearchViewModel @Inject constructor( savedStateHandle: SavedStateHandle, private val clipboardManager: BitwardenClipboardManager, private val authenticatorRepository: AuthenticatorRepository, + private val authenticatorBridgeManager: AuthenticatorBridgeManager, ) : BaseViewModel( initialState = savedStateHandle[KEY_STATE] ?: ItemSearchState( searchTerm = "", viewState = ItemSearchState.ViewState.Empty(message = null), + dialog = null, ), ) { @@ -57,27 +68,92 @@ class ItemSearchViewModel @Inject constructor( override fun handleAction(action: ItemSearchAction) { when (action) { - is ItemSearchAction.BackClick -> { - sendEvent(ItemSearchEvent.NavigateBack) + is ItemSearchAction.BackClick -> handleBackClick() + is ItemSearchAction.ConfirmDeleteClick -> handleConfirmDeleteClick(action) + is ItemSearchAction.DismissDialog -> handleDismissDialog() + is ItemSearchAction.SearchTermChange -> handleSearchTermChange(action) + is ItemSearchAction.ItemClick -> handleItemClick(action) + is ItemSearchAction.DropdownMenuClick -> handleDropdownMenuClick(action) + is ItemSearchAction.Internal -> handleInternalAction(action) + } + } + + private fun handleBackClick() { + sendEvent(ItemSearchEvent.NavigateBack) + } + + private fun handleConfirmDeleteClick(action: ItemSearchAction.ConfirmDeleteClick) { + mutableStateFlow.update { + it.copy(dialog = ItemSearchState.DialogState.Loading) + } + + viewModelScope.launch { + trySendAction( + ItemSearchAction.Internal.DeleteItemReceive( + result = authenticatorRepository.hardDeleteItem(action.itemId), + ), + ) + } + } + + private fun handleDismissDialog() { + mutableStateFlow.update { it.copy(dialog = null) } + } + + private fun handleSearchTermChange(action: ItemSearchAction.SearchTermChange) { + mutableStateFlow.update { it.copy(searchTerm = action.searchTerm) } + recalculateViewState() + } + + private fun handleItemClick(action: ItemSearchAction.ItemClick) { + clipboardManager.setText(action.authCode) + } + + private fun handleDropdownMenuClick(action: ItemSearchAction.DropdownMenuClick) { + when (action.menuAction) { + VaultDropdownMenuAction.COPY_CODE -> clipboardManager.setText(action.item.authCode) + VaultDropdownMenuAction.COPY_TO_BITWARDEN -> { + viewModelScope.launch { + val item = authenticatorRepository + .getItemStateFlow(itemId = action.item.id) + .first { it.data != null } + val isSuccess = authenticatorBridgeManager.startAddTotpLoginItemFlow( + totpUri = item.data?.toOtpAuthUriString().orEmpty(), + ) + sendAction(ItemSearchAction.Internal.AddTotpLoginItemFlowResult(isSuccess)) + } } - is ItemSearchAction.SearchTermChange -> { - mutableStateFlow.update { it.copy(searchTerm = action.searchTerm) } - recalculateViewState() + VaultDropdownMenuAction.EDIT -> { + sendEvent(ItemSearchEvent.NavigateToEditItem(action.item.id)) } - is ItemSearchAction.ItemClick -> { - clipboardManager.setText(action.authCode) - sendEvent( - event = ItemSearchEvent.ShowToast( - message = BitwardenString.value_has_been_copied.asText(action.authCode), - ), - ) + VaultDropdownMenuAction.DELETE -> { + mutableStateFlow.update { + it.copy( + dialog = ItemSearchState.DialogState.DeleteConfirmationPrompt( + message = BitwardenString + .do_you_really_want_to_permanently_delete_this_cannot_be_undone + .asText(), + itemId = action.item.id, + ), + ) + } } + } + } + private fun handleInternalAction(action: ItemSearchAction.Internal) { + when (action) { is ItemSearchAction.Internal.AuthenticatorDataReceive -> { handleAuthenticatorDataReceive(action) } + + is ItemSearchAction.Internal.AddTotpLoginItemFlowResult -> { + handleAddTotpLoginItemFlowResult(action) + } + + is ItemSearchAction.Internal.DeleteItemReceive -> handleDeleteItemReceive(action) } } @@ -92,6 +168,40 @@ class ItemSearchViewModel @Inject constructor( } } + private fun handleAddTotpLoginItemFlowResult( + action: ItemSearchAction.Internal.AddTotpLoginItemFlowResult, + ) { + if (action.isSuccess) return + mutableStateFlow.update { + it.copy( + dialog = ItemSearchState.DialogState.Error( + title = BitwardenString.something_went_wrong.asText(), + message = BitwardenString.please_try_again.asText(), + ), + ) + } + } + + private fun handleDeleteItemReceive(action: ItemSearchAction.Internal.DeleteItemReceive) { + when (action.result) { + DeleteItemResult.Error -> { + mutableStateFlow.update { + it.copy( + dialog = ItemSearchState.DialogState.Error( + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), + ), + ) + } + } + + DeleteItemResult.Success -> { + mutableStateFlow.update { it.copy(dialog = null) } + sendEvent(ItemSearchEvent.ShowSnackbar(BitwardenString.item_deleted.asText())) + } + } + } + //region Utility Functions private fun recalculateViewState() { authenticatorRepository.getLocalVerificationCodesFlow() @@ -166,7 +276,7 @@ class ItemSearchViewModel @Inject constructor( SharedVerificationCodesState.Loading, SharedVerificationCodesState.OsVersionNotSupported, SharedVerificationCodesState.SyncNotEnabled, - -> SharedCodesDisplayState.Codes(emptyList()) + -> SharedCodesDisplayState.Codes(persistentListOf()) is SharedVerificationCodesState.Success -> { sharedData @@ -184,15 +294,17 @@ class ItemSearchViewModel @Inject constructor( else -> { ItemSearchState.ViewState.Content( - itemList = filteredLocalCodes.map { - it.toDisplayItem( - alertThresholdSeconds = 7, - sharedVerificationCodesState = authenticatorRepository - .sharedCodesStateFlow - .value, - allowLongPressActions = false, - ) - }, + itemList = filteredLocalCodes + .map { + it.toDisplayItem( + alertThresholdSeconds = 7, + sharedVerificationCodesState = authenticatorRepository + .sharedCodesStateFlow + .value, + showOverflow = true, + ) + } + .toImmutableList(), sharedItems = sharedItemsState, ) } @@ -208,6 +320,7 @@ class ItemSearchViewModel @Inject constructor( data class ItemSearchState( val searchTerm: String, val viewState: ViewState, + val dialog: DialogState?, ) : Parcelable { /** * Represents the specific view state for the search screen. @@ -219,7 +332,7 @@ data class ItemSearchState( */ @Parcelize data class Content( - val itemList: List, + val itemList: ImmutableList, val sharedItems: SharedCodesDisplayState, ) : ViewState() { /** @@ -239,6 +352,36 @@ data class ItemSearchState( @Parcelize data class Empty(val message: Text?) : ViewState() } + + /** + * Display a dialog on the [ItemSearchScreen]. + */ + sealed class DialogState : Parcelable { + /** + * Displays a prompt to confirm item deletion. + */ + @Parcelize + data class DeleteConfirmationPrompt( + val message: Text, + val itemId: String, + ) : DialogState() + + /** + * Displays the loading dialog to the user. + */ + @Parcelize + data object Loading : DialogState() + + /** + * Displays a generic error dialog to the user. + */ + @Parcelize + data class Error( + val title: Text, + val message: Text, + val throwable: Throwable? = null, + ) : DialogState() + } } /** @@ -250,11 +393,29 @@ sealed class ItemSearchAction { */ data object BackClick : ItemSearchAction() + /** + * User has dismissed a dialog. + */ + data object DismissDialog : ItemSearchAction() + /** * User updated the search term. */ data class SearchTermChange(val searchTerm: String) : ItemSearchAction() + /** + * The user clicked confirm when prompted to delete an item. + */ + data class ConfirmDeleteClick(val itemId: String) : ItemSearchAction() + + /** + * Represents an action triggered when the user clicks an item in the dropdown menu. + */ + data class DropdownMenuClick( + val menuAction: VaultDropdownMenuAction, + val item: VerificationCodeDisplayItem, + ) : ItemSearchAction() + /** * User clicked a row item. */ @@ -272,6 +433,20 @@ sealed class ItemSearchAction { val localData: DataState>, val sharedData: SharedVerificationCodesState, ) : Internal() + + /** + * Indicates the result of the add totp login item flow. + */ + data class AddTotpLoginItemFlowResult( + val isSuccess: Boolean, + ) : Internal() + + /** + * Indicates a result for deleting an item has been received. + */ + data class DeleteItemReceive( + val result: DeleteItemResult, + ) : Internal() } } @@ -286,9 +461,30 @@ sealed class ItemSearchEvent { data object NavigateBack : ItemSearchEvent() /** - * Show a toast with the given [message]. + * Navigate to the edit item screen. */ - data class ShowToast(val message: Text) : ItemSearchEvent() + data class NavigateToEditItem(val itemId: String) : ItemSearchEvent() + + /** + * Show a Snackbar with the given [data]. + */ + data class ShowSnackbar( + val data: BitwardenSnackbarData, + ) : ItemSearchEvent() { + constructor( + message: Text, + messageHeader: Text? = null, + actionLabel: Text? = null, + withDismissAction: Boolean = false, + ) : this( + data = BitwardenSnackbarData( + message = message, + messageHeader = messageHeader, + actionLabel = actionLabel, + withDismissAction = withDismissAction, + ), + ) + } } private enum class SortPriority { diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/handlers/SearchHandlers.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/handlers/SearchHandlers.kt index b2c8a827e6..f36d22b0a1 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/handlers/SearchHandlers.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/handlers/SearchHandlers.kt @@ -2,6 +2,8 @@ package com.bitwarden.authenticator.ui.authenticator.feature.search.handlers import com.bitwarden.authenticator.ui.authenticator.feature.search.ItemSearchAction import com.bitwarden.authenticator.ui.authenticator.feature.search.ItemSearchViewModel +import com.bitwarden.authenticator.ui.platform.components.listitem.model.VaultDropdownMenuAction +import com.bitwarden.authenticator.ui.platform.components.listitem.model.VerificationCodeDisplayItem /** * A collection of delegate functions for managing actions within the context of the search screen. @@ -10,6 +12,9 @@ class SearchHandlers( val onBackClick: () -> Unit, val onItemClick: (String) -> Unit, val onSearchTermChange: (String) -> Unit, + val onDropdownMenuClick: (VaultDropdownMenuAction, VerificationCodeDisplayItem) -> Unit, + val onDismissDialog: () -> Unit, + val onConfirmDeleteClick: (String) -> Unit, ) { /** * Creates an instance of [SearchHandlers] by binding actions to the provided @@ -28,6 +33,13 @@ class SearchHandlers( onSearchTermChange = { viewModel.trySendAction(ItemSearchAction.SearchTermChange(it)) }, + onDropdownMenuClick = { action, item -> + viewModel.trySendAction(ItemSearchAction.DropdownMenuClick(action, item)) + }, + onDismissDialog = { viewModel.trySendAction(ItemSearchAction.DismissDialog) }, + onConfirmDeleteClick = { + viewModel.trySendAction(ItemSearchAction.ConfirmDeleteClick(it)) + }, ) } } diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/util/SharedVerificationCodesStateExtensions.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/util/SharedVerificationCodesStateExtensions.kt index 0ed20f5023..71af61e3b7 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/util/SharedVerificationCodesStateExtensions.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/util/SharedVerificationCodesStateExtensions.kt @@ -6,6 +6,7 @@ import com.bitwarden.authenticator.ui.platform.components.listitem.model.SharedC import com.bitwarden.authenticator.ui.platform.components.listitem.model.VerificationCodeDisplayItem import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText +import kotlinx.collections.immutable.toImmutableList /** * Convert [SharedVerificationCodesState.Success] into [SharedCodesDisplayState.Codes]. @@ -26,7 +27,7 @@ fun SharedVerificationCodesState.Success.toSharedCodesDisplayState( // Always map based on Error state, because shared codes will never // show "Copy to Bitwarden vault" action. sharedVerificationCodesState = SharedVerificationCodesState.Error, - allowLongPressActions = false, + showOverflow = false, ), ) } @@ -40,12 +41,12 @@ fun SharedVerificationCodesState.Success.toSharedCodesDisplayState( it.key.environmentLabel, it.value.size, ), - codes = it.value, + codes = it.value.toImmutableList(), isExpanded = currentSections .find { section -> section.id == it.key.userId } ?.isExpanded ?: true, ) } - .let { SharedCodesDisplayState.Codes(it) } + .let { SharedCodesDisplayState.Codes(it.toImmutableList()) } } diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/util/VerificationCodeItemExtensions.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/util/VerificationCodeItemExtensions.kt index 6fd880be4c..e5d147d798 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/util/VerificationCodeItemExtensions.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/util/VerificationCodeItemExtensions.kt @@ -11,7 +11,7 @@ import com.bitwarden.authenticator.ui.platform.components.listitem.model.Verific fun VerificationCodeItem.toDisplayItem( alertThresholdSeconds: Int, sharedVerificationCodesState: SharedVerificationCodesState, - allowLongPressActions: Boolean, + showOverflow: Boolean, ): VerificationCodeDisplayItem = VerificationCodeDisplayItem( id = id, title = issuer ?: label ?: "--", @@ -25,7 +25,7 @@ fun VerificationCodeItem.toDisplayItem( periodSeconds = periodSeconds, alertThresholdSeconds = alertThresholdSeconds, authCode = code, - allowLongPressActions = allowLongPressActions, + showOverflow = showOverflow, favorite = (source as? AuthenticatorItem.Source.Local)?.isFavorite ?: false, showMoveToBitwarden = when (source) { // Shared items should never show "Copy to Bitwarden vault" action: diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/listitem/VaultVerificationCodeItem.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/listitem/VaultVerificationCodeItem.kt index d3df7aaa90..4bd755ae2c 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/listitem/VaultVerificationCodeItem.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/listitem/VaultVerificationCodeItem.kt @@ -1,39 +1,27 @@ package com.bitwarden.authenticator.ui.platform.components.listitem -import androidx.compose.foundation.clickable -import androidx.compose.foundation.combinedClickable -import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.material3.DropdownMenu -import androidx.compose.material3.DropdownMenuItem -import androidx.compose.material3.Icon import androidx.compose.material3.Text -import androidx.compose.material3.ripple import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag -import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.bitwarden.authenticator.ui.platform.components.listitem.model.VaultDropdownMenuAction import com.bitwarden.authenticator.ui.platform.components.listitem.model.VerificationCodeDisplayItem -import com.bitwarden.ui.platform.base.util.cardBackground -import com.bitwarden.ui.platform.base.util.cardPadding -import com.bitwarden.ui.platform.components.divider.BitwardenHorizontalDivider +import com.bitwarden.core.util.persistentListOfNotNull +import com.bitwarden.ui.platform.base.util.cardStyle +import com.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem +import com.bitwarden.ui.platform.components.appbar.model.OverflowMenuItemData +import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.icon.BitwardenIcon import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.components.indicator.BitwardenCircularCountdownIndicator @@ -69,7 +57,7 @@ fun VaultVerificationCodeItem( startIcon = displayItem.startIcon, onItemClick = onItemClick, onDropdownMenuClick = onDropdownMenuClick, - allowLongPress = displayItem.allowLongPressActions, + showOverflow = displayItem.showOverflow, showMoveToBitwarden = displayItem.showMoveToBitwarden, cardStyle = cardStyle, modifier = modifier, @@ -88,7 +76,7 @@ fun VaultVerificationCodeItem( * @param startIcon The leading icon for the item. * @param onItemClick The lambda function to be invoked when the item is clicked. * @param onDropdownMenuClick A lambda function invoked when a dropdown menu action is clicked. - * @param allowLongPress Whether long-press interactions are enabled for the item. + * @param showOverflow Whether overflow menu should be available or not. * @param showMoveToBitwarden Whether the option to move the item to Bitwarden is displayed. * @param cardStyle The card style to be applied to this item. * @param modifier The modifier for the item. @@ -105,166 +93,107 @@ fun VaultVerificationCodeItem( startIcon: IconData, onItemClick: () -> Unit, onDropdownMenuClick: (VaultDropdownMenuAction) -> Unit, - allowLongPress: Boolean, + showOverflow: Boolean, showMoveToBitwarden: Boolean, cardStyle: CardStyle, modifier: Modifier = Modifier, ) { - var shouldShowDropdownMenu by remember { mutableStateOf(value = false) } - Box(modifier = modifier) { - Row( - modifier = Modifier - .testTag(tag = "Item") - .defaultMinSize(minHeight = 60.dp) - .cardBackground(cardStyle = cardStyle) - .then( - if (allowLongPress) { - Modifier.combinedClickable( - interactionSource = remember { MutableInteractionSource() }, - indication = ripple( - color = BitwardenTheme.colorScheme.background.pressed, - ), - onClick = onItemClick, - onLongClick = { shouldShowDropdownMenu = true }, - ) - } else { - Modifier.clickable( - interactionSource = remember { MutableInteractionSource() }, - indication = ripple( - color = BitwardenTheme.colorScheme.background.pressed, - ), - onClick = onItemClick, - ) - }, - ) - .cardPadding( - cardStyle = cardStyle, - paddingValues = PaddingValues(vertical = 8.dp, horizontal = 16.dp), - ), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(16.dp), + Row( + modifier = modifier + .testTag(tag = "Item") + .defaultMinSize(minHeight = 60.dp) + .cardStyle( + cardStyle = cardStyle, + onClick = onItemClick, + paddingStart = 16.dp, + paddingEnd = 4.dp, + ), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(space = 16.dp), + ) { + BitwardenIcon( + iconData = startIcon, + tint = BitwardenTheme.colorScheme.icon.primary, + modifier = Modifier.size(size = 24.dp), + ) + + Column( + horizontalAlignment = Alignment.Start, + verticalArrangement = Arrangement.SpaceEvenly, + modifier = Modifier.weight(weight = 1f), ) { - BitwardenIcon( - iconData = startIcon, - tint = BitwardenTheme.colorScheme.icon.primary, - modifier = Modifier.size(24.dp), - ) - - Column( - horizontalAlignment = Alignment.Start, - verticalArrangement = Arrangement.SpaceEvenly, - modifier = Modifier.weight(1f), - ) { - if (!primaryLabel.isNullOrEmpty()) { - Text( - modifier = Modifier.testTag("Name"), - text = primaryLabel, - style = BitwardenTheme.typography.bodyLarge, - color = BitwardenTheme.colorScheme.text.primary, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) - } - - if (!secondaryLabel.isNullOrEmpty()) { - Text( - modifier = Modifier.testTag("Username"), - text = secondaryLabel, - style = BitwardenTheme.typography.bodyMedium, - color = BitwardenTheme.colorScheme.text.secondary, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) - } + if (!primaryLabel.isNullOrEmpty()) { + Text( + modifier = Modifier.testTag(tag = "Name"), + text = primaryLabel, + style = BitwardenTheme.typography.bodyLarge, + color = BitwardenTheme.colorScheme.text.primary, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) } - BitwardenCircularCountdownIndicator( - modifier = Modifier.testTag("CircularCountDown"), - timeLeftSeconds = timeLeftSeconds, - periodSeconds = periodSeconds, - alertThresholdSeconds = alertThresholdSeconds, - ) - - Text( - modifier = Modifier.testTag("AuthCode"), - text = authCode.chunked(3).joinToString(" "), - style = BitwardenTheme.typography.sensitiveInfoSmall, - color = BitwardenTheme.colorScheme.text.primary, - ) + if (!secondaryLabel.isNullOrEmpty()) { + Text( + modifier = Modifier.testTag(tag = "Username"), + text = secondaryLabel, + style = BitwardenTheme.typography.bodyMedium, + color = BitwardenTheme.colorScheme.text.secondary, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } } - DropdownMenu( - expanded = shouldShowDropdownMenu, - onDismissRequest = { shouldShowDropdownMenu = false }, - shape = BitwardenTheme.shapes.menu, - containerColor = BitwardenTheme.colorScheme.background.primary, - ) { - DropdownMenuItem( - text = { - Text(text = stringResource(id = BitwardenString.copy)) - }, - onClick = { - shouldShowDropdownMenu = false - onDropdownMenuClick(VaultDropdownMenuAction.COPY_CODE) - }, - leadingIcon = { - Icon( - painter = painterResource(id = BitwardenDrawable.ic_copy), - contentDescription = stringResource(id = BitwardenString.copy), - ) - }, - ) - BitwardenHorizontalDivider() - DropdownMenuItem( - text = { - Text(text = stringResource(id = BitwardenString.edit)) - }, - onClick = { - shouldShowDropdownMenu = false - onDropdownMenuClick(VaultDropdownMenuAction.EDIT) - }, - leadingIcon = { - Icon( - painter = painterResource(id = BitwardenDrawable.ic_edit_item), - contentDescription = stringResource(BitwardenString.edit), - ) - }, - ) - if (showMoveToBitwarden) { - BitwardenHorizontalDivider() - DropdownMenuItem( - text = { - Text(text = stringResource(id = BitwardenString.copy_to_bitwarden_vault)) - }, - onClick = { - shouldShowDropdownMenu = false - onDropdownMenuClick(VaultDropdownMenuAction.COPY_TO_BITWARDEN) - }, - leadingIcon = { - Icon( - painter = painterResource(id = BitwardenDrawable.ic_arrow_right), - contentDescription = stringResource( - id = BitwardenString.copy_to_bitwarden_vault, - ), + BitwardenCircularCountdownIndicator( + modifier = Modifier.testTag(tag = "CircularCountDown"), + timeLeftSeconds = timeLeftSeconds, + periodSeconds = periodSeconds, + alertThresholdSeconds = alertThresholdSeconds, + ) + + Text( + modifier = Modifier.testTag(tag = "AuthCode"), + text = authCode.chunked(size = 3).joinToString(separator = " "), + style = BitwardenTheme.typography.sensitiveInfoSmall, + color = BitwardenTheme.colorScheme.text.primary, + ) + + if (showOverflow) { + BitwardenOverflowActionItem( + contentDescription = stringResource(id = BitwardenString.more), + menuItemDataList = persistentListOfNotNull( + OverflowMenuItemData( + text = stringResource(id = BitwardenString.copy), + onClick = { onDropdownMenuClick(VaultDropdownMenuAction.COPY_CODE) }, + ), + OverflowMenuItemData( + text = stringResource(id = BitwardenString.edit), + onClick = { onDropdownMenuClick(VaultDropdownMenuAction.EDIT) }, + ), + if (showMoveToBitwarden) { + OverflowMenuItemData( + text = stringResource(id = BitwardenString.copy_to_bitwarden_vault), + onClick = { + onDropdownMenuClick(VaultDropdownMenuAction.COPY_TO_BITWARDEN) + }, ) + } else { + null }, - ) - } - BitwardenHorizontalDivider() - DropdownMenuItem( - text = { - Text(text = stringResource(id = BitwardenString.delete_item)) - }, - onClick = { - shouldShowDropdownMenu = false - onDropdownMenuClick(VaultDropdownMenuAction.DELETE) - }, - leadingIcon = { - Icon( - painter = painterResource(id = BitwardenDrawable.ic_delete_item), - contentDescription = stringResource(id = BitwardenString.delete_item), - ) - }, + OverflowMenuItemData( + text = stringResource(id = BitwardenString.delete_item), + onClick = { onDropdownMenuClick(VaultDropdownMenuAction.DELETE) }, + ), + ), + vectorIconRes = BitwardenDrawable.ic_ellipsis_horizontal, + testTag = "Options", + ) + } else { + BitwardenStandardIconButton( + vectorIconRes = BitwardenDrawable.ic_copy, + contentDescription = stringResource(id = BitwardenString.copy), + onClick = onItemClick, ) } } @@ -285,7 +214,7 @@ private fun VerificationCodeItem_preview() { startIcon = IconData.Local(BitwardenDrawable.ic_login_item), onItemClick = {}, onDropdownMenuClick = {}, - allowLongPress = true, + showOverflow = true, modifier = Modifier.padding(horizontal = 16.dp), showMoveToBitwarden = true, cardStyle = CardStyle.Full, diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/listitem/model/SharedCodesDisplayState.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/listitem/model/SharedCodesDisplayState.kt index f7a5097604..da949a1647 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/listitem/model/SharedCodesDisplayState.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/listitem/model/SharedCodesDisplayState.kt @@ -2,6 +2,7 @@ package com.bitwarden.authenticator.ui.platform.components.listitem.model import android.os.Parcelable import com.bitwarden.ui.util.Text +import kotlinx.collections.immutable.ImmutableList import kotlinx.parcelize.Parcelize /** @@ -19,7 +20,9 @@ sealed class SharedCodesDisplayState : Parcelable { * Display the given [sections] of verification codes. */ @Parcelize - data class Codes(val sections: List) : SharedCodesDisplayState() + data class Codes( + val sections: ImmutableList, + ) : SharedCodesDisplayState() /** * Models a section of shared authenticator codes to be displayed. @@ -28,7 +31,7 @@ sealed class SharedCodesDisplayState : Parcelable { data class SharedCodesAccountSection( val id: String, val label: Text, - val codes: List, + val codes: ImmutableList, val isExpanded: Boolean, ) : Parcelable diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/listitem/model/VerificationCodeDisplayItem.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/listitem/model/VerificationCodeDisplayItem.kt index a841763da4..a5e2de91ce 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/listitem/model/VerificationCodeDisplayItem.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/listitem/model/VerificationCodeDisplayItem.kt @@ -22,6 +22,6 @@ data class VerificationCodeDisplayItem( testTag = "BitwardenIcon", ), val favorite: Boolean, - val allowLongPressActions: Boolean, + val showOverflow: Boolean, val showMoveToBitwarden: Boolean, ) : Parcelable diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/SettingsScreen.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/SettingsScreen.kt index 0a5625f1dc..c807fbe93b 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/SettingsScreen.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/SettingsScreen.kt @@ -52,6 +52,7 @@ import com.bitwarden.ui.platform.base.util.cardStyle import com.bitwarden.ui.platform.base.util.mirrorIfRtl import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.components.appbar.BitwardenMediumTopAppBar +import com.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog import com.bitwarden.ui.platform.components.dropdown.BitwardenMultiSelectButton import com.bitwarden.ui.platform.components.header.BitwardenListHeaderText import com.bitwarden.ui.platform.components.model.CardStyle @@ -157,6 +158,13 @@ fun SettingsScreen( ) } }, + onScreenCaptureChange = remember(viewModel) { + { + viewModel.trySendAction( + SettingsAction.SecurityClick.AllowScreenCaptureToggle(it), + ) + } + }, ) Spacer(modifier = Modifier.height(16.dp)) VaultSettings( @@ -256,8 +264,8 @@ private fun SecuritySettings( state: SettingsState, biometricsManager: BiometricsManager = LocalBiometricsManager.current, onBiometricToggle: (Boolean) -> Unit, + onScreenCaptureChange: (Boolean) -> Unit, ) { - if (!biometricsManager.isBiometricsSupported) return Spacer(modifier = Modifier.height(height = 12.dp)) BitwardenListHeaderText( modifier = Modifier @@ -265,18 +273,35 @@ private fun SecuritySettings( .padding(horizontal = 16.dp), label = stringResource(id = BitwardenString.security), ) + Spacer(modifier = Modifier.height(8.dp)) - UnlockWithBiometricsRow( + val hasBiometrics = biometricsManager.isBiometricsSupported + if (hasBiometrics) { + UnlockWithBiometricsRow( + modifier = Modifier + .testTag("UnlockWithBiometricsSwitch") + .fillMaxWidth() + .standardHorizontalMargin(), + isChecked = state.isUnlockWithBiometricsEnabled, + onBiometricToggle = { onBiometricToggle(it) }, + biometricsManager = biometricsManager, + ) + } + + ScreenCaptureRow( + currentValue = state.allowScreenCapture, + cardStyle = if (hasBiometrics) { + CardStyle.Bottom + } else { + CardStyle.Full + }, + onValueChange = onScreenCaptureChange, modifier = Modifier - .testTag("UnlockWithBiometricsSwitch") .fillMaxWidth() + .testTag(tag = "AllowScreenCaptureSwitch") .standardHorizontalMargin(), - isChecked = state.isUnlockWithBiometricsEnabled, - onBiometricToggle = { onBiometricToggle(it) }, - biometricsManager = biometricsManager, ) } - //endregion //region Data settings @@ -421,8 +446,11 @@ private fun UnlockWithBiometricsRow( var showBiometricsPrompt by rememberSaveable { mutableStateOf(false) } BitwardenSwitch( modifier = modifier, - cardStyle = CardStyle.Full, - label = stringResource(BitwardenString.unlock_with_biometrics), + cardStyle = CardStyle.Top(), + label = stringResource(id = BitwardenString.lock_app), + subtext = stringResource( + id = BitwardenString.use_your_devices_lock_method_to_unlock_the_app, + ), isChecked = isChecked || showBiometricsPrompt, onCheckedChange = { toggled -> if (toggled) { @@ -443,6 +471,47 @@ private fun UnlockWithBiometricsRow( ) } +@Composable +private fun ScreenCaptureRow( + currentValue: Boolean, + cardStyle: CardStyle, + onValueChange: (Boolean) -> Unit, + modifier: Modifier = Modifier, +) { + var shouldShowScreenCaptureConfirmDialog by remember { mutableStateOf(false) } + + BitwardenSwitch( + label = stringResource(id = BitwardenString.allow_screen_capture), + isChecked = currentValue, + onCheckedChange = { + if (currentValue) { + onValueChange(false) + } else { + shouldShowScreenCaptureConfirmDialog = true + } + }, + cardStyle = cardStyle, + modifier = modifier, + ) + + if (shouldShowScreenCaptureConfirmDialog) { + BitwardenTwoButtonDialog( + title = stringResource(BitwardenString.allow_screen_capture), + message = stringResource( + id = BitwardenString.are_you_sure_you_want_to_enable_screen_capture, + ), + confirmButtonText = stringResource(BitwardenString.yes), + dismissButtonText = stringResource(id = BitwardenString.cancel), + onConfirmClick = { + onValueChange(true) + shouldShowScreenCaptureConfirmDialog = false + }, + onDismissClick = { shouldShowScreenCaptureConfirmDialog = false }, + onDismissRequest = { shouldShowScreenCaptureConfirmDialog = false }, + ) + } +} + //endregion Data settings //region Appearance settings diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/SettingsViewModel.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/SettingsViewModel.kt index 075767efc6..fbebc12342 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/SettingsViewModel.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/SettingsViewModel.kt @@ -58,6 +58,7 @@ class SettingsViewModel @Inject constructor( accountSyncState = authenticatorBridgeManager.accountSyncStateFlow.value, defaultSaveOption = settingsRepository.defaultSaveOption, sharedAccountsState = authenticatorRepository.sharedCodesStateFlow.value, + isScreenCaptureAllowed = settingsRepository.isScreenCaptureAllowed, ), ) { @@ -126,6 +127,10 @@ class SettingsViewModel @Inject constructor( is SettingsAction.SecurityClick.UnlockWithBiometricToggle -> { handleBiometricsSetupClick(action) } + + is SettingsAction.SecurityClick.AllowScreenCaptureToggle -> { + handleAllowScreenCaptureToggle(action) + } } } @@ -173,6 +178,13 @@ class SettingsViewModel @Inject constructor( } } + private fun handleAllowScreenCaptureToggle( + action: SettingsAction.SecurityClick.AllowScreenCaptureToggle, + ) { + settingsRepository.isScreenCaptureAllowed = action.enabled + mutableStateFlow.update { it.copy(allowScreenCapture = action.enabled) } + } + private fun handleVaultClick(action: SettingsAction.DataClick) { when (action) { SettingsAction.DataClick.ExportClick -> handleExportClick() @@ -319,6 +331,7 @@ class SettingsViewModel @Inject constructor( isSubmitCrashLogsEnabled: Boolean, accountSyncState: AccountSyncState, sharedAccountsState: SharedVerificationCodesState, + isScreenCaptureAllowed: Boolean, ): SettingsState { val currentYear = Year.now(clock) val copyrightInfo = "© Bitwarden Inc. 2015-$currentYear".asText() @@ -343,6 +356,7 @@ class SettingsViewModel @Inject constructor( defaultSaveOption = defaultSaveOption, showSyncWithBitwarden = shouldShowSyncWithBitwarden, showDefaultSaveOptionRow = shouldShowDefaultSaveOption, + allowScreenCapture = isScreenCaptureAllowed, ) } } @@ -362,6 +376,7 @@ data class SettingsState( val dialog: Dialog?, val version: Text, val copyrightInfo: Text, + val allowScreenCapture: Boolean, ) : Parcelable { /** @@ -460,13 +475,18 @@ sealed class SettingsAction( } /** - * Indicates the user clicked the Unlock with biometrics button. + * Models actions for the Security section of settings. */ sealed class SecurityClick : SettingsAction() { /** * Indicates the user clicked unlock with biometrics toggle. */ data class UnlockWithBiometricToggle(val enabled: Boolean) : SecurityClick() + + /** + * Indicates the user clicked allow screen capture toggle. + */ + data class AllowScreenCaptureToggle(val enabled: Boolean) : SecurityClick() } /** diff --git a/authenticator/src/test/kotlin/com/bitwarden/authenticator/MainViewModelTest.kt b/authenticator/src/test/kotlin/com/bitwarden/authenticator/MainViewModelTest.kt index 2b5a951adf..51cee18c38 100644 --- a/authenticator/src/test/kotlin/com/bitwarden/authenticator/MainViewModelTest.kt +++ b/authenticator/src/test/kotlin/com/bitwarden/authenticator/MainViewModelTest.kt @@ -31,6 +31,7 @@ class MainViewModelTest : BaseViewModelTest() { @Test fun `on AppThemeChanged should update state`() = runTest { mainViewModel.stateEventFlow(backgroundScope) { stateFlow, eventFlow -> + eventFlow.skipItems(count = 2) assertEquals( MainState(theme = AppTheme.DEFAULT), stateFlow.awaitItem(), @@ -42,7 +43,7 @@ class MainViewModelTest : BaseViewModelTest() { ) assertEquals( MainEvent.UpdateAppTheme(osTheme = AppTheme.DARK.osValue), - eventFlow.expectMostRecentItem(), + eventFlow.awaitItem(), ) } diff --git a/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingScreenTest.kt b/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingScreenTest.kt index d1fb02c132..dc2ef101f4 100644 --- a/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingScreenTest.kt +++ b/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingScreenTest.kt @@ -2,17 +2,20 @@ package com.bitwarden.authenticator.ui.authenticator.feature.itemlisting import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsNotDisplayed +import androidx.compose.ui.test.filterToOne +import androidx.compose.ui.test.hasContentDescription import androidx.compose.ui.test.longClick +import androidx.compose.ui.test.onChildren import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performScrollTo import androidx.compose.ui.test.performTouchInput import androidx.core.net.toUri -import com.bitwarden.authenticator.ui.platform.components.listitem.model.VaultDropdownMenuAction -import com.bitwarden.authenticator.ui.platform.components.listitem.model.SharedCodesDisplayState -import com.bitwarden.authenticator.ui.platform.components.listitem.model.VerificationCodeDisplayItem import com.bitwarden.authenticator.ui.platform.base.AuthenticatorComposeTest +import com.bitwarden.authenticator.ui.platform.components.listitem.model.SharedCodesDisplayState +import com.bitwarden.authenticator.ui.platform.components.listitem.model.VaultDropdownMenuAction +import com.bitwarden.authenticator.ui.platform.components.listitem.model.VerificationCodeDisplayItem import com.bitwarden.authenticator.ui.platform.manager.permissions.FakePermissionManager import com.bitwarden.authenticator.ui.platform.util.startBitwardenAccountSettings import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow @@ -27,6 +30,7 @@ import io.mockk.mockk import io.mockk.mockkStatic import io.mockk.runs import io.mockk.verify +import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.update import org.junit.Before @@ -117,8 +121,8 @@ class ItemListingScreenTest : AuthenticatorComposeTest() { mutableStateFlow.value = DEFAULT_STATE.copy( viewState = ItemListingState.ViewState.Content( actionCard = ItemListingState.ActionCardState.None, - favoriteItems = emptyList(), - itemList = emptyList(), + favoriteItems = persistentListOf(), + itemList = persistentListOf(), sharedItems = SharedCodesDisplayState.Error, ), ) @@ -130,9 +134,9 @@ class ItemListingScreenTest : AuthenticatorComposeTest() { mutableStateFlow.value = DEFAULT_STATE.copy( viewState = ItemListingState.ViewState.Content( actionCard = ItemListingState.ActionCardState.None, - favoriteItems = emptyList(), - itemList = emptyList(), - sharedItems = SharedCodesDisplayState.Codes(emptyList()), + favoriteItems = persistentListOf(), + itemList = persistentListOf(), + sharedItems = SharedCodesDisplayState.Codes(persistentListOf()), ), ) @@ -146,12 +150,10 @@ class ItemListingScreenTest : AuthenticatorComposeTest() { mutableStateFlow.value = DEFAULT_STATE.copy( viewState = ItemListingState.ViewState.Content( actionCard = ItemListingState.ActionCardState.None, - favoriteItems = emptyList(), - itemList = emptyList(), + favoriteItems = persistentListOf(), + itemList = persistentListOf(), sharedItems = SharedCodesDisplayState.Codes( - sections = listOf( - SHARED_ACCOUNTS_SECTION, - ), + sections = persistentListOf(SHARED_ACCOUNTS_SECTION), ), ), ) @@ -229,9 +231,9 @@ class ItemListingScreenTest : AuthenticatorComposeTest() { mutableStateFlow.update { it.copy( viewState = ItemListingState.ViewState.Content( - favoriteItems = emptyList(), - itemList = emptyList(), - sharedItems = SharedCodesDisplayState.Codes(emptyList()), + favoriteItems = persistentListOf(), + itemList = persistentListOf(), + sharedItems = SharedCodesDisplayState.Codes(persistentListOf()), actionCard = ItemListingState.ActionCardState.SyncWithBitwarden, ), ) @@ -247,9 +249,9 @@ class ItemListingScreenTest : AuthenticatorComposeTest() { mutableStateFlow.update { it.copy( viewState = ItemListingState.ViewState.Content( - favoriteItems = emptyList(), - itemList = emptyList(), - sharedItems = SharedCodesDisplayState.Codes(emptyList()), + favoriteItems = persistentListOf(), + itemList = persistentListOf(), + sharedItems = SharedCodesDisplayState.Codes(persistentListOf()), actionCard = ItemListingState.ActionCardState.SyncWithBitwarden, ), ) @@ -279,9 +281,9 @@ class ItemListingScreenTest : AuthenticatorComposeTest() { fun `on sync with bitwarden action card dismiss in full state should send SyncWithBitwardenDismiss`() { mutableStateFlow.value = DEFAULT_STATE.copy( viewState = ItemListingState.ViewState.Content( - favoriteItems = emptyList(), - itemList = emptyList(), - sharedItems = SharedCodesDisplayState.Codes(emptyList()), + favoriteItems = persistentListOf(), + itemList = persistentListOf(), + sharedItems = SharedCodesDisplayState.Codes(persistentListOf()), actionCard = ItemListingState.ActionCardState.SyncWithBitwarden, ), ) @@ -308,9 +310,9 @@ class ItemListingScreenTest : AuthenticatorComposeTest() { fun `on download bitwarden click in full state should send DownloadBitwardenClick`() { mutableStateFlow.value = DEFAULT_STATE.copy( viewState = ItemListingState.ViewState.Content( - favoriteItems = emptyList(), - itemList = emptyList(), - sharedItems = SharedCodesDisplayState.Codes(emptyList()), + favoriteItems = persistentListOf(), + itemList = persistentListOf(), + sharedItems = SharedCodesDisplayState.Codes(persistentListOf()), actionCard = ItemListingState.ActionCardState.DownloadBitwardenApp, ), ) @@ -337,9 +339,9 @@ class ItemListingScreenTest : AuthenticatorComposeTest() { fun `on download bitwarden dismiss in full state should send DownloadBitwardenDismiss`() { mutableStateFlow.value = DEFAULT_STATE.copy( viewState = ItemListingState.ViewState.Content( - favoriteItems = emptyList(), - itemList = emptyList(), - sharedItems = SharedCodesDisplayState.Codes(emptyList()), + favoriteItems = persistentListOf(), + itemList = persistentListOf(), + sharedItems = SharedCodesDisplayState.Codes(persistentListOf()), actionCard = ItemListingState.ActionCardState.DownloadBitwardenApp, ), ) @@ -354,14 +356,16 @@ class ItemListingScreenTest : AuthenticatorComposeTest() { mutableStateFlow.value = DEFAULT_STATE.copy( viewState = ItemListingState.ViewState.Content( actionCard = ItemListingState.ActionCardState.None, - favoriteItems = emptyList(), - itemList = listOf(LOCAL_CODE), + favoriteItems = persistentListOf(), + itemList = persistentListOf(LOCAL_CODE), sharedItems = SharedCodesDisplayState.Error, ), ) composeTestRule - .onNodeWithText("issuer") - .performTouchInput { longClick() } + .onNodeWithText(text = "issuer") + .onChildren() + .filterToOne(hasContentDescription(value = "More")) + .performClick() composeTestRule .onNodeWithText(text = "Copy to Bitwarden vault") @@ -383,8 +387,8 @@ class ItemListingScreenTest : AuthenticatorComposeTest() { mutableStateFlow.value = DEFAULT_STATE.copy( viewState = ItemListingState.ViewState.Content( actionCard = ItemListingState.ActionCardState.None, - favoriteItems = emptyList(), - itemList = listOf(LOCAL_CODE.copy(showMoveToBitwarden = false)), + favoriteItems = persistentListOf(), + itemList = persistentListOf(LOCAL_CODE.copy(showMoveToBitwarden = false)), sharedItems = SharedCodesDisplayState.Error, ), ) @@ -403,9 +407,9 @@ class ItemListingScreenTest : AuthenticatorComposeTest() { DEFAULT_STATE.copy( viewState = ItemListingState.ViewState.Content( actionCard = ItemListingState.ActionCardState.None, - favoriteItems = emptyList(), - itemList = emptyList(), - sharedItems = SharedCodesDisplayState.Codes(emptyList()), + favoriteItems = persistentListOf(), + itemList = persistentListOf(), + sharedItems = SharedCodesDisplayState.Codes(persistentListOf()), ), ) } @@ -428,12 +432,10 @@ class ItemListingScreenTest : AuthenticatorComposeTest() { mutableStateFlow.value = DEFAULT_STATE.copy( viewState = ItemListingState.ViewState.Content( actionCard = ItemListingState.ActionCardState.None, - favoriteItems = emptyList(), - itemList = listOf(LOCAL_CODE), + favoriteItems = persistentListOf(), + itemList = persistentListOf(LOCAL_CODE), sharedItems = SharedCodesDisplayState.Codes( - sections = listOf( - SHARED_ACCOUNTS_SECTION, - ), + sections = persistentListOf(SHARED_ACCOUNTS_SECTION), ), ), ) @@ -450,12 +452,12 @@ class ItemListingScreenTest : AuthenticatorComposeTest() { @Test fun `shared codes header click should emit SectionExpandedClick`() { val sharedItems = SharedCodesDisplayState.Codes( - sections = listOf(SHARED_ACCOUNTS_SECTION), + sections = persistentListOf(SHARED_ACCOUNTS_SECTION), ) val viewState = ItemListingState.ViewState.Content( actionCard = ItemListingState.ActionCardState.None, - favoriteItems = emptyList(), - itemList = listOf(LOCAL_CODE), + favoriteItems = persistentListOf(), + itemList = persistentListOf(LOCAL_CODE), sharedItems = sharedItems, ) mutableStateFlow.value = DEFAULT_STATE.copy(viewState = viewState) @@ -472,12 +474,12 @@ class ItemListingScreenTest : AuthenticatorComposeTest() { @Test fun `shared codes header should be displayed and collapsed when syncing is enabled`() { val sharedItems = SharedCodesDisplayState.Codes( - sections = listOf(SHARED_ACCOUNTS_SECTION), + sections = persistentListOf(SHARED_ACCOUNTS_SECTION), ) val viewState = ItemListingState.ViewState.Content( actionCard = ItemListingState.ActionCardState.None, - favoriteItems = emptyList(), - itemList = listOf(LOCAL_CODE), + favoriteItems = persistentListOf(), + itemList = persistentListOf(LOCAL_CODE), sharedItems = sharedItems, ) mutableStateFlow.value = DEFAULT_STATE.copy(viewState = viewState) @@ -493,7 +495,7 @@ class ItemListingScreenTest : AuthenticatorComposeTest() { mutableStateFlow.value = DEFAULT_STATE.copy( viewState = viewState.copy( sharedItems = sharedItems.copy( - sections = listOf(SHARED_ACCOUNTS_SECTION.copy(isExpanded = false)), + sections = persistentListOf(SHARED_ACCOUNTS_SECTION.copy(isExpanded = false)), ), ), ) @@ -512,12 +514,10 @@ class ItemListingScreenTest : AuthenticatorComposeTest() { mutableStateFlow.value = DEFAULT_STATE.copy( viewState = ItemListingState.ViewState.Content( actionCard = ItemListingState.ActionCardState.None, - favoriteItems = emptyList(), - itemList = listOf(LOCAL_CODE), + favoriteItems = persistentListOf(), + itemList = persistentListOf(LOCAL_CODE), sharedItems = SharedCodesDisplayState.Codes( - sections = listOf( - SHARED_ACCOUNTS_SECTION, - ), + sections = persistentListOf(SHARED_ACCOUNTS_SECTION), ), ), ) @@ -548,14 +548,14 @@ private val LOCAL_CODE = VerificationCodeDisplayItem( alertThresholdSeconds = 7, authCode = "123456", favorite = false, - allowLongPressActions = true, + showOverflow = true, showMoveToBitwarden = true, ) private val SHARED_ACCOUNTS_SECTION = SharedCodesDisplayState.SharedCodesAccountSection( id = "id", label = "test@test.com | bitwarden.com (1)".asText(), - codes = listOf( + codes = persistentListOf( VerificationCodeDisplayItem( id = "1", title = "bitwarden.com", @@ -565,7 +565,7 @@ private val SHARED_ACCOUNTS_SECTION = SharedCodesDisplayState.SharedCodesAccount alertThresholdSeconds = ALERT_THRESHOLD, authCode = "123456", favorite = false, - allowLongPressActions = false, + showOverflow = false, showMoveToBitwarden = false, ), ), diff --git a/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingViewModelTest.kt b/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingViewModelTest.kt index 4a9746c5b2..bc59173993 100644 --- a/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingViewModelTest.kt +++ b/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingViewModelTest.kt @@ -25,6 +25,8 @@ import io.mockk.just import io.mockk.mockk import io.mockk.runs import io.mockk.verify +import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.emptyFlow @@ -109,7 +111,7 @@ class ItemListingViewModelTest : BaseViewModelTest() { actionCard = ItemListingState.ActionCardState.DownloadBitwardenApp, favoriteItems = LOCAL_FAVORITE_ITEMS, itemList = LOCAL_NON_FAVORITE_ITEMS, - sharedItems = SharedCodesDisplayState.Codes(emptyList()), + sharedItems = SharedCodesDisplayState.Codes(persistentListOf()), ), ) every { settingsRepository.hasUserDismissedDownloadBitwardenCard } returns false @@ -127,7 +129,7 @@ class ItemListingViewModelTest : BaseViewModelTest() { actionCard = ItemListingState.ActionCardState.None, favoriteItems = LOCAL_FAVORITE_ITEMS, itemList = LOCAL_NON_FAVORITE_ITEMS, - sharedItems = SharedCodesDisplayState.Codes(emptyList()), + sharedItems = SharedCodesDisplayState.Codes(persistentListOf()), ), ) every { settingsRepository.hasUserDismissedDownloadBitwardenCard } returns true @@ -160,8 +162,12 @@ class ItemListingViewModelTest : BaseViewModelTest() { val expectedState = DEFAULT_STATE.copy( viewState = ItemListingState.ViewState.Content( actionCard = ItemListingState.ActionCardState.None, - favoriteItems = LOCAL_FAVORITE_ITEMS.map { it.copy(showMoveToBitwarden = true) }, - itemList = LOCAL_NON_FAVORITE_ITEMS.map { it.copy(showMoveToBitwarden = true) }, + favoriteItems = LOCAL_FAVORITE_ITEMS + .map { it.copy(showMoveToBitwarden = true) } + .toImmutableList(), + itemList = LOCAL_NON_FAVORITE_ITEMS + .map { it.copy(showMoveToBitwarden = true) } + .toImmutableList(), sharedItems = SHARED_DISPLAY_ITEMS, ), ) @@ -193,8 +199,8 @@ class ItemListingViewModelTest : BaseViewModelTest() { val expectedState = DEFAULT_STATE.copy( viewState = ItemListingState.ViewState.Content( actionCard = ItemListingState.ActionCardState.None, - favoriteItems = emptyList(), - itemList = emptyList(), + favoriteItems = persistentListOf(), + itemList = persistentListOf(), sharedItems = SHARED_DISPLAY_ITEMS, ), ) @@ -223,7 +229,7 @@ class ItemListingViewModelTest : BaseViewModelTest() { actionCard = ItemListingState.ActionCardState.None, favoriteItems = LOCAL_FAVORITE_ITEMS, itemList = LOCAL_NON_FAVORITE_ITEMS, - sharedItems = SharedCodesDisplayState.Codes(emptyList()), + sharedItems = SharedCodesDisplayState.Codes(persistentListOf()), ), ) every { settingsRepository.hasUserDismissedDownloadBitwardenCard = true } just runs @@ -271,7 +277,7 @@ class ItemListingViewModelTest : BaseViewModelTest() { actionCard = ItemListingState.ActionCardState.None, favoriteItems = LOCAL_FAVORITE_ITEMS, itemList = LOCAL_NON_FAVORITE_ITEMS, - sharedItems = SharedCodesDisplayState.Codes(emptyList()), + sharedItems = SharedCodesDisplayState.Codes(persistentListOf()), ), ) mutableSharedCodesFlow.value = SharedVerificationCodesState.SyncNotEnabled @@ -340,7 +346,7 @@ class ItemListingViewModelTest : BaseViewModelTest() { actionCard = ItemListingState.ActionCardState.SyncWithBitwarden, favoriteItems = LOCAL_FAVORITE_ITEMS, itemList = LOCAL_NON_FAVORITE_ITEMS, - sharedItems = SharedCodesDisplayState.Codes(emptyList()), + sharedItems = SharedCodesDisplayState.Codes(persistentListOf()), ), ) every { settingsRepository.hasUserDismissedSyncWithBitwardenCard } returns false @@ -358,7 +364,7 @@ class ItemListingViewModelTest : BaseViewModelTest() { actionCard = ItemListingState.ActionCardState.None, favoriteItems = LOCAL_FAVORITE_ITEMS, itemList = LOCAL_NON_FAVORITE_ITEMS, - sharedItems = SharedCodesDisplayState.Codes(emptyList()), + sharedItems = SharedCodesDisplayState.Codes(persistentListOf()), ), ) every { settingsRepository.hasUserDismissedSyncWithBitwardenCard } returns true @@ -511,10 +517,17 @@ class ItemListingViewModelTest : BaseViewModelTest() { val expectedState = DEFAULT_STATE.copy( viewState = ItemListingState.ViewState.Content( actionCard = ItemListingState.ActionCardState.None, - favoriteItems = LOCAL_FAVORITE_ITEMS.map { it.copy(showMoveToBitwarden = true) }, - itemList = LOCAL_NON_FAVORITE_ITEMS.map { it.copy(showMoveToBitwarden = true) }, + favoriteItems = LOCAL_FAVORITE_ITEMS + .map { it.copy(showMoveToBitwarden = true) } + .toImmutableList(), + itemList = LOCAL_NON_FAVORITE_ITEMS + .map { it.copy(showMoveToBitwarden = true) } + .toImmutableList(), sharedItems = SHARED_DISPLAY_ITEMS.copy( - sections = SHARED_DISPLAY_ITEMS.sections.map { it.copy(isExpanded = false) }, + sections = SHARED_DISPLAY_ITEMS + .sections + .map { it.copy(isExpanded = false) } + .toImmutableList(), ), ), ) @@ -558,7 +571,7 @@ private val LOCAL_CODE = VerificationCodeDisplayItem( alertThresholdSeconds = 7, authCode = "123456", favorite = false, - allowLongPressActions = true, + showOverflow = true, showMoveToBitwarden = true, ) @@ -607,12 +620,14 @@ private val LOCAL_DISPLAY_ITEMS = LOCAL_VERIFICATION_ITEMS.map { it.toDisplayItem( alertThresholdSeconds = AUTHENTICATOR_ALERT_SECONDS, sharedVerificationCodesState = SharedVerificationCodesState.AppNotInstalled, - allowLongPressActions = true, + showOverflow = true, ) } private val SHARED_DISPLAY_ITEMS = SharedVerificationCodesState.Success(SHARED_VERIFICATION_ITEMS) .toSharedCodesDisplayState(AUTHENTICATOR_ALERT_SECONDS) -private val LOCAL_FAVORITE_ITEMS = LOCAL_DISPLAY_ITEMS.filter { it.favorite } -private val LOCAL_NON_FAVORITE_ITEMS = LOCAL_DISPLAY_ITEMS.filterNot { it.favorite } +private val LOCAL_FAVORITE_ITEMS = LOCAL_DISPLAY_ITEMS.filter { it.favorite }.toImmutableList() +private val LOCAL_NON_FAVORITE_ITEMS = LOCAL_DISPLAY_ITEMS + .filterNot { it.favorite } + .toImmutableList() diff --git a/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchViewModelTest.kt b/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchViewModelTest.kt index 1c28e8bfb9..c288b0193f 100644 --- a/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchViewModelTest.kt +++ b/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchViewModelTest.kt @@ -1,23 +1,36 @@ package com.bitwarden.authenticator.ui.authenticator.feature.search import androidx.lifecycle.SavedStateHandle +import app.cash.turbine.test +import com.bitwarden.authenticator.data.authenticator.datasource.disk.entity.AuthenticatorItemEntity import com.bitwarden.authenticator.data.authenticator.manager.model.VerificationCodeItem import com.bitwarden.authenticator.data.authenticator.manager.util.createMockSharedAuthenticatorItemSource import com.bitwarden.authenticator.data.authenticator.manager.util.createMockVerificationCodeItem import com.bitwarden.authenticator.data.authenticator.repository.AuthenticatorRepository +import com.bitwarden.authenticator.data.authenticator.repository.model.DeleteItemResult import com.bitwarden.authenticator.data.authenticator.repository.model.SharedVerificationCodesState import com.bitwarden.authenticator.data.platform.manager.clipboard.BitwardenClipboardManager import com.bitwarden.authenticator.ui.platform.components.listitem.model.SharedCodesDisplayState +import com.bitwarden.authenticator.ui.platform.components.listitem.model.VaultDropdownMenuAction import com.bitwarden.authenticator.ui.platform.components.listitem.model.VerificationCodeDisplayItem +import com.bitwarden.authenticatorbridge.manager.AuthenticatorBridgeManager import com.bitwarden.core.data.repository.model.DataState import com.bitwarden.ui.platform.base.BaseViewModelTest import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.resource.BitwardenDrawable import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText +import io.mockk.coEvery +import io.mockk.coVerify import io.mockk.every +import io.mockk.just import io.mockk.mockk +import io.mockk.runs +import io.mockk.verify +import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.test.runTest import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test @@ -28,21 +41,107 @@ class ItemSearchViewModelTest : BaseViewModelTest() { private val mutableSharedCodesFlow = MutableStateFlow( SharedVerificationCodesState.Success(items = SHARED_ITEMS), ) + private val mutableItemStateFlow = + MutableStateFlow>(DataState.Loading) private val mockAuthenticatorRepository = mockk { every { getLocalVerificationCodesFlow() } returns mutableAuthCodesStateFlow every { sharedCodesStateFlow } returns mutableSharedCodesFlow + every { getItemStateFlow(itemId = any()) } returns mutableItemStateFlow } + private val authenticatorBridgeManager = mockk() private val mockClipboardManager = mockk() @Test fun `initial state is correct`() { val viewModel = createViewModel() assertEquals( - ItemSearchState.ViewState.Empty(message = null), - viewModel.stateFlow.value.viewState, + DEFAULT_STATE, + viewModel.stateFlow.value, ) } + @Test + fun `on BackClick should emit NavigateBack`() = runTest { + val viewModel = createViewModel() + + viewModel.eventFlow.test { + viewModel.trySendAction(ItemSearchAction.BackClick) + assertEquals(ItemSearchEvent.NavigateBack, awaitItem()) + } + } + + @Test + fun `on ConfirmDeleteClick should emit update the dialog state correctly on error`() = runTest { + val itemId = "mockId" + coEvery { + mockAuthenticatorRepository.hardDeleteItem(itemId = itemId) + } returns DeleteItemResult.Error + val viewModel = createViewModel() + + viewModel.stateFlow.test { + assertEquals(DEFAULT_STATE, awaitItem()) + viewModel.trySendAction(ItemSearchAction.ConfirmDeleteClick(itemId = itemId)) + assertEquals( + DEFAULT_STATE.copy(dialog = ItemSearchState.DialogState.Loading), + awaitItem(), + ) + assertEquals( + DEFAULT_STATE.copy( + dialog = ItemSearchState.DialogState.Error( + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), + ), + ), + awaitItem(), + ) + } + coVerify(exactly = 1) { + mockAuthenticatorRepository.hardDeleteItem(itemId = itemId) + } + } + + @Suppress("MaxLineLength") + @Test + fun `on ConfirmDeleteClick should emit update the dialog state correctly and show Snackbar on success`() = + runTest { + val itemId = "mockId" + coEvery { + mockAuthenticatorRepository.hardDeleteItem(itemId = itemId) + } returns DeleteItemResult.Success + val viewModel = createViewModel() + + viewModel.stateEventFlow(backgroundScope) { stateFlow, eventFlow -> + assertEquals(DEFAULT_STATE, stateFlow.awaitItem()) + viewModel.trySendAction(ItemSearchAction.ConfirmDeleteClick(itemId = itemId)) + assertEquals( + DEFAULT_STATE.copy(dialog = ItemSearchState.DialogState.Loading), + stateFlow.awaitItem(), + ) + assertEquals( + DEFAULT_STATE.copy(dialog = null), + stateFlow.awaitItem(), + ) + assertEquals( + ItemSearchEvent.ShowSnackbar(message = BitwardenString.item_deleted.asText()), + eventFlow.awaitItem(), + ) + } + coVerify(exactly = 1) { + mockAuthenticatorRepository.hardDeleteItem(itemId = itemId) + } + } + + @Test + fun `on DismissDialog should clear the dialogState`() = runTest { + val initialState = DEFAULT_STATE.copy(dialog = ItemSearchState.DialogState.Loading) + val viewModel = createViewModel(initialState = initialState) + assertEquals(initialState, viewModel.stateFlow.value) + + viewModel.trySendAction(ItemSearchAction.DismissDialog) + + assertEquals(initialState.copy(dialog = null), viewModel.stateFlow.value) + } + @Test fun `state contains both shared items and local items when available`() { val viewModel = createViewModel() @@ -75,7 +174,7 @@ class ItemSearchViewModelTest : BaseViewModelTest() { assertEquals( ItemSearchState.ViewState.Content( itemList = LOCAL_DISPLAY_ITEMS, - sharedItems = SharedCodesDisplayState.Codes(sections = emptyList()), + sharedItems = SharedCodesDisplayState.Codes(sections = persistentListOf()), ), viewModel.stateFlow.value.viewState, ) @@ -91,13 +190,151 @@ class ItemSearchViewModelTest : BaseViewModelTest() { assertEquals( ItemSearchState.ViewState.Content( - itemList = LOCAL_DISPLAY_ITEMS.map { it.copy(showMoveToBitwarden = false) }, - sharedItems = SharedCodesDisplayState.Codes(sections = emptyList()), + itemList = LOCAL_DISPLAY_ITEMS + .map { it.copy(showMoveToBitwarden = false) } + .toImmutableList(), + sharedItems = SharedCodesDisplayState.Codes(sections = persistentListOf()), ), viewModel.stateFlow.value.viewState, ) } + @Test + fun `ItemClick should call clipboardManager`() { + val code = "authCode" + every { mockClipboardManager.setText(text = code) } just runs + val viewModel = createViewModel() + + viewModel.trySendAction(ItemSearchAction.ItemClick(authCode = code)) + + verify(exactly = 1) { + mockClipboardManager.setText(text = code) + } + } + + @Test + fun `DropdownMenuClick COPY_CODE should call clipboardManager`() { + val code = "authCode" + every { mockClipboardManager.setText(text = code) } just runs + val viewModel = createViewModel() + + viewModel.trySendAction( + ItemSearchAction.DropdownMenuClick( + menuAction = VaultDropdownMenuAction.COPY_CODE, + item = mockk { every { authCode } returns code }, + ), + ) + + verify(exactly = 1) { + mockClipboardManager.setText(text = code) + } + } + + @Test + fun `DropdownMenuClick COPY_TO_BITWARDEN should startAddTotpLoginItemFlow on success`() { + val itemId = "itemId" + val uriString = "uriString" + val entity = mockk { + every { toOtpAuthUriString() } returns uriString + } + every { + authenticatorBridgeManager.startAddTotpLoginItemFlow(totpUri = uriString) + } returns true + val viewModel = createViewModel() + + mutableItemStateFlow.value = DataState.Loaded(data = entity) + viewModel.trySendAction( + ItemSearchAction.DropdownMenuClick( + menuAction = VaultDropdownMenuAction.COPY_TO_BITWARDEN, + item = mockk { every { id } returns itemId }, + ), + ) + + verify(exactly = 1) { + mockAuthenticatorRepository.getItemStateFlow(itemId = itemId) + authenticatorBridgeManager.startAddTotpLoginItemFlow(totpUri = uriString) + } + } + + @Suppress("MaxLineLength") + @Test + fun `DropdownMenuClick COPY_TO_BITWARDEN should startAddTotpLoginItemFlow and display error dialog on failure`() { + val itemId = "itemId" + val uriString = "uriString" + val entity = mockk { + every { toOtpAuthUriString() } returns uriString + } + every { + authenticatorBridgeManager.startAddTotpLoginItemFlow(totpUri = uriString) + } returns false + val viewModel = createViewModel() + + mutableItemStateFlow.value = DataState.Loaded(data = entity) + viewModel.trySendAction( + ItemSearchAction.DropdownMenuClick( + menuAction = VaultDropdownMenuAction.COPY_TO_BITWARDEN, + item = mockk { every { id } returns itemId }, + ), + ) + + verify(exactly = 1) { + mockAuthenticatorRepository.getItemStateFlow(itemId = itemId) + authenticatorBridgeManager.startAddTotpLoginItemFlow(totpUri = uriString) + } + assertEquals( + DEFAULT_STATE.copy( + dialog = ItemSearchState.DialogState.Error( + title = BitwardenString.something_went_wrong.asText(), + message = BitwardenString.please_try_again.asText(), + ), + ), + viewModel.stateFlow.value, + ) + } + + @Test + fun `DropdownMenuClick EDIT should emit NavigateToEditItem`() = runTest { + val itemId = "itemId" + val viewModel = createViewModel() + + viewModel.eventFlow.test { + viewModel.trySendAction( + ItemSearchAction.DropdownMenuClick( + menuAction = VaultDropdownMenuAction.EDIT, + item = mockk { every { id } returns itemId }, + ), + ) + assertEquals( + ItemSearchEvent.NavigateToEditItem(itemId = itemId), + awaitItem(), + ) + } + } + + @Test + fun `DropdownMenuClick DELETE should update the dialog state`() = runTest { + val itemId = "itemId" + val viewModel = createViewModel() + + viewModel.trySendAction( + ItemSearchAction.DropdownMenuClick( + menuAction = VaultDropdownMenuAction.DELETE, + item = mockk { every { id } returns itemId }, + ), + ) + assertEquals( + DEFAULT_STATE.copy( + dialog = ItemSearchState.DialogState.DeleteConfirmationPrompt( + message = BitwardenString + .do_you_really_want_to_permanently_delete_this_cannot_be_undone + .asText(), + itemId = itemId, + ), + ), + viewModel.stateFlow.value, + ) + } + private fun createViewModel( initialState: ItemSearchState? = null, ): ItemSearchViewModel = @@ -107,9 +344,16 @@ class ItemSearchViewModelTest : BaseViewModelTest() { }, clipboardManager = mockClipboardManager, authenticatorRepository = mockAuthenticatorRepository, + authenticatorBridgeManager = authenticatorBridgeManager, ) } +private val DEFAULT_STATE: ItemSearchState = ItemSearchState( + searchTerm = "", + viewState = ItemSearchState.ViewState.Empty(message = null), + dialog = null, +) + private val LOCAL_ITEMS = listOf( createMockVerificationCodeItem(number = 1), ) @@ -122,7 +366,7 @@ private val SHARED_ITEMS = listOf( ) private val SHARED_DISPLAY_ITEMS = SharedCodesDisplayState.Codes( - sections = listOf( + sections = persistentListOf( SharedCodesDisplayState.SharedCodesAccountSection( id = "mockUserId-2", label = BitwardenString.shared_accounts_header.asText( @@ -130,7 +374,7 @@ private val SHARED_DISPLAY_ITEMS = SharedCodesDisplayState.Codes( "mockkEnvironmentLabel-2", 1, ), - codes = listOf( + codes = persistentListOf( VerificationCodeDisplayItem( id = "mockId-2", title = "mockIssuer-2", @@ -140,7 +384,7 @@ private val SHARED_DISPLAY_ITEMS = SharedCodesDisplayState.Codes( alertThresholdSeconds = 7, authCode = "mockCode-2", favorite = false, - allowLongPressActions = false, + showOverflow = false, showMoveToBitwarden = false, ), ), @@ -149,7 +393,7 @@ private val SHARED_DISPLAY_ITEMS = SharedCodesDisplayState.Codes( ), ) -private val LOCAL_DISPLAY_ITEMS = listOf( +private val LOCAL_DISPLAY_ITEMS = persistentListOf( VerificationCodeDisplayItem( id = LOCAL_ITEMS[0].id, authCode = LOCAL_ITEMS[0].code, @@ -163,7 +407,7 @@ private val LOCAL_DISPLAY_ITEMS = listOf( ), subtitle = LOCAL_ITEMS[0].label, favorite = false, - allowLongPressActions = false, + showOverflow = true, showMoveToBitwarden = true, ), ) diff --git a/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/util/SharedVerificationCodesStateTest.kt b/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/util/SharedVerificationCodesStateTest.kt index fe83a58940..51f3431bf3 100644 --- a/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/util/SharedVerificationCodesStateTest.kt +++ b/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/util/SharedVerificationCodesStateTest.kt @@ -7,6 +7,7 @@ import com.bitwarden.authenticator.ui.platform.components.listitem.model.SharedC import com.bitwarden.authenticator.ui.platform.components.listitem.model.VerificationCodeDisplayItem import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText +import kotlinx.collections.immutable.persistentListOf import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test @@ -15,7 +16,7 @@ class SharedVerificationCodesStateTest { @Test fun `toSharedCodesDisplayState on empty list should return empty list`() { val state = SharedVerificationCodesState.Success(emptyList()) - val expected = SharedCodesDisplayState.Codes(emptyList()) + val expected = SharedCodesDisplayState.Codes(persistentListOf()) assertEquals( expected, state.toSharedCodesDisplayState(ALERT_THRESHOLD), @@ -59,7 +60,7 @@ class SharedVerificationCodesStateTest { ), ) val expected = SharedCodesDisplayState.Codes( - sections = listOf( + sections = persistentListOf( SharedCodesDisplayState.SharedCodesAccountSection( id = "user1", label = BitwardenString.shared_accounts_header.asText( @@ -67,7 +68,7 @@ class SharedVerificationCodesStateTest { "bitwarden.com", 1, ), - codes = listOf( + codes = persistentListOf( VerificationCodeDisplayItem( authCode = "123456", periodSeconds = 30, @@ -76,7 +77,7 @@ class SharedVerificationCodesStateTest { title = "--", subtitle = null, favorite = false, - allowLongPressActions = false, + showOverflow = false, alertThresholdSeconds = ALERT_THRESHOLD, showMoveToBitwarden = false, ), @@ -90,7 +91,7 @@ class SharedVerificationCodesStateTest { "bitwarden.eu", 1, ), - codes = listOf( + codes = persistentListOf( VerificationCodeDisplayItem( authCode = "987654", periodSeconds = 30, @@ -99,7 +100,7 @@ class SharedVerificationCodesStateTest { title = "issuer", subtitle = "accountName", favorite = false, - allowLongPressActions = false, + showOverflow = false, alertThresholdSeconds = ALERT_THRESHOLD, showMoveToBitwarden = false, ), @@ -151,7 +152,7 @@ class SharedVerificationCodesStateTest { ), ) val expected = SharedCodesDisplayState.Codes( - sections = listOf( + sections = persistentListOf( SharedCodesDisplayState.SharedCodesAccountSection( id = "user1", label = BitwardenString.shared_accounts_header.asText( @@ -159,7 +160,7 @@ class SharedVerificationCodesStateTest { "bitwarden.com", 1, ), - codes = listOf( + codes = persistentListOf( VerificationCodeDisplayItem( authCode = "123456", periodSeconds = 30, @@ -168,7 +169,7 @@ class SharedVerificationCodesStateTest { title = "--", subtitle = null, favorite = false, - allowLongPressActions = false, + showOverflow = false, alertThresholdSeconds = ALERT_THRESHOLD, showMoveToBitwarden = false, ), @@ -182,7 +183,7 @@ class SharedVerificationCodesStateTest { "bitwarden.eu", 1, ), - codes = listOf( + codes = persistentListOf( VerificationCodeDisplayItem( authCode = "987654", periodSeconds = 30, @@ -191,7 +192,7 @@ class SharedVerificationCodesStateTest { title = "issuer", subtitle = "accountName", favorite = false, - allowLongPressActions = false, + showOverflow = false, alertThresholdSeconds = ALERT_THRESHOLD, showMoveToBitwarden = false, ), diff --git a/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/util/VerificationCodeItemExtensionsTest.kt b/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/util/VerificationCodeItemExtensionsTest.kt index 09ae75181b..afd7bb48d3 100644 --- a/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/util/VerificationCodeItemExtensionsTest.kt +++ b/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/util/VerificationCodeItemExtensionsTest.kt @@ -29,7 +29,7 @@ class VerificationCodeItemExtensionsTest { alertThresholdSeconds = alertThresholdSeconds, authCode = favoriteItem.code, favorite = (favoriteItem.source as AuthenticatorItem.Source.Local).isFavorite, - allowLongPressActions = true, + showOverflow = true, showMoveToBitwarden = false, ) @@ -42,7 +42,7 @@ class VerificationCodeItemExtensionsTest { alertThresholdSeconds = alertThresholdSeconds, authCode = nonFavoriteItem.code, favorite = (nonFavoriteItem.source as AuthenticatorItem.Source.Local).isFavorite, - allowLongPressActions = true, + showOverflow = true, showMoveToBitwarden = false, ) @@ -51,7 +51,7 @@ class VerificationCodeItemExtensionsTest { favoriteItem.toDisplayItem( alertThresholdSeconds = alertThresholdSeconds, sharedVerificationCodesState = SharedVerificationCodesState.Error, - allowLongPressActions = true, + showOverflow = true, ), ) assertEquals( @@ -59,7 +59,7 @@ class VerificationCodeItemExtensionsTest { nonFavoriteItem.toDisplayItem( alertThresholdSeconds = alertThresholdSeconds, sharedVerificationCodesState = SharedVerificationCodesState.Error, - allowLongPressActions = true, + showOverflow = true, ), ) } @@ -79,7 +79,7 @@ class VerificationCodeItemExtensionsTest { alertThresholdSeconds = alertThresholdSeconds, authCode = item.code, favorite = false, - allowLongPressActions = true, + showOverflow = true, showMoveToBitwarden = false, ) @@ -88,7 +88,7 @@ class VerificationCodeItemExtensionsTest { item.toDisplayItem( alertThresholdSeconds = alertThresholdSeconds, sharedVerificationCodesState = SharedVerificationCodesState.AppNotInstalled, - allowLongPressActions = true, + showOverflow = true, ), ) assertEquals( @@ -96,7 +96,7 @@ class VerificationCodeItemExtensionsTest { item.toDisplayItem( alertThresholdSeconds = alertThresholdSeconds, sharedVerificationCodesState = SharedVerificationCodesState.Error, - allowLongPressActions = true, + showOverflow = true, ), ) assertEquals( @@ -104,7 +104,7 @@ class VerificationCodeItemExtensionsTest { item.toDisplayItem( alertThresholdSeconds = alertThresholdSeconds, sharedVerificationCodesState = SharedVerificationCodesState.FeatureNotEnabled, - allowLongPressActions = true, + showOverflow = true, ), ) assertEquals( @@ -112,7 +112,7 @@ class VerificationCodeItemExtensionsTest { item.toDisplayItem( alertThresholdSeconds = alertThresholdSeconds, sharedVerificationCodesState = SharedVerificationCodesState.Loading, - allowLongPressActions = true, + showOverflow = true, ), ) assertEquals( @@ -120,7 +120,7 @@ class VerificationCodeItemExtensionsTest { item.toDisplayItem( alertThresholdSeconds = alertThresholdSeconds, sharedVerificationCodesState = SharedVerificationCodesState.OsVersionNotSupported, - allowLongPressActions = true, + showOverflow = true, ), ) assertEquals( @@ -128,7 +128,7 @@ class VerificationCodeItemExtensionsTest { item.toDisplayItem( alertThresholdSeconds = alertThresholdSeconds, sharedVerificationCodesState = SharedVerificationCodesState.SyncNotEnabled, - allowLongPressActions = true, + showOverflow = true, ), ) @@ -140,7 +140,7 @@ class VerificationCodeItemExtensionsTest { item.toDisplayItem( alertThresholdSeconds = alertThresholdSeconds, sharedVerificationCodesState = SharedVerificationCodesState.Success(emptyList()), - allowLongPressActions = true, + showOverflow = true, ), ) } @@ -168,7 +168,7 @@ class VerificationCodeItemExtensionsTest { alertThresholdSeconds = alertThresholdSeconds, authCode = favoriteItem.code, favorite = false, - allowLongPressActions = false, + showOverflow = false, showMoveToBitwarden = false, ) @@ -177,7 +177,7 @@ class VerificationCodeItemExtensionsTest { favoriteItem.toDisplayItem( alertThresholdSeconds = alertThresholdSeconds, sharedVerificationCodesState = SharedVerificationCodesState.Error, - allowLongPressActions = false, + showOverflow = false, ), ) } diff --git a/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/SettingsScreenTest.kt b/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/SettingsScreenTest.kt index d2d0863f09..ec39b18392 100644 --- a/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/SettingsScreenTest.kt +++ b/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/SettingsScreenTest.kt @@ -20,6 +20,7 @@ import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme import com.bitwarden.ui.platform.manager.IntentManager import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText +import com.bitwarden.ui.util.assertNoDialogExists import com.bitwarden.ui.util.concat import io.mockk.every import io.mockk.just @@ -175,6 +176,38 @@ class SettingsScreenTest : AuthenticatorComposeTest() { .onNode(isDialog()) .assertDoesNotExist() } + + @Test + fun `on allow screen capture confirm should send AllowScreenCaptureToggle`() { + composeTestRule.onNodeWithText("Allow screen capture").performScrollTo().performClick() + composeTestRule.onNodeWithText("Yes").performClick() + composeTestRule.assertNoDialogExists() + + verify { + viewModel.trySendAction( + SettingsAction.SecurityClick.AllowScreenCaptureToggle(true), + ) + } + } + + @Test + fun `on allow screen capture cancel should dismiss dialog`() { + composeTestRule.onNodeWithText("Allow screen capture").performScrollTo().performClick() + composeTestRule + .onAllNodesWithText("Cancel") + .filterToOne(hasAnyAncestor(isDialog())) + .performClick() + composeTestRule.assertNoDialogExists() + } + + @Test + fun `on allow screen capture row click should display confirm enable screen capture dialog`() { + composeTestRule.onNodeWithText("Allow screen capture").performScrollTo().performClick() + composeTestRule + .onAllNodesWithText("Allow screen capture") + .filterToOne(hasAnyAncestor(isDialog())) + .assertIsDisplayed() + } } private val APP_LANGUAGE = AppLanguage.ENGLISH @@ -194,4 +227,5 @@ private val DEFAULT_STATE = SettingsState( version = BitwardenString.version.asText() .concat(": ${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})".asText()), copyrightInfo = "© Bitwarden Inc. 2015-2024".asText(), + allowScreenCapture = false, ) diff --git a/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/SettingsViewModelTest.kt b/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/SettingsViewModelTest.kt index 3f4a99e9ca..b43fffd3e0 100644 --- a/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/SettingsViewModelTest.kt +++ b/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/SettingsViewModelTest.kt @@ -47,6 +47,7 @@ class SettingsViewModelTest : BaseViewModelTest() { every { sharedCodesStateFlow } returns mutableSharedCodesFlow } private val mutableDefaultSaveOptionFlow = bufferedMutableSharedFlow() + private val mutableScreenCaptureAllowedStateFlow = MutableStateFlow(false) private val settingsRepository: SettingsRepository = mockk { every { appLanguage } returns APP_LANGUAGE every { appTheme } returns APP_THEME @@ -54,6 +55,9 @@ class SettingsViewModelTest : BaseViewModelTest() { every { defaultSaveOptionFlow } returns mutableDefaultSaveOptionFlow every { isUnlockWithBiometricsEnabled } returns true every { isCrashLoggingEnabled } returns true + every { isScreenCaptureAllowedStateFlow } returns mutableScreenCaptureAllowedStateFlow + every { isScreenCaptureAllowed } answers { mutableScreenCaptureAllowedStateFlow.value } + every { isScreenCaptureAllowed = any() } just runs } private val clipboardManager: BitwardenClipboardManager = mockk() @@ -197,6 +201,30 @@ class SettingsViewModelTest : BaseViewModelTest() { } } + @Test + fun `on AllowScreenCaptureToggled should update value in state and SettingsRepository`() = + runTest { + val viewModel = createViewModel() + val newScreenCaptureAllowedValue = true + + viewModel.trySendAction( + SettingsAction.SecurityClick.AllowScreenCaptureToggle( + newScreenCaptureAllowedValue, + ), + ) + + verify(exactly = 1) { + settingsRepository.isScreenCaptureAllowed = newScreenCaptureAllowedValue + } + + viewModel.stateFlow.test { + assertEquals( + DEFAULT_STATE.copy(allowScreenCapture = true), + awaitItem(), + ) + } + } + private fun createViewModel( savedState: SettingsState? = DEFAULT_STATE, ) = SettingsViewModel( @@ -231,4 +259,5 @@ private val DEFAULT_STATE = SettingsState( version = BitwardenString.version.asText() .concat(": ${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})".asText()), copyrightInfo = "© Bitwarden Inc. 2015-2024".asText(), + allowScreenCapture = false, ) diff --git a/core/src/main/kotlin/com/bitwarden/core/data/manager/model/FlagKey.kt b/core/src/main/kotlin/com/bitwarden/core/data/manager/model/FlagKey.kt index afb8d2e8df..6b950e1563 100644 --- a/core/src/main/kotlin/com/bitwarden/core/data/manager/model/FlagKey.kt +++ b/core/src/main/kotlin/com/bitwarden/core/data/manager/model/FlagKey.kt @@ -34,6 +34,7 @@ sealed class FlagKey { CredentialExchangeProtocolExport, ForceUpdateKdfSettings, CipherKeyEncryption, + NoLogoutOnKdfChange, ) } } @@ -80,6 +81,14 @@ sealed class FlagKey { override val defaultValue: Boolean = false } + /** + * Data object holding the feature flag key for the No Logout On KDF Change feature. + */ + data object NoLogoutOnKdfChange : FlagKey() { + override val keyName: String = "pm-23995-no-logout-on-kdf-change" + override val defaultValue: Boolean = false + } + //region Dummy keys for testing /** * Data object holding the key for a [Boolean] flag to be used in tests. diff --git a/ui/src/main/kotlin/com/bitwarden/ui/platform/components/debug/FeatureFlagListItems.kt b/ui/src/main/kotlin/com/bitwarden/ui/platform/components/debug/FeatureFlagListItems.kt index 84d29a3602..fbad9acb4d 100644 --- a/ui/src/main/kotlin/com/bitwarden/ui/platform/components/debug/FeatureFlagListItems.kt +++ b/ui/src/main/kotlin/com/bitwarden/ui/platform/components/debug/FeatureFlagListItems.kt @@ -28,6 +28,7 @@ fun FlagKey.ListItemContent( FlagKey.CredentialExchangeProtocolExport, FlagKey.CipherKeyEncryption, FlagKey.ForceUpdateKdfSettings, + FlagKey.NoLogoutOnKdfChange, -> { @Suppress("UNCHECKED_CAST") BooleanFlagItem( @@ -73,6 +74,7 @@ private fun FlagKey.getDisplayLabel(): String = when (this) { FlagKey.CredentialExchangeProtocolExport -> stringResource(BitwardenString.cxp_export) FlagKey.CipherKeyEncryption -> stringResource(BitwardenString.cipher_key_encryption) FlagKey.ForceUpdateKdfSettings -> stringResource(BitwardenString.force_update_kdf_settings) + FlagKey.NoLogoutOnKdfChange -> stringResource(BitwardenString.avoid_logout_on_kdf_change) FlagKey.BitwardenAuthenticationEnabled -> { stringResource(BitwardenString.bitwarden_authentication_enabled) } diff --git a/ui/src/main/res/values-af-rZA/strings.xml b/ui/src/main/res/values-af-rZA/strings.xml index 50fa49f09a..779ea086fa 100644 --- a/ui/src/main/res/values-af-rZA/strings.xml +++ b/ui/src/main/res/values-af-rZA/strings.xml @@ -124,7 +124,7 @@ New identity There are no notes in your vault. New note - New item + Nuwe item New SSH key There are no text Sends in your vault. There are no file Sends in your vault. @@ -161,7 +161,7 @@ Items Items vir %1$s Daar is geen items in u kluis vir %1$s nie. - There are no items in your vault that match “%1$s” + Daar is geen items in jou kluis wat met \"%1$s\" ooreenstem nie Search for a login or add a new login Gedeaktiveer The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. @@ -327,7 +327,7 @@ Skandering gebeur outomaties. Tipe Skuif af Skuif op - Owner + Eienaar Daar is geen versamelings om te lys nie. %1$s geskuif na %2$s. U moet ten minste een versameling kies. @@ -458,7 +458,7 @@ Skandering gebeur outomaties. Vereis opsioneel ’n wagwoord vir gebruikers om toegang tot hierdie Send te verkry. Verwyder wagwoord Verwyder tans wagwoord - Password removed + Wagwoord geverwydered Voeg ’n Send toe Kopieer skakel Deel skakel @@ -683,7 +683,7 @@ Wil u na die rekening omskakel? Passkey operation failed because browser signature does not match Passkey operation failed because of missing asset links Passkey operation failed because app could not be verified - Confirm file password + Bevesting lêer-wagwoord File password Password Protected This password will be used to export and import this file @@ -721,7 +721,7 @@ Wil u na die rekening omskakel? Set up later Set up unlock later? You can return to complete this step anytime from Account Security in Settings. - Confirm + Bevestig Set up biometrics or choose a PIN code to quickly access your vault and Autofill your logins. Never lose access to your vault The best way to make sure you can always access your vault is to set up safeguards from the start. @@ -740,7 +740,7 @@ Wil u na die rekening omskakel? Email address (required) Select the link in the email to verify your email address and continue creating your account. Change email address - Next + Volgende Bitwarden cannot recover a lost or forgotten master password. Bitwarden cannot reset a lost or forgotten master password. Choose your master password @@ -772,7 +772,7 @@ Wil u na die rekening omskakel? Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance. Master password hint New master password hint - Get started + Val weg Save and protect your data The vault protects more than just passwords. Store secure logins, IDs, cards and notes securely here. New login @@ -820,7 +820,7 @@ Wil u na die rekening omskakel? Bitwarden Tools Got it No logins were imported - Import error + Invoer fout Logins imported Remember to delete your imported password file from your computer SSH key @@ -833,7 +833,7 @@ Wil u na die rekening omskakel? Log in quickly and easily across devices Bitwarden can notify you each time you receive a new login request from another device. Skip for now - Done + Klaar %1$s of %2$s Copy identity name Copy company @@ -930,7 +930,7 @@ Wil u na die rekening omskakel? Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. For details on what is and isn’t logged, visit the\nBitwarden help center. Logging duration - 1 hour + 1 uur 8 hours 24 hours 1 week @@ -963,7 +963,7 @@ Wil u na die rekening omskakel? This account will soon be deleted. Log in at %1$s to continue using Bitwarden. View file Send View text Send - Delete Send + Skrap Send Missing Send re-sync your vault Use dynamic colors Use dynamic colors? @@ -1135,4 +1135,6 @@ Wil u na die rekening omskakel? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-ar-rSA/strings.xml b/ui/src/main/res/values-ar-rSA/strings.xml index c4a50b7f96..64de33585e 100644 --- a/ui/src/main/res/values-ar-rSA/strings.xml +++ b/ui/src/main/res/values-ar-rSA/strings.xml @@ -85,7 +85,7 @@ تحرير البطاقة تعديل الهوية تعديل الملاحظة - Edit SSH key + تعديل مفتاح SSH أدخل عنوان البريد الإلكتروني لحسابك لتلقي دليل كلمة المرور الرئيسية. المفضلة إزالة من المفضلة @@ -160,7 +160,7 @@ عرض البطاقة عرض الهوية عرض الملاحظة - View SSH key + عرض مفتاح SSH خزنة الويب بت واردن العناصر عناصر لـ %1$s @@ -168,15 +168,15 @@ لا توجد عناصر في خزانتك تطابق \"%1$s” البحث عن تسجيل الدخول أو إضافة تسجيل دخول جديد تعطيل - The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. - Autofill + أسهل طريقة لإضافة تسجيلات دخول جديدة إلى خزانتك هي من خدمة التعبئة التلقائية بت واردن تعرف على المزيد حول استخدام خدمة الملء التلقائي لـ بت واردن عن طريق الانتقال إلى شاشة \"إعدادات\". + ملء تلقائي هل تريد الملأ التلقائي أو رؤية هذا المعرّف؟ بحث تعرف على المؤسسات تطبيق المُصادَقة أدخل رمز التحقق من 6 أرقام من تطبيق المصادقة الخاص بك. أدخل رمز التحقق المكون من 6 أرقام الذي تم ارساله إلى %1$s. - We don’t recognize this device. Enter the code sent to your email to verify your identity. + لم نتعرف على هذا الجهاز. أدخل الرمز المرسل إلى بريدك الإلكتروني للتحقق من هويتك. رمز الاسترداد تذكر تذكر البريد الإلكتروني @@ -402,7 +402,7 @@ واحدة أو أكثر من سياسات المؤسسة تؤثر على إعدادات المولد الخاص بك كانت هناك مشكلة في حفظ هذا المرفق. إذا استمرت المشكلة ، يمكنك حفظها من خزنة الويب. تم حفظ المرفق بنجاح - Please turn on “Autofill Accessibility Service” from Bitwarden Settings to use the Autofill tile. + الرجاء تمكين \"خدمة الوصول إلى الملء التلقائي\" من إعدادات بت واردن لاستخدام الملء التلقائي. لم يتم العثور على حقول كلمة المرور Sending to trash… تم إرسال العنصر إلى سلة المهملات. @@ -466,7 +466,7 @@ بشكل اختياري يتطلب كلمة مرور للمستخدمين للوصول إلى هذا الإرسال. إزالة كلمة المرور إزالة كلمة المرور - Password removed + تمت إزالة كلمة المرور إضافة إرسال نسخ الرابط مشاركة الرّابط @@ -475,8 +475,8 @@ عدّل الإرسال Edit file Send Edit text Send - New file Send - New text Send + إرسال ملف جديد + إرسال نص جديد هل أنت متأكد من أنك تريد حذف هذا الإرسال؟ تم حذف الإرسال. Send updated @@ -746,7 +746,7 @@ تعرف على طرق منع قفل الحساب المساعدة في الملقمات الجغرافية للخادم. عنوان البريد الإلكتروني (مطلوب) - Select the link in the email to verify your email address and continue creating your account. + حدد الرابط الموجود في البريد الإلكتروني للتحقق من عنوان البريد الإلكتروني الخاص بك ومواصلة إنشاء الحساب الخاص بك. تغيير عنوان البريد الإلكتروني التالي لا يمكن لشركة بت واردن أن تستعيد كلمة المرور الرئيسية المفقودة أو المنسية. @@ -780,7 +780,7 @@ Turn on browser autofill integration later? يمكنك العودة لإكمال هذه الخطوة في أي وقت من الإعدادات. يمكنك الآن استكشاف كل ما يجب على بت واردن تقديمه وبدء إدارة كلمات المرور الخاصة بك بشكل آمن. - You’re all set! + أنت جاهز تمامًا! خطأ في الاتصال بخدمة Duo. استخدم طريقة تسجيل الدخول بخطوتين مختلفة أو اتصل بـ Duo للمساعدة. تلميح كلمة المرور الرئيسية تلميح كلمة المرور الرئيسية @@ -820,7 +820,7 @@ بحاجة إلى مساعدة؟ تحقق من مساعدة الاستيراد. حفظ الملف المصدّر في مكان ما على جهاز الكمبيوتر الخاص بك يمكنك العثور عليه بسهولة. هذا ليس خادم بت واردن المعترف به. قد تحتاج إلى التحقق مع المزود الخاص بك أو تحديث الخادم الخاص بك. - Syncing logins… + مزامنة تسجيلات الدخول... تحميل ملحق المتصفح اذهب إلى bitwarden.com/download لدمج بت واردن في المتصفح المفضل لديك للحصول على تجربة سلسة. استخدام تطبيق الويب @@ -878,13 +878,13 @@ 3 من 3 يجب عليك إضافة عنوان ويب لاستخدام التعبئة التلقائية للوصول إلى هذا الحساب. تعرف على تسجيلات الدخول الجديدة - We’ll walk you through the key features to add a new login. + سوف نمشي عليك من خلال الميزات الرئيسية لإضافة تسجيل دخول جديد. استكشف المولد تعلم المزيد حول إنشاء بيانات اعتماد تسجيل الدخول الآمنة مع جولة مصحوبة بمرشدين. استيراد شهادة العميل أدخل كلمة مرور شهادة العميل و الاسم المستعار المرغوب لهذه الشهادة. إسم مستعار - Use the generator to create secure passwords, passphrases and usernames. + استخدم المولد لإنشاء كلمات مرور آمنة وعبارات المرور وأسماء المستخدم. عبارات المرور هي كلمات مرور قوية غالبا ما تكون أسهل للتذكر وكتابة كلمات مرور عشوائية. إنها مفيدة لتسجيل الدخول إلى الحسابات حيث لا تتوفر خدمة التعبئة التلقائية، مثل خدمة البث على التلفزيون الخاص بك. الأسماء الفريدة للمستخدمين تضيف طبقة إضافية من الأمان ويمكن أن تساعد في منع المخترقين من العثور على حساباتك. 1 من 6 @@ -893,8 +893,8 @@ 4 من 6 5 من 6 6 من 6 - Use these options to adjust your password to meet your account website’s requirements. - After you save your new password to Bitwarden, don’t forget to update it on your account website. + استخدم هذه الخيارات لضبط كلمة المرور الخاصة بك لتلبية متطلبات موقع الحساب الخاص بك. + بعد حفظ كلمة المرور الجديدة إلى بت واردن، لا تنسى تحديثها على موقع حسابك. تحقق من هويتك خطأ في تحميل الشهادة اسم مستعار للشهادة @@ -1000,7 +1000,7 @@ Installed apps Delete %s Failed to decrypt cipher. Contact support. - Decryption error + خطأ فك التشفير امسح كود الاستجابة السريع ضوئيًا لا يمكن إضافة مفتاح المصادقة؟ تمكين إذن الكاميرا لاستخدام الماسح الضوئي @@ -1149,9 +1149,9 @@ Import passwords, passkeys, and other item types from your Bitwarden vault. Items to import Exporting items… - Export failed - Passwords - Passkeys + فشل التصدير + كلمات المرور + مفاتيح المرور Why is this step required? Kdf update failed, active account not found. Please try again or contact us. An error occurred while trying to update your kdf settings. Please try again or contact us. @@ -1159,4 +1159,6 @@ Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-az-rAZ/strings.xml b/ui/src/main/res/values-az-rAZ/strings.xml index f59eae521c..952ae7ca8f 100644 --- a/ui/src/main/res/values-az-rAZ/strings.xml +++ b/ui/src/main/res/values-az-rAZ/strings.xml @@ -1112,8 +1112,8 @@ fəaliyyəti yaxalamaq üçün sizə vaxt verəcək. %1$d element seyfinizə köçürüldü. Parolları doldurmağa davam etmək üçün brauzer Avto-doldurma fəallaşdır - Your browser has recently updated, which has disabled Bitwarden autofill. To continue filling your passwords with Bitwarden, enable browser autofill in autofill settings. - Your browsers have recently updated, which has disabled Bitwarden autofill. To continue filling your passwords with Bitwarden, enable browser autofill for all installed browsers in autofill settings. + Brauzeriniz təzəlikcə güncəllənib və bu, Bitwarden-in avto-doldurma özəlliyini sıradan çıxardıb. Parollarınızı Bitwarden ilə doldurmağa davam etmək üçün avto-doldurma ayarlarında brauzer avto-doldurmanı fəallaşdırın. + Brauzerləriniz təzəlikcə güncəllənib və bu, Bitwarden-in avto-doldurma özəlliyini sıradan çıxardıb. Parollarınızı Bitwarden ilə doldurmağa davam etmək üçün quraşdırdığınız bütün brauzerlərin avto-doldurma ayarlarında brauzer avto-doldurmanı fəallaşdırın. İndi yox Bitwarden-dən daxilə köçür Hesab seç @@ -1133,7 +1133,9 @@ fəaliyyəti yaxalamaq üçün sizə vaxt verəcək. KDF güncəlləməsi uğursuz olud, aktiv hesab tapılmadı. Lütfən yenidən sınayın və ya bizim əlaqə saxlayın. KDF ayarlarınızı güncəlləməyə çalışarkən xəta baş verdi. Lütfən yenidən sınayın və ya bizimlə əlaqə saxlayın. Daxilə köçürmə tələbi emal oluna bilmədi. - Your vault may be empty, or importing some item types isn’t allowed for your account. - No items available to import - Select a different account + Ya seyfiniz boşdur, ya da hesabınız üçün bəzi element növlərinin daxilə köçürülməsinə icazə verilmir. + Daxilə köçürüləcək element yoxdur + Fərqli bir hesab seçin + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-be-rBY/strings.xml b/ui/src/main/res/values-be-rBY/strings.xml index 6195bf69ca..ae465c05ec 100644 --- a/ui/src/main/res/values-be-rBY/strings.xml +++ b/ui/src/main/res/values-be-rBY/strings.xml @@ -31,7 +31,7 @@ Памылковы асноўны пароль. Паспрабуйце яшчэ раз. Памылковы PIN. Паспрабуйце яшчэ раз. Запусціць - Log in + Увайсці Лагін Выйсці Вы сапраўды хочаце выйсці? @@ -61,7 +61,7 @@ Адправіць Сінхранізаваць URI - Website (URI) + Вэб-сайт (URI) Імя карыстальніка Поле %1$s з\'яўляецца абавязковым. You must attach a file to save this send. @@ -104,7 +104,7 @@ Set session timeout to “Log out”? After the timeout period, you will be logged out. You will need to be connected to the internet to log in and access your vault again. Your settings and PIN saved on this device won’t change. Logging in… - Log in to Bitwarden + Увайсці ў Bitwarden Няправільна пацвярджэнне пароля. Асноўны пароль — гэта ключ, які выкарыстоўваецца для доступу да вашага сховішча. Ён вельмі важны, таму не забывайце яго. Аднавіць асноўны пароль немагчыма ў выпадку, калі вы яго забылі. Падказка да асноўнага пароля (неабавязкова) @@ -126,7 +126,7 @@ New identity There are no notes in your vault. New note - New item + Новы элемент New SSH key There are no text Sends in your vault. There are no file Sends in your vault. @@ -145,7 +145,7 @@ Re-type master password (required) Пошук у сховішчы Выбраць - Item details + Падрабязнасці элемента Элемент абноўлены. Submitting… Syncing… @@ -163,7 +163,7 @@ Элементы Элементы для %1$s У вашым сховішчы адсутнічаюць элементы для %1$s. - There are no items in your vault that match “%1$s” + У вашым сховішчы адсутнічаюць элементы, якія адпавядаюць \"%1$s\" Search for a login or add a new login Адключана The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. @@ -288,7 +288,7 @@ Які тып карыстальніцкага поля вы хочаце дадаць? Выдаліць Новы URI - Add website + Дадаць вэб-сайт Асноўны дамен Default (%1$s) Дакладна @@ -306,7 +306,7 @@ Памылковы адрас электроннай пошты. Карткі Пасведчанні - Identification + Ідэнтыфікацыя Лагіны Абароненыя нататкі Personal Details @@ -330,7 +330,7 @@ Тып Перамясціць уніз Перамясціць уверх - Owner + Уладальнік У спісе адсутнічаюць калекцыі. %1$s перамешчана ў %2$s. Вы павінны выбраць прынамсі адну калекцыю. @@ -388,7 +388,7 @@ Код адпраўлены! Пацвердзіце сваю асобу для працягу. Пры экспартаванні файл утрымлівае даныя вашага сховішча ў незашыфраваным фармаце. Яго не варта захоўваць або адпраўляць па неабароненых каналах (напрыклад, па электроннай пошце). Выдаліце яго адразу пасля выкарыстання. - This file export will be password protected and require the file password to decrypt. + Гэты экспартаваны файл будзе абаронены паролем, які неабходна будзе ўвесці для яго расшыфроўкі. Пацвердзіць экспартаванне сховішча Папярэджанне There was a problem exporting your vault. If the problem persists, you’ll need to export from the web vault. @@ -461,7 +461,7 @@ Па магчымасці запытваць у карыстальнікаў пароль для доступу да гэтага Send. Выдаліць пароль Выдаленне пароля - Password removed + Пароль выдалены Дадаць Send Скапіяваць спасылку Абагуліць спасылку @@ -626,7 +626,7 @@ Ухваліць з дапамогай асноўнага пароля Turn off using a public device Запомніць гэту прыладу - Passkey + Ключ доступу Passkey will not be copied The passkey will not be copied to the cloned item. Do you want to continue cloning this item? Дапамога з паўторным запытам асноўнага пароля @@ -644,7 +644,7 @@ Гэты URI %1$s ужо заблакіраваны Уваход ухвалены Log in with device must be set up in the settings of the Bitwarden app. Need another option? - Log in with device + Увайсці з іншай прылады Увайсці на Logging in on: Сховішча @@ -686,10 +686,10 @@ Passkey operation failed because browser signature does not match Passkey operation failed because of missing asset links Passkey operation failed because app could not be verified - Confirm file password - File password + Пацвердзіць пароль файла + Пароль файла Password Protected - This password will be used to export and import this file + Гэты пароль будзе выкарыстоўвацца для экспартавання і імпартавання гэтага файла Autofill suggestion Continue to complete WebAuthn verification. Launch WebAuthn @@ -705,7 +705,7 @@ Unsubscribe Check your email Open email app - Email verified + Email пацверджаны Get emails from Bitwarden for announcements, advice, and research opportunities. Unsubscribe at any time. Security, prioritized Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you. @@ -724,7 +724,7 @@ Set up later Set up unlock later? You can return to complete this step anytime from Account Security in Settings. - Confirm + Пацвердзіць Set up biometrics or choose a PIN code to quickly access your vault and Autofill your logins. Never lose access to your vault The best way to make sure you can always access your vault is to set up safeguards from the start. @@ -743,7 +743,7 @@ Email address (required) Select the link in the email to verify your email address and continue creating your account. Change email address - Next + Далей Bitwarden cannot recover a lost or forgotten master password. Bitwarden cannot reset a lost or forgotten master password. Choose your master password @@ -754,7 +754,7 @@ %d characters %d characters - Expired link + Пратэрмінаваная спасылка Please restart registration or try logging in. You may already have an account. Restart registration Authenticator Sync @@ -775,12 +775,12 @@ You can now explore everything Bitwarden has to offer and start managing your passwords securely. You’re all set! Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance. - Master password hint + Падказка да асноўнага пароля New master password hint - Get started + Пачатак працы Save and protect your data The vault protects more than just passwords. Store secure logins, IDs, cards and notes securely here. - New login + Новы лагін Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure. Send sensitive information, safely Import saved logins @@ -804,7 +804,7 @@ On your computer, open a new browser tab and go to %1$s Log in to the Bitwarden web app. Step 2 of 3 - Log in to Bitwarden + Увайсці ў Bitwarden Step 3 of 3 Import logins to Bitwarden In the Bitwarden navigation, find the Tools option and select Import data. @@ -823,22 +823,22 @@ Import Successful! Manage your logins from anywhere with Bitwarden tools for web and desktop. Bitwarden Tools - Got it + Зразумела No logins were imported - Import error + Памылка імпартавання Logins imported Remember to delete your imported password file from your computer - SSH key + Ключ SSH Public key Private key SSH keys - Copy public key - Copy fingerprint + Скапіяваць публічны ключ + Скапіяваць адбітак пальца Enable notifications Log in quickly and easily across devices Bitwarden can notify you each time you receive a new login request from another device. Skip for now - Done + Гатова %1$s of %2$s Copy identity name Copy company @@ -861,7 +861,7 @@ Need some inspiration? Check out the passphrase generator We couldn’t verify the server’s certificate. The certificate chain or proxy settings on your device or your Bitwarden server may not be set up correctly. - Copy private key + Скапіяваць прыватны ключ Login Credentials Autofill Options Use this button to generate a new unique password. @@ -935,7 +935,7 @@ Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. For details on what is and isn’t logged, visit the\nBitwarden help center. Logging duration - 1 hour + 1 гадзіна 8 hours 24 hours 1 week @@ -968,7 +968,7 @@ This account will soon be deleted. Log in at %1$s to continue using Bitwarden. View file Send View text Send - Delete Send + Выдаліць Send Missing Send re-sync your vault Use dynamic colors Use dynamic colors? @@ -1138,7 +1138,7 @@ Exporting items… Export failed Passwords - Passkeys + Ключы доступу Why is this step required? Kdf update failed, active account not found. Please try again or contact us. An error occurred while trying to update your kdf settings. Please try again or contact us. @@ -1146,4 +1146,6 @@ Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-bg-rBG/strings.xml b/ui/src/main/res/values-bg-rBG/strings.xml index 25c1d65570..e94d12a579 100644 --- a/ui/src/main/res/values-bg-rBG/strings.xml +++ b/ui/src/main/res/values-bg-rBG/strings.xml @@ -1134,7 +1134,9 @@ Обновяването на KDF беше неуспешно. Не е намерен активен акаунт. Опитайте отново или се свържете с нас. Възникна грешка при опита за обновяване на настройките на KDF. Опитайте отново или се свържете с нас. Заявката за внасяне не може да бъде обработена. - Your vault may be empty, or importing some item types isn’t allowed for your account. - No items available to import - Select a different account + Трезорът Ви може би е празен, или внасянето на някои видове елементи може да не е позволено за акаунта Ви. + Няма елементи налични за внасяне + Изберете друг акаунт + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-bn-rBD/strings.xml b/ui/src/main/res/values-bn-rBD/strings.xml index 49493225c9..9b6c15b3a8 100644 --- a/ui/src/main/res/values-bn-rBD/strings.xml +++ b/ui/src/main/res/values-bn-rBD/strings.xml @@ -29,7 +29,7 @@ চালিয়ে যাওয়ার আগে দয়া করে ইন্টারনেটে সংযোগ করুন। ইন্টারনেট সংযোগ প্রয়োজন Invalid master password. Try again. - Invalid PIN. Try again. + অবৈধ পিন। আবার চেষ্টা করুন। Launch লগ ইন করুন লগইন @@ -67,7 +67,7 @@ You must attach a file to save this send. %1$s copied প্রধান পাসওয়ার্ড যাচাইকরণ - Verify PIN + পিন যাচাই করুন দেখুন হ্যাঁ অ্যাকাউন্ট @@ -1135,4 +1135,6 @@ Do you want to switch to this account? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-bs-rBA/strings.xml b/ui/src/main/res/values-bs-rBA/strings.xml index 087f584b55..3686c83711 100644 --- a/ui/src/main/res/values-bs-rBA/strings.xml +++ b/ui/src/main/res/values-bs-rBA/strings.xml @@ -306,7 +306,7 @@ Skeniranje će biti izvršeno automatski. Neispravna email adresa Kartice Identiteti - Identification + Identifikacija Prijave Sigurna zabilješke Personal Details @@ -603,7 +603,7 @@ Skeniranje će biti izvršeno automatski. Omogućite dozvolu za korištenje kamere da bi koristili skener Language The language has been changed to %1$s. Please restart the app to see the change - Default (System) + Zadano (Sistem) Slaba glavna lozinka Slaba lozinka prepoznata. Koristite jaku lozinku za zaštitu Vašeg računa. Da li ste sigurni da želite koristiti slabu lozinku? Slabo @@ -642,7 +642,7 @@ Skeniranje će biti izvršeno automatski. The URI %1$s is already blocked Login approved Log in with device must be set up in the settings of the Bitwarden app. Need another option? - Log in with device + Prijava sa drugim uređajem Logging in on Logging in on: Vault @@ -822,7 +822,7 @@ Skeniranje će biti izvršeno automatski. Bitwarden Tools Got it No logins were imported - Import error + Greška pri uvozu Logins imported Remember to delete your imported password file from your computer SSH key @@ -835,7 +835,7 @@ Skeniranje će biti izvršeno automatski. Log in quickly and easily across devices Bitwarden can notify you each time you receive a new login request from another device. Skip for now - Done + Gotovo %1$s of %2$s Copy identity name Copy company @@ -932,7 +932,7 @@ Skeniranje će biti izvršeno automatski. Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. For details on what is and isn’t logged, visit the\nBitwarden help center. Logging duration - 1 hour + 1 sat 8 hours 24 hours 1 week @@ -1140,4 +1140,6 @@ Skeniranje će biti izvršeno automatski. Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-ca-rES/strings.xml b/ui/src/main/res/values-ca-rES/strings.xml index 30d08dcf7d..523e317e80 100644 --- a/ui/src/main/res/values-ca-rES/strings.xml +++ b/ui/src/main/res/values-ca-rES/strings.xml @@ -85,7 +85,7 @@ Edita la targeta Edita la identitat Edita la nota - Edit SSH key + Editar la clau SSH Introduïu l\'adreça electrònica del vostre compte per rebre la contrasenya mestra. Preferit Unfavorite @@ -118,13 +118,13 @@ Mai S\'ha afegit un element There are no cards in your vault. - New card + Nova targeta There are no logins in your vault. There are no identities in your vault. - New identity + Identitat nova There are no notes in your vault. New note - New item + Element nou Nova clau SSH There are no text Sends in your vault. There are no file Sends in your vault. @@ -143,7 +143,7 @@ Re-type master password (required) Cerca en la caixa forta Selecciona - Item details + Detalls de l\'element Element guardat Submitting… Syncing… @@ -164,15 +164,15 @@ No hi ha cap element a la caixa forta que coincidisca amb \"%1$s\" Search for a login or add a new login No - The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. - Autofill + La forma més senzilla d\'afegir nous inicis de sessió a la caixa forta és amb el servei d\'emplenament automàtic de Bitwarden. Obteniu més informació sobre com utilitzar el servei en la pantalla \"Eines\". + Emplenament automàtic Voleu omplir automàticament o visualitzar aquest element? Cerca Més informació sobre les organitzacions Aplicació autenticadora Introduïu el codi de verificació de 6 dígits de l\'aplicació autenticadora. Introduïu el codi de verificació de 6 dígits que s\'ha enviat per correu electrònic a %1$s. - We don’t recognize this device. Enter the code sent to your email to verify your identity. + No reconeixem aquest dispositiu. Introduïu el codi que us hem enviat al correu electrònic per verificar la identitat. Codi de recuperació Recorda-ho Recorda el correu electronic @@ -287,7 +287,7 @@ L\'escaneig es farà automàticament. Quin tipus de camp personalitzat voleu afegir? Suprimeix Nova URI - Add website + Afig un lloc web Domini base Default (%1$s) Exacte @@ -305,7 +305,7 @@ L\'escaneig es farà automàticament. L’adreça electrònica no és vàlida. Targetes Identitats - Identification + Identificació Inicis de sessió Notes segures Personal Details @@ -327,7 +327,7 @@ L\'escaneig es farà automàticament. Tipus Desplaça cap avall Desplaça cap amunt - Owner + Propietari No hi ha cap col·lecció per llistar. %1$s desplaçat a %2$s. Heu d\'escollir com a mínim una col·lecció. @@ -394,7 +394,7 @@ L\'escaneig es farà automàticament. Una o més polítiques d’organització afecten la configuració del generador. S\'ha produït un problema en guardar aquest fitxer adjunt. Si el problema continua, podeu guardar-lo des del web. L\'adjunt s\'ha guardat correctament - Please turn on “Autofill Accessibility Service” from Bitwarden Settings to use the Autofill tile. + Activeu \"Servei d\'accessibilitat d\'emplenament automàtic\" de la configuració de Bitwarden per utilitzar el mosaic d\'emplenament automàtic. No s\'han detectat camps de contrasenya Sending to trash… L\'element s\'ha enviat a la paperera. @@ -458,7 +458,7 @@ L\'escaneig es farà automàticament. Necessiteu aquesta contrasenya per veure el Send. Suprimeix la contrasenya S\'està suprimint la contrasenya - Password removed + Contrasenya suprimida Nou Send Copia l\'enllaç Comparteix l\'enllaç @@ -751,11 +751,11 @@ Voleu canviar a aquest compte? Enllaç caducat Please restart registration or try logging in. You may already have an account. - Restart registration + Reinicia el registre Authenticator Sync Permet la sincronització de l\'autenticador There was an issue validating the registration token. - Turn on autofill + Activeu l\'emplenament automàtic Autofill setup Turn on browser autofill integration You’re using a browser that requires special permissions for Bitwarden to autofill your passwords. @@ -769,13 +769,13 @@ Voleu canviar a aquest compte? You can return to complete this step anytime in Settings. You can now explore everything Bitwarden has to offer and start managing your passwords securely. You’re all set! - Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance. - Master password hint - New master password hint + S\'ha produït un error en connectar amb el servei Duo. Utilitzeu un mètode d\'inici de sessió en dos passos diferent o poseu-vos en contacte amb Duo per obtenir ajuda. + Pista de la contrasenya mestra + Obteniu la pista de la contrasenya mestra Comencem Save and protect your data The vault protects more than just passwords. Store secure logins, IDs, cards and notes securely here. - New login + Inici de sessió nou Comparteix fitxers i dades de manera segura amb qualsevol persona, en qualsevol plataforma. La teua informació romandrà xifrada de principi a fi i alhora limitarà l\'exposició. Envieu informació confidencial, de manera segura Import saved logins @@ -799,7 +799,7 @@ Voleu canviar a aquest compte? On your computer, open a new browser tab and go to %1$s Log in to the Bitwarden web app. Step 2 of 3 - Log in to Bitwarden + Inicia sessió a Bitwarden Step 3 of 3 Import logins to Bitwarden In the Bitwarden navigation, find the Tools option and select Import data. @@ -818,22 +818,22 @@ Voleu canviar a aquest compte? Import Successful! Manage your logins from anywhere with Bitwarden tools for web and desktop. Bitwarden Tools - Got it + D\'acord No logins were imported - Import error + Error d\'importació Logins imported Remember to delete your imported password file from your computer Clau SSH - Public key - Private key + Clau pública + Clau privada Claus SSH - Copy public key - Copy fingerprint + Copieu la clau pública + Copia l\'empremta digital Enable notifications Log in quickly and easily across devices Bitwarden can notify you each time you receive a new login request from another device. Skip for now - Done + Fet %1$s of %2$s Copy identity name Copy company @@ -856,7 +856,7 @@ Voleu canviar a aquest compte? Need some inspiration? Check out the passphrase generator We couldn’t verify the server’s certificate. The certificate chain or proxy settings on your device or your Bitwarden server may not be set up correctly. - Copy private key + Copia la clau privada Login Credentials Autofill Options Use this button to generate a new unique password. @@ -908,7 +908,7 @@ Voleu canviar a aquest compte? Credential operation failed because user is locked out. Credential operation failed because the selected item does not exist. Credential operation failed because user verification was cancelled. - Self-host server URL + URL del servidor autoallotjat Use Brave autofill integration Utilitza la integració d\'emplenament automàtic de Chrome Use Chrome Beta autofill integration @@ -934,8 +934,8 @@ Voleu canviar a aquest compte? 8 hores 24 hores 1 setmana - Delete all - Share all + Suprimeix-ho tot + Compartir-ho tot Unable to share Please try again or select a different log. The log file you are trying to share has been removed. @@ -946,11 +946,11 @@ Voleu canviar a aquest compte? Confirm Key Connector domain Key Connector domain: Organization: - A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator. + Ja no cal contrasenya mestra per als membres de la següent organització. Confirma\'n el domini a sota amb l\'administrador de la teva organització. Please confirm the domain below with your organization administrator.\n\nKey Connector domain:\n%1$s Registrador al vol activat El registrador al vol estarà actiu fins al %1$s a les %2$s. Torna a la configuració per desactivar-lo ara. - Go to settings + Vés a la configuració All logs deleted Log deleted App settings @@ -963,7 +963,7 @@ Voleu canviar a aquest compte? This account will soon be deleted. Log in at %1$s to continue using Bitwarden. View file Send View text Send - Delete Send + Suprimeix el Send Missing Send re-sync your vault Use dynamic colors Use dynamic colors? @@ -988,7 +988,7 @@ Voleu canviar a aquest compte? Aplicacions instal·lades Suprimeix %s Failed to decrypt cipher. Contact support. - Decryption error + Error de desxifrat Escaneja un codi QR No es pot afegir la clau d\'autenticació? Habilita el permís de la càmera per utilitzar l\'escàner @@ -1126,8 +1126,8 @@ Voleu canviar a aquest compte? Items to import Exporting items… Export failed - Passwords - Passkeys + Contrasenyes + Claus de pas Why is this step required? Kdf update failed, active account not found. Please try again or contact us. An error occurred while trying to update your kdf settings. Please try again or contact us. @@ -1135,4 +1135,6 @@ Voleu canviar a aquest compte? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-cs-rCZ/strings.xml b/ui/src/main/res/values-cs-rCZ/strings.xml index 60be12473d..2f5ffe0d7c 100644 --- a/ui/src/main/res/values-cs-rCZ/strings.xml +++ b/ui/src/main/res/values-cs-rCZ/strings.xml @@ -1145,7 +1145,9 @@ při opakování problémů. Aktualizace KDF se nezdařila, aktivní účet nebyl nalezen. Zkuste to znovu nebo nás kontaktujte. Při pokusu o aktualizaci nastavení KDF došlo k chybě. Zkuste to znovu nebo nás kontaktujte. Požadavek na import nelze zpracovat. - Your vault may be empty, or importing some item types isn’t allowed for your account. - No items available to import - Select a different account + Váš trezor může být prázdný, nebo importování některých typů položek není pro Váš účet povoleno. + Pro import nejsou k dispozici žádné položky + Vybrat jiný účet + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-cy-rGB/strings.xml b/ui/src/main/res/values-cy-rGB/strings.xml index dbdda8b913..2ec483b87f 100644 --- a/ui/src/main/res/values-cy-rGB/strings.xml +++ b/ui/src/main/res/values-cy-rGB/strings.xml @@ -31,7 +31,7 @@ Prif gyfrinair annilys. Rhowch gynnig arall arni. PIN annilys. Rhowch gynnig arall arni. Lansio - Log in + Mewngofnodi Mewngofnodi Allgofnodi Ydych chi\'n siŵr eich bod am allgofnodi? @@ -67,7 +67,7 @@ You must attach a file to save this send. %1$s wedi\'i gopïo Gwirio\'r prif gyfrinair - Verify PIN + Gwirio\'r PIN Gweld Ydw Cyfrif @@ -104,7 +104,7 @@ Set session timeout to “Log out”? After the timeout period, you will be logged out. You will need to be connected to the internet to log in and access your vault again. Your settings and PIN saved on this device won’t change. Logging in… - Log in to Bitwarden + Mewngofnodi i Bitwarden Password confirmation is not correct. The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it. Awgrym o\'ch prif gyfrinair (dewisol) @@ -122,13 +122,13 @@ byth Eitem wedi\'i hychwanegu There are no cards in your vault. - New card + Cerdyn newydd There are no logins in your vault. There are no identities in your vault. - New identity + Hunaniaeth newydd There are no notes in your vault. New note - New item + Eitem newydd New SSH key There are no text Sends in your vault. There are no file Sends in your vault. @@ -729,7 +729,7 @@ Do you want to switch to this account? Set up later Set up unlock later? You can return to complete this step anytime from Account Security in Settings. - Confirm + Cadarnhau Set up biometrics or choose a PIN code to quickly access your vault and Autofill your logins. Never lose access to your vault The best way to make sure you can always access your vault is to set up safeguards from the start. @@ -782,12 +782,12 @@ Do you want to switch to this account? You can now explore everything Bitwarden has to offer and start managing your passwords securely. You’re all set! Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance. - Master password hint + Awgrym o\'ch prif gyfrinair New master password hint Get started Save and protect your data The vault protects more than just passwords. Store secure logins, IDs, cards and notes securely here. - New login + Manylion mewngofnodi newydd Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure. Send sensitive information, safely Import saved logins @@ -811,7 +811,7 @@ Do you want to switch to this account? On your computer, open a new browser tab and go to %1$s Log in to the Bitwarden web app. Step 2 of 3 - Log in to Bitwarden + Mewngofnodi i Bitwarden Step 3 of 3 Import logins to Bitwarden In the Bitwarden navigation, find the Tools option and select Import data. @@ -830,14 +830,14 @@ Do you want to switch to this account? Import Successful! Manage your logins from anywhere with Bitwarden tools for web and desktop. Bitwarden Tools - Got it + Iawn No logins were imported Import error Logins imported Remember to delete your imported password file from your computer - SSH key - Public key - Private key + Allwedd SSH + Allwedd gyhoeddus + Allwedd breifat SSH keys Copy public key Copy fingerprint @@ -942,7 +942,7 @@ Do you want to switch to this account? Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. For details on what is and isn’t logged, visit the\nBitwarden help center. Logging duration - 1 hour + ar ôl awr 8 hours 24 hours 1 week @@ -1159,4 +1159,6 @@ Do you want to switch to this account? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-da-rDK/strings.xml b/ui/src/main/res/values-da-rDK/strings.xml index e032747263..373b04cd13 100644 --- a/ui/src/main/res/values-da-rDK/strings.xml +++ b/ui/src/main/res/values-da-rDK/strings.xml @@ -61,7 +61,7 @@ Indsend Synk URI - Website (URI) + Websted (URI) Brugernavn Feltet %1$s er obligatorisk. You must attach a file to save this send. @@ -118,13 +118,13 @@ Aldrig Emne tilføjet There are no cards in your vault. - New card + Nyt kort There are no logins in your vault. There are no identities in your vault. - New identity + Ny identitet There are no notes in your vault. New note - New item + Nyt emne New SSH key There are no text Sends in your vault. There are no file Sends in your vault. @@ -143,7 +143,7 @@ Skriv hovedadgangskode igen (obligatorisk) Søg i boks Vælg - Item details + Emnedetaljer Emne gemt Submitting… Syncing… @@ -164,15 +164,15 @@ Der er ingen emner i boksen matchende \"%1$s\" Søg efter eller tilføj et nyt login Deaktiveret - The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. - Autofill + Den letteste måde at føje nye logins til boksen er fra Bitwarden Autoudfyldningstjeneste. Læs mere om brugen af Bitwarden Autoudfyldningstjeneste ved at gå til skærmen \"Indstillinger\". + Autoudfyld Skal dette emne autoudfyldes eller vises? Søg Læs om organisationer Godkender-app Angiv den 6-cifrede bekræftelseskode fra godkender-appen. Angiv den 6-cifrede bekræftelseskode e-mailet til %1$s. - We don’t recognize this device. Enter the code sent to your email to verify your identity. + Denne enhed er ikke genkendt. Angiv koden i den tilsendte e-mail for at bekræfte identiteten. Gendannelseskode Husk Husk e-mail @@ -287,7 +287,7 @@ Skanning vil ske automatisk. Hvilken type tilpasset felt ønskes tilføjet? Fjern Ny URI - Add website + Tilføj websted Basisdomæne Default (%1$s) Nøjagtig @@ -305,12 +305,12 @@ Skanning vil ske automatisk. Ugyldig e-mailadresse. Kort Identiteter - Identification + Identifikation Logins Sikre notater Personal Details Contact Info - Check password for data breaches + Tjek adgangskode for datalæk This password has been exposed %d time in data breaches. You should change it. This password has been exposed %d times in data breaches. You should change it. @@ -327,7 +327,7 @@ Skanning vil ske automatisk. Type Flyt ned Flyt op - Owner + Ejer Der er ingen samlinger at vise. %1$s flyttet til %2$s. Mindst én samling skal vælges. @@ -394,7 +394,7 @@ Skanning vil ske automatisk. En eller flere organisationspolitikker påvirker generatorindstillingerne Et problem opstod med at gemme denne vedhæftning. Fortsætter problemet, gem den i stedet fra web-boksen. Vedhæftning gemt - Please turn on “Autofill Accessibility Service” from Bitwarden Settings to use the Autofill tile. + Aktivér \"Autoudfyld-tilgængelighedstjeneste\" fra Bitwarden-indstillinger for at benytte flisen Autoudfyld. Ingen adgangskodefelter fundet Sending to trash… Emne er sendt til papirkurven. @@ -458,7 +458,7 @@ Skanning vil ske automatisk. Valgfrit brugeradgangskodekrav for at tilgå denne Send. Fjern adgangskode Fjerner adgangskode - Password removed + Adgangskode fjernet Ny Send Kopiér link Del link @@ -742,7 +742,7 @@ Skift til denne konto? Skift e-mailadresse Næste Bitwarden kan ikke gendanne en mistet eller glemt hovedadgangskode. - Bitwarden cannot reset a lost or forgotten master password. + Bitwarden kan ikke nulstille en mistet eller glemt hovedadgangskode. Vælg hovedadgangskode Vælg en unik og stærk adgangskode for at holde brugeroplysningerne sikre. @@ -768,7 +768,7 @@ Skift til denne konto? Turn on browser autofill integration later? Dette trin kan når som helst fuldføres via Indstillinger. Man kan nu tjekke alt det andet, Bitwarden har at tilbyde, og begynde at håndtere sine adgangskoder sikkert. - You’re all set! + Så er alt klar! Fejl under oprettelse af forbindelse til Duo-tjenesten. Brug en anden totrins-indlogningsmetode eller kontakt Duo for hjælp. Hovedadgangskodetip New master password hint @@ -808,7 +808,7 @@ Skift til denne konto? Behov for hjælp? Tjek import-hjælp ud. Gem den eksporterede fil et sted på computeren, hvor man nemt kan finde den. Dette er ikke en genkendt Bitwarden-server. Man skal muligvis tjekke med sin udbyder eller opdatere sin server. - Syncing logins… + Synker logins... Download webbrowserudvidelsen Gå til bitwarden.com/download for at integrere Bitwarden i den foretrukne webbrowser for en problemfri oplevelse. Brug web-appen @@ -859,14 +859,14 @@ Skift til denne konto? Kopiér privat nøgle Login-legitimationsoplysninger Autoudfyldningsindstillinger - Use this button to generate a new unique password. + Brug denne knap til at generere en ny unik adgangskode. 1 OF 3 2 OF 3 - You’ll only need to set up Authenticator Key for logins that require two-factor authentication with a code. The key will continuously generate six-digit codes you can use to log in. + Man behøver kun opsætte Godkendelsesnøgle for logins, som kræver tofaktorgodkendelse med en kode. Nøglen vil løbende generere sekscifrede koder, man kan bruge til indlogning. 3 OF 3 - You must add a web address to use autofill to access this account. + Man skal tilføje en webadresse for at bruge autofyldning for at tilgå denne konto. Læs om nye logins - We’ll walk you through the key features to add a new login. + Vi vil gennemgå de vigtigste funktioner for at tilføje et nyt login. Tjek generatoren ud Find ud af mere om generering af sikre loginoplysninger med en guidet tur. Importér klientcertifikat @@ -908,7 +908,7 @@ Skift til denne konto? Credential operation failed because user is locked out. Credential operation failed because the selected item does not exist. Credential operation failed because user verification was cancelled. - Self-host server URL + URL til selv-hostet server Use Brave autofill integration Use Chrome autofill integration Use Chrome Beta autofill integration @@ -930,7 +930,7 @@ Skift til denne konto? Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. For details on what is and isn’t logged, visit the\nBitwarden help center. Logging duration - 1 hour + 1 time 8 hours 24 hours 1 week @@ -950,7 +950,7 @@ Skift til denne konto? Please confirm the domain below with your organization administrator.\n\nKey Connector domain:\n%1$s Flight recorder on Flight recorder will be active until %1$s at %2$s. Return to settings to deactivate now. - Go to settings + Gå til Indstillinger All logs deleted Log deleted App settings @@ -959,11 +959,11 @@ Skift til denne konto? Replace certificate Unable to read certificate. Cannot delete your account - This action cannot be completed because your account is owned by an organization. Contact your organization administrator for additional details. + Denne handling kan ikke fuldføres, da kontoen ejes af en organisation. Kontakt organisationsadministratoren for yderligere detaljer. This account will soon be deleted. Log in at %1$s to continue using Bitwarden. View file Send View text Send - Delete Send + Slet Send Missing Send re-sync your vault Use dynamic colors Use dynamic colors? @@ -988,7 +988,7 @@ Skift til denne konto? Installed apps Delete %s Failed to decrypt cipher. Contact support. - Decryption error + Dekrypteringsfejl Skan en QR-kode Kan ikke tilføje godkendelsesnøgle? Tildel kameratilladelse for brug af skanneren @@ -1125,9 +1125,9 @@ Skift til denne konto? Import passwords, passkeys, and other item types from your Bitwarden vault. Items to import Exporting items… - Export failed - Passwords - Passkeys + Eksport mislykkedes + Adgangskoder + Adgangsnøgler Why is this step required? Kdf update failed, active account not found. Please try again or contact us. An error occurred while trying to update your kdf settings. Please try again or contact us. @@ -1135,4 +1135,6 @@ Skift til denne konto? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-de-rDE/strings.xml b/ui/src/main/res/values-de-rDE/strings.xml index 2e49628986..c0f36fff5b 100644 --- a/ui/src/main/res/values-de-rDE/strings.xml +++ b/ui/src/main/res/values-de-rDE/strings.xml @@ -1134,4 +1134,6 @@ Möchtest du zu diesem Konto wechseln? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-el-rGR/strings.xml b/ui/src/main/res/values-el-rGR/strings.xml index 4869ef15ec..926c93718e 100644 --- a/ui/src/main/res/values-el-rGR/strings.xml +++ b/ui/src/main/res/values-el-rGR/strings.xml @@ -45,7 +45,7 @@ Περισσότερα Η κρύπτη μου Όνομα - Item name (required) + Όνομα στοιχείου (απαιτείται) Send name (required) Όχι Σημειώσεις @@ -85,7 +85,7 @@ Επεξεργασία κάρτας Επεξεργασία ταυτότητας Επεξεργασία σημείωσης - Edit SSH key + Επεξεργασία κλειδιού SSH Εισάγετε την διεύθυνση ηλ. ταχειδρομείου του λογαριασμού σας, προκειμένου για να λάβετε υπόδειξη του κύριου κωδικού προσβασής σας. Αγαπημένο Αφαίρεση από τα αγαπημένα @@ -143,7 +143,7 @@ Πληκτρολογήστε ξανά τον κύριο κωδικό πρόσβασης (απαιτείται) Αναζήτηση στο θυσαυ/κιό Επιλογή - Item details + Λεπτομέρειες στοιχείου Το στοιχείο αποθηκεύτηκε Submitting… Syncing… @@ -156,7 +156,7 @@ Προβολή κάρτας Προβολή ταυτότητας Προβολή σημείωσης - View SSH key + Προβολή κλειδιού SSH Διαδικτυακό θυσαυ/κιο Bitwarden Στοιχεία Στοιχεία για %1$s @@ -164,15 +164,15 @@ Δεν υπάρχουν αντικείμενα στη κρύπτη σας που ταιριάζουν με \"%1$s\" Αναζητήστε μια σύνδεση ή προσθέστε μια νέα σύνδεση Απενεργοποιημένο - The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. - Autofill + Ο ευκολότερος τρόπος για να προσθέσετε νέες συνδέσεις στο vault σας, είναι με την υπηρεσία αυτόματης συμπλήρωσης του Bitwarden. Μάθετε περισσότερα σχετικά με τη χρήση της, μεταβαίνοντας στις \"Ρυθμίσεις\". + Αυτόματη συμπλήρωση Θέλετε αυτόματη συμπλήρωση ή να δείτε αυτό το στοιχείο; Αναζήτηση Μάθετε για τους οργανισμούς Εφαρμογή αυθεντικοποίησης Εισάγετε τον 6ψήφιο κωδικό από την εφαρμογή επαλήθευσης. Εισαγωγή 6ψήφιου κωδικού επαλήθευσης που σταλθηκε με μήνυμα στο %1$s. - We don’t recognize this device. Enter the code sent to your email to verify your identity. + Δεν αναγνωρίζουμε αυτή τη συσκευή. Εισάγετε τον κωδικό που στάλθηκε στο email σας για να επαληθεύσετε την ταυτότητά σας. Κωδικός ανάκτησης Απομνημόνευση Απομνημόνευση email @@ -437,7 +437,7 @@ Send Details Όλα τα Sends Κείμενο - Text to share + Κείμενο προς κοινοποίηση Κείμενο Κατά την πρόσβαση σε αυτό το Send, αποκρύψτε το κείμενο από προεπιλογή Αρχείο @@ -458,7 +458,7 @@ Προαιρετικά απαιτείται κωδικός πρόσβασης για τους χρήστες για να έχουν πρόσβαση σε αυτό το Send. Αφαίρεση κωδικού πρόσβασης Αφαίρεση κωδικού... - Password removed + Ο κωδικός πρόσβασης αφαιρέθηκε Προσθήκη Send Αντιγραφή συνδέσμου Κοινοποίηση συνδέσμου @@ -742,7 +742,7 @@ Αλλαγή διεύθυνσης ηλ. ταχυδρομείου Επόμενο Το Bitwarden δεν μπορεί να ανακτήσει έναν χαμένο ή ξεχασμένο κύριο κωδικό πρόσβασης. - Bitwarden cannot reset a lost or forgotten master password. + Το Bitwarden δεν μπορεί να ανακτήσει έναν χαμένο ή ξεχασμένο κύριο κωδικό πρόσβασης. Επιλέξτε τον κύριο κωδικό πρόσβασης σας Επιλέξτε έναν μοναδικό και ισχυρό κωδικό πρόσβασης για να διατηρήσετε τις πληροφορίες σας ασφαλείς. @@ -768,7 +768,7 @@ Turn on browser autofill integration later? Μπορείτε να επιστρέψετε για να ολοκληρώσετε αυτό το βήμα ανά πάσα στιγμή στις Ρυθμίσεις. Μπορείτε πλέον να χρησιμοποιείτε την αυτόματη συμπλήρωση για να συνδέεστε σε εφαρμογές και ιστοτόπους με τους αποθηκευμένους κωδικούς πρόσβασής σας. Τώρα, μπορείτε να εξερευνήσετε όλα όσα έχει να προσφέρει το Bitwarden. - You’re all set! + Όλα έτοιμα! Σφάλμα κατά τη σύνδεση με την υπηρεσία Duo. Χρησιμοποιήστε μια διαφορετική μέθοδο σύνδεσης δύο βημάτων ή επικοινωνήστε με την Duo για βοήθεια. Υπόδειξη κύριου κωδικού πρόσβασης New master password hint @@ -808,7 +808,7 @@ Χρειάζεστε βοήθεια; Ρίξτε μια ματιά στο βοήθεια για εισαγωγή. Αποθηκεύστε το εξαγόμενο αρχείο κάπου στον υπολογιστή σας όπου μπορείτε να το βρείτε εύκολα. Αυτός δεν είναι αναγνωρισμένος διακομιστής Bitwarden. Μπορεί να χρειαστεί να ελέγξετε με τον πάροχο σας ή να ενημερώσετε τον διακομιστή σας. - Syncing logins… + Συγχρονισμός συνδέσεων... Κατεβάστε την επέκταση περιηγητή Πηγαίνετε στο bitwarden.com/download για να ενσωματώσετε το Bitwarden στο αγαπημένο σας πρόγραμμα περιήγησης για μια απρόσκοπτη εμπειρία. Χρήση της εφαρμογής web @@ -865,9 +865,9 @@ Θα χρειαστεί μόνο να ρυθμίσετε το Κλειδί Ταυτοποίησης για συνδέσεις που απαιτούν έλεγχο ταυτότητας δύο παραγόντων με κωδικό. Το κλειδί θα παράγει συνεχώς εξαψήφιους κώδικες που μπορείτε να χρησιμοποιήσετε για να συνδεθείτε. 3 από 3 Πρέπει να προσθέσετε μια διεύθυνση ιστού για να χρησιμοποιήσετε την αυτόματη συμπλήρωση για να αποκτήσετε πρόσβαση σε αυτόν το λογαριασμό. - Learn about new logins + Μάθετε για νέες συνδέσεις We’ll walk you through the key features to add a new login. - Explore the generator + Εξερευνήστε τη γεννήτρια Learn more about generating secure login credentials with a guided tour. Import client certificate Enter the client certificate password and the desired alias for this certificate. @@ -908,7 +908,7 @@ Credential operation failed because user is locked out. Credential operation failed because the selected item does not exist. Credential operation failed because user verification was cancelled. - Self-host server URL + Διεύθυνση URL διακομιστή αυτοεξυπηρετητή Use Brave autofill integration Use Chrome autofill integration Use Chrome Beta autofill integration @@ -950,7 +950,7 @@ Please confirm the domain below with your organization administrator.\n\nKey Connector domain:\n%1$s Flight recorder on Flight recorder will be active until %1$s at %2$s. Return to settings to deactivate now. - Go to settings + Μετάβαση στις ρυθμίσεις All logs deleted Log deleted Ρυθμίσεις εφαρμογής @@ -959,11 +959,11 @@ Αντικατάσταση πιστοποιητικού Unable to read certificate. Cannot delete your account - This action cannot be completed because your account is owned by an organization. Contact your organization administrator for additional details. + Αυτή η ενέργεια δεν μπορεί να ολοκληρωθεί επειδή ο λογαριασμός σας ανήκει σε έναν οργανισμό. Επικοινωνήστε με το διαχειριστή του οργανισμού σας για πρόσθετες λεπτομέρειες. This account will soon be deleted. Log in at %1$s to continue using Bitwarden. View file Send View text Send - Delete Send + Διαγραφή Send Missing Send re-sync your vault Use dynamic colors Use dynamic colors? @@ -988,7 +988,7 @@ Installed apps Delete %s Failed to decrypt cipher. Contact support. - Decryption error + Σφάλμα αποκρυπτογράφησης Σαρώστε έναν κωδικό QR Αδυναμία προσθήκης κλειδιού ταυτοποίησης; Ενεργοποιήστε την άδεια πρόσβασης στην κάμερα για χρήση του σαρωτή @@ -1125,9 +1125,9 @@ Import passwords, passkeys, and other item types from your Bitwarden vault. Items to import Exporting items… - Export failed - Passwords - Passkeys + Αποτυχία εξαγωγής + Κωδικοί + Κλειδιά πρόσβασης Why is this step required? Kdf update failed, active account not found. Please try again or contact us. An error occurred while trying to update your kdf settings. Please try again or contact us. @@ -1135,4 +1135,6 @@ Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-en-rGB/strings.xml b/ui/src/main/res/values-en-rGB/strings.xml index a0cf426ae1..d39b7650b2 100644 --- a/ui/src/main/res/values-en-rGB/strings.xml +++ b/ui/src/main/res/values-en-rGB/strings.xml @@ -1137,4 +1137,6 @@ any issues. Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-en-rIN/strings.xml b/ui/src/main/res/values-en-rIN/strings.xml index e144d06f2a..1b9463a351 100644 --- a/ui/src/main/res/values-en-rIN/strings.xml +++ b/ui/src/main/res/values-en-rIN/strings.xml @@ -1137,4 +1137,6 @@ any issues. Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-es-rES/strings.xml b/ui/src/main/res/values-es-rES/strings.xml index a35966b269..0c3c8fa3d1 100644 --- a/ui/src/main/res/values-es-rES/strings.xml +++ b/ui/src/main/res/values-es-rES/strings.xml @@ -165,14 +165,14 @@ Buscar un inicio de sesión o añadir un nuevo inicio de sesión Desactivado The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. - Autofill + Autocompletar ¿Quieres autocompletar o ver este elemento? Buscar Aprende sobre organizaciones Aplicación de autenticación Introduce el código de verificación de 6 dígitos de tu aplicación autenticadora. Introduce el código de verificación de 6 dígitos que ha sido enviado por correo a %1$s. - We don’t recognize this device. Enter the code sent to your email to verify your identity. + No reconocemos este dispositivo. Introduce el código enviado a tu correo electrónico para verificar tu identidad. Código de recuperación Recordar Recordar correo electrónico @@ -394,7 +394,7 @@ El escaneo se realizará automáticamente. Una o más políticas de la organización están afectando la configuración del generador Hubo un problema al guardar este archivo adjunto. Si el problema persiste, puedes guardarlo desde la caja fuerte en la web. Archivo adjunto guardado con éxito - Please turn on “Autofill Accessibility Service” from Bitwarden Settings to use the Autofill tile. + Por favor, habilite \"Servicio de Accesibilidad de Autocompletado\" en la configuración de Bitwarden para utilizar la función de autocompletado. No se han detectado campos de contraseña Sending to trash… El elemento ha sido enviado a la papelera. @@ -689,7 +689,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Protegido con Contraseña Esta contraseña se usará para exportar e importar este archivo Sugerencias de autocompletado - Continue to complete WebAuthn verification. + Continúa para completar la verificación de WebAuthn. Iniciar WebAuthn Hubo un error al iniciar autenticación de doble factor WebAuthn Self-hosted server URL @@ -705,14 +705,14 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Abrir aplicación de correo electrónico Correo electrónico verificado Get emails from Bitwarden for announcements, advice, and research opportunities. Unsubscribe at any time. - Security, prioritized + Seguridad, priorizada Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you. - Set up biometric unlock and autofill to log into your accounts without typing a single letter. + Configura el desbloqueo biométrico y el autocompletado para iniciar sesión en tus cuentas sin tener que escribir ni una sola letra. Quick and easy login Level up your logins Usa el generador para crear contraseñas seguras y únicas para todas tus cuentas. - Your data, when and where you need it - Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps. + Tus datos, dónde y cuándo los necesites + Guarda contraseñas ilimitadas a través de dispositivos ilimitados con aplicaciones móviles, de navegador y de escritorio de Bitwarden. Eliminar clave de acceso Clave de acceso eliminada ¿Qué hace segura una contraseña? @@ -769,15 +769,15 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Turn on browser autofill integration later? You can return to complete this step anytime in Settings. Ahora puedes explorar todo lo que Bitwarden ofrece y empezar a gestionar tus contraseñas de forma segura. - You’re all set! - Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance. + ¡Todo listo! + Error al conectarse con el servicio Duo. Utiliza un método de inicio de sesión en dos pasos diferente o ponte en contacto con Duo para obtener ayuda. Pista de la contraseña maestra Nueva pista de la contraseña maestra Empezar Save and protect your data The vault protects more than just passwords. Store secure logins, IDs, cards and notes securely here. Nuevo inicio de sesión - Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure. + Comparte archivos y datos de forma segura con cualquiera, en cualquier plataforma. Tu información permanecerá encriptada de extremo a extremo, limitando su exposición. Send sensitive information, safely Importar inicios de sesión guardados Use a computer to import logins from an existing password manager @@ -809,7 +809,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Need help? Check out import help. Save the exported file somewhere on your computer you can find easily. Este no es un servidor de Bitwarden reconocido. Puede que tengas que consultar con tu proveedor o actualizar tu servidor. - Syncing logins… + Sincronizando inicios de sesión... Descarga la extensión del navegador Go to bitwarden.com/download to integrate Bitwarden into your favorite browser for a seamless experience. Usa la aplicación web @@ -829,7 +829,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Clave privada Claves SSH Copiar clave pública - Copy fingerprint + Copiar huella Habilitar notificaciones Log in quickly and easily across devices Bitwarden puede notificarte cada vez que recibas una nueva petición de inicio de sesión desde otro dispositivo. @@ -909,7 +909,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Credential operation failed because user is locked out. Credential operation failed because the selected item does not exist. Credential operation failed because user verification was cancelled. - Self-host server URL + URL del servidor autoalojado Usar integración de autocompletado de Brave Usar integración de autocompletado de Chrome Use Chrome Beta autofill integration @@ -947,7 +947,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Confirm Key Connector domain Key Connector domain: Organización: - A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator. + Ya no es necesaria una contraseña maestra para los miembros de la siguiente organización. Por favor, confirma el dominio que aparece a continuación con el administrador de tu organización. Please confirm the domain below with your organization administrator.\n\nKey Connector domain:\n%1$s Flight recorder on Flight recorder will be active until %1$s at %2$s. Return to settings to deactivate now. @@ -989,7 +989,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Aplicaciones instaladas Eliminar %s Failed to decrypt cipher. Contact support. - Decryption error + Error de descifrado Escanear un código QR ¿No se puede agregar la clave del autenticador? Habilita el permiso de cámara para utilizar el escáner @@ -1127,7 +1127,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Items to import Exporting items… Export failed - Passwords + Contraseñas Passkeys Why is this step required? Kdf update failed, active account not found. Please try again or contact us. @@ -1136,4 +1136,6 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-et-rEE/strings.xml b/ui/src/main/res/values-et-rEE/strings.xml index 2167d8ee93..a0bb30ca2d 100644 --- a/ui/src/main/res/values-et-rEE/strings.xml +++ b/ui/src/main/res/values-et-rEE/strings.xml @@ -124,7 +124,7 @@ New identity There are no notes in your vault. New note - New item + Uus kirje New SSH key There are no text Sends in your vault. There are no file Sends in your vault. @@ -143,7 +143,7 @@ Sisesta ülemparool uuesti (kohustuslik) Otsi hoidlast Vali - Item details + Vaata detaile Kirje on uuendatud. Submitting… Syncing… @@ -161,7 +161,7 @@ Kirjet %1$s kontoandmed Hoidlas puuduvad %1$s kontod. - There are no items in your vault that match “%1$s” + Hoidlas puuduvad kirjed, mis sobituksid sõnaga \"%1$s\" Search for a login or add a new login Keelatud The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. @@ -172,7 +172,7 @@ Autentimise rakendus Sisesta autentimise rakendusest 6 kohaline number. Sisesta 6 kohaline number, mis saadeti e-posti aadressile %1$s. - We don’t recognize this device. Enter the code sent to your email to verify your identity. + Me ei tunne seda seadet. Enda identiteedi kinnitamiseks palun sisesta oma emailile saadetud kood. Taastamise kood Remember Remember email @@ -287,7 +287,7 @@ Skaneerimine toimub automaatselt. Millist tüüpi kohandatud välja soovid lisada? Eemalda Uus URI - Add website + Lisa veebileht Baasdomeen Vaikimisi (%1$s) Täpne @@ -305,7 +305,7 @@ Skaneerimine toimub automaatselt. Vigane e-posti aadress. Kaardid Identiteedid - Identification + Tuvastamine Kontod Turvalised märkmed Personal Details @@ -327,7 +327,7 @@ Skaneerimine toimub automaatselt. Tüüp Nihuta alla Nihuta üles - Owner + Omanik Puuduvad kollektsioonid, mida kuvada. %1$s teisaldati %2$s\'sse. Pead valima vähemalt ühe kogumiku. @@ -458,7 +458,7 @@ Skaneerimine toimub automaatselt. Soovi korral nõua parooli, millega Sendile ligi pääseb. Eemalda parool Parooli eemaldamine - Password removed + Parool on eemaldatud Lisa Send Kopeeri link Jaga linki @@ -577,7 +577,7 @@ Skaneerimine toimub automaatselt. Use your email provider’s subaddress capabilities Use your domain’s configured catch-all inbox. Genereeri e-posti alias, kasutades selleks välist teenuspakkujat. - Accessibility Service Disclosure + Juurdepääsetavuse Teenuse Teavitus Bitwarden uses the Accessibility Service to search for login fields in apps and websites, then establish the appropriate field IDs for entering a username & password when a match for the app or site is found. We do not store any of the information presented to us by the service, nor do we make any attempt to control any on-screen elements beyond text entry of credentials. Nõustu Keeldu @@ -626,11 +626,11 @@ Soovid selle konto peale lülituda? Pääsukood Pääsukoodi ei kopeerita Pääsukoodi ei kopeerita kloonitud kirjele. Oled kindel, et soovid jätkata? - Master password re-prompt help - Admin approval requested - Your request has been sent to your admin. - You will be notified once approved. - Trouble logging in? + Abi ülemparooli uuesti küsimisega + Taotlus administraatorile saadetud + Sinu taotlus saadeti administraatorile. + Kinnitamise järel saad selle kohta teavituse. + Ei õnnestu sisse logida? Automaatse täitmise keelamine Automaattäitmist ei pakuta nende URId-e puhul. Uus blokeeritud URI @@ -639,8 +639,8 @@ Soovid selle konto peale lülituda? Vorming: %1$s. Eralda mitu URI-t komadega. Vale URI URI %1$s on juba keelatud - Login approved - Log in with device must be set up in the settings of the Bitwarden app. Need another option? + Sisselogimine kinnitatud + Bitwardeni rakenduse seadetes peab olema konfigureeritud sisselogimine läbi seadme. Soovid muud valikut? Logi sisse teise seadmega Sisselogimas kui Logging in on: @@ -649,10 +649,10 @@ Soovid selle konto peale lülituda? Konto turvalisus Bitwardeni abikeskus Sünkroniseeri kohe - Unlock options + Avamise valikud Sessiooni ajalõpp - Session timeout action - Account fingerprint phrase + Ajalõpule järgnev tegevus + Konto unikaalne sõnajada Kasuta Bitwardenit uute pääsuvõtmete salvestamiseks hoidlas ja nendega sisse logimiseks. Android Autofill Raamistiku kasutatakse teistesse rakendustesse sisselogimisel andmete automaatse täitmise lihtsustamiseks. Choose how your autofill suggestions will appear when you sign in to other apps on your device. @@ -678,12 +678,12 @@ Soovid selle konto peale lülituda? Sisselogimise lõpetamiseks järgige Duo juhiseid. Käivita Duo Your passkey will be saved to your Bitwarden vault for %1$s - Passkeys not supported for this app - Passkey operation failed because browser is not privileged - Passkey operation failed because browser signature does not match - Passkey operation failed because of missing asset links - Passkey operation failed because app could not be verified - Confirm file password + See rakendus ei toeta pääsuvõtmeid + Pääsuvõtme funktsiooni kasutamine ebaõnnestus, sest see brauser ei ole toetatud + Pääsuvõtme funktsiooni kasutamine ebaõnnestus, sest brauseri sõrmejälg ei ühti + Pääsuvõtme funktsiooni kasutamine ebaõnnestus, sest puuduvad vajalikud lingid (missing asset links) + Pääsuvõtme funktsiooni kasutamine ebaõnnestus, sest rakenduse tuvastamine ebaõnnestus + Kinnita faili parool Faili parool Parooliga Kaitstud Seda parooli kasutatakse selle faili eksportimiseks ja importimiseks @@ -721,7 +721,7 @@ Soovid selle konto peale lülituda? Set up later Set up unlock later? You can return to complete this step anytime from Account Security in Settings. - Confirm + Kinnita Set up biometrics or choose a PIN code to quickly access your vault and Autofill your logins. Never lose access to your vault The best way to make sure you can always access your vault is to set up safeguards from the start. @@ -769,8 +769,8 @@ Soovid selle konto peale lülituda? You can return to complete this step anytime in Settings. You can now explore everything Bitwarden has to offer and start managing your passwords securely. You’re all set! - Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance. - Master password hint + Duo teenustega ühendamine ebaõnnestus. Kasuta teist kahe-astmelise sisselogimise meetodit või kontakteeru Duoga. + Ülemparooli vihje New master password hint Get started Save and protect your data @@ -799,7 +799,7 @@ Soovid selle konto peale lülituda? On your computer, open a new browser tab and go to %1$s Log in to the Bitwarden web app. Step 2 of 3 - Log in to Bitwarden + Logi sisse Bitwardenisse Step 3 of 3 Import logins to Bitwarden In the Bitwarden navigation, find the Tools option and select Import data. @@ -818,14 +818,14 @@ Soovid selle konto peale lülituda? Import Successful! Manage your logins from anywhere with Bitwarden tools for web and desktop. Bitwarden Tools - Got it + Selge No logins were imported - Import error + Tõrge importimisel Logins imported Remember to delete your imported password file from your computer - SSH key - Public key - Private key + SSH võti + Avalik võti + Privaatvõti SSH keys Copy public key Copy fingerprint @@ -833,7 +833,7 @@ Soovid selle konto peale lülituda? Log in quickly and easily across devices Bitwarden can notify you each time you receive a new login request from another device. Skip for now - Done + Valmis %1$s of %2$s Copy identity name Copy company @@ -859,7 +859,7 @@ Soovid selle konto peale lülituda? Copy private key Login Credentials Autofill Options - Use this button to generate a new unique password. + Vajuta siia, et luua uus ainulaadne parool. 1 OF 3 2 OF 3 You’ll only need to set up Authenticator Key for logins that require two-factor authentication with a code. The key will continuously generate six-digit codes you can use to log in. @@ -930,7 +930,7 @@ Soovid selle konto peale lülituda? Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. For details on what is and isn’t logged, visit the\nBitwarden help center. Logging duration - 1 hour + 1 tunni pärast 8 hours 24 hours 1 week @@ -959,11 +959,11 @@ Soovid selle konto peale lülituda? Replace certificate Unable to read certificate. Cannot delete your account - This action cannot be completed because your account is owned by an organization. Contact your organization administrator for additional details. + Seda käsku ei õnnestunud täita, sest sinu konto kuulub organisatsioonile. Lisadetailide jaoks võta ühendust oma organisatsiooni administraatoriga. This account will soon be deleted. Log in at %1$s to continue using Bitwarden. View file Send View text Send - Delete Send + Kustuta Send Missing Send re-sync your vault Use dynamic colors Use dynamic colors? @@ -988,7 +988,7 @@ Soovid selle konto peale lülituda? Installed apps Delete %s Failed to decrypt cipher. Contact support. - Decryption error + Viga dekrüpteerimisel Skanneeri QR-koodi Ei suuda autentimise võtit lisada? Skänneri kasutamiseks luba ligipääs kaamerale @@ -1126,8 +1126,8 @@ Soovid selle konto peale lülituda? Items to import Exporting items… Export failed - Passwords - Passkeys + Paroolid + Pääsukoodid Why is this step required? Kdf update failed, active account not found. Please try again or contact us. An error occurred while trying to update your kdf settings. Please try again or contact us. @@ -1135,4 +1135,6 @@ Soovid selle konto peale lülituda? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-eu-rES/strings.xml b/ui/src/main/res/values-eu-rES/strings.xml index b438a8ac3e..409cd4b211 100644 --- a/ui/src/main/res/values-eu-rES/strings.xml +++ b/ui/src/main/res/values-eu-rES/strings.xml @@ -124,7 +124,7 @@ New identity There are no notes in your vault. New note - New item + Elementu berria New SSH key There are no text Sends in your vault. There are no file Sends in your vault. @@ -326,7 +326,7 @@ Mota Mugitu behera Mugitu gora - Owner + Jabea Ez dago erakusteko bildumarik. %1$s %2$s-era mugitu da. Gutxienez bilduma bat aukeratu behar duzu. @@ -384,7 +384,7 @@ Kodea bidalia! Jarraitzeko, berretsi zure identitatea. Esportazio honek kutxa gotorraren datuak zifratu gabeko formatuan biltzen ditu. Ez zenuke gorde edo kanal ez-seguruetaik (emaila, adibidez) bidali behar. Erabili eta berehala ezabatu. - This file export will be password protected and require the file password to decrypt. + Fitxategien esportazio hori pasahitzaren bidez babestuta egongo da eta deszifratzeko fitxategi pasahitza beharko da. Baieztatu kutxa gotorra esportatzea Kontuz There was a problem exporting your vault. If the problem persists, you’ll need to export from the web vault. @@ -627,7 +627,7 @@ Kontu honetara aldatu nahi duzu? Master password re-prompt help Admin approval requested Your request has been sent to your admin. - You will be notified once approved. + Jakinaraziko zaizu onartzen denean. Trouble logging in? Blokeatu automatikoki betetzea Automatikoki betetzea ez da URL hauetan erabilgarri egongo. @@ -639,7 +639,7 @@ Kontu honetara aldatu nahi duzu? The URI %1$s is already blocked Login approved Log in with device must be set up in the settings of the Bitwarden app. Need another option? - Log in with device + Hasi saioa beste gailu batekin Logging in on Logging in on: Vault @@ -684,7 +684,7 @@ Kontu honetara aldatu nahi duzu? Confirm file password File password Password Protected - This password will be used to export and import this file + Fitxategi hau esportatu eta inportatzeko erabiliko da pasahitz hau Autofill suggestion Continue to complete WebAuthn verification. Launch WebAuthn @@ -719,7 +719,7 @@ Kontu honetara aldatu nahi duzu? Set up later Set up unlock later? You can return to complete this step anytime from Account Security in Settings. - Confirm + Berretsi Set up biometrics or choose a PIN code to quickly access your vault and Autofill your logins. Never lose access to your vault The best way to make sure you can always access your vault is to set up safeguards from the start. @@ -816,9 +816,9 @@ Kontu honetara aldatu nahi duzu? Import Successful! Manage your logins from anywhere with Bitwarden tools for web and desktop. Bitwarden Tools - Got it + Ulertuta No logins were imported - Import error + Errorea inportatzerakoan Logins imported Remember to delete your imported password file from your computer SSH key @@ -831,7 +831,7 @@ Kontu honetara aldatu nahi duzu? Log in quickly and easily across devices Bitwarden can notify you each time you receive a new login request from another device. Skip for now - Done + Egina %1$s of %2$s Copy identity name Copy company @@ -928,7 +928,7 @@ Kontu honetara aldatu nahi duzu? Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. For details on what is and isn’t logged, visit the\nBitwarden help center. Logging duration - 1 hour + Ordu 1 8 hours 24 hours 1 week @@ -961,7 +961,7 @@ Kontu honetara aldatu nahi duzu? This account will soon be deleted. Log in at %1$s to continue using Bitwarden. View file Send View text Send - Delete Send + Ezabatu Send-a Missing Send re-sync your vault Use dynamic colors Use dynamic colors? @@ -1133,4 +1133,6 @@ Kontu honetara aldatu nahi duzu? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-fa-rIR/strings.xml b/ui/src/main/res/values-fa-rIR/strings.xml index dc3f707530..4e18dc83df 100644 --- a/ui/src/main/res/values-fa-rIR/strings.xml +++ b/ui/src/main/res/values-fa-rIR/strings.xml @@ -164,15 +164,15 @@ هیچ موردی در گاوصندوق شما وجود ندارد که با \"%1$s\" مطابقت داشته باشد یک ورود را جستجو کنید یا یک ورود جدید اضافه کنید غیرفعال شد - The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. - Autofill + ساده‌ترین روش برای افزودن اطلاعات ورود به گاوصندوقتان استفاده از سرویس پر کردن خودکار Bitwarden است. با رفتن به صفحه \"تنظیمات\" درباره‌ی استفاده از سرویس پر کردن خودکار Bitwarden اطلاعات بیشتری کسب کنید. + پر کردن خودکار آیا می‌خواهید این مورد را به صورت خودکار پر کنید یا مشاهده کنید؟ جستجو درباره سازمان‌ها اطلاعات کسب کنید برنامه احراز هویت کد ۶ رقمی تأیید را از برنامه احراز هویت وارد کنید. کد ۶ رقمی تأیید را که به %1$s ایمیل شده را وارد کنید. - We don’t recognize this device. Enter the code sent to your email to verify your identity. + ما این دستگاه را نمی‌شناسیم. برای تأیید هویت خود، کدی را که به ایمیلتان ارسال شده وارد کنید. کد بازیابی به خاطر بسپار ایمیل را به خاطر بسپار @@ -394,7 +394,7 @@ یک یا چند سیاست سازمان بر تنظیمات تولید کننده شما تأثیر می‌گذارد هنگام ذخیره این پیوست مشکلی رخ داد. اگر مشکل همچنان ادامه داشت، می‌توانید آن را از گاوصندوق وب ذخیره کنید. پیوست با موفقیت ذخیره شد. - Please turn on “Autofill Accessibility Service” from Bitwarden Settings to use the Autofill tile. + لطفاً برای استفاده از کاشی پر کردن خودکار، \"سرویس دسترسی پر کردن خودکار\" را از تنظیمات Bitwarden فعال کنید. هیچ فیلدی برای کلمه عبور شناسایی نشد Sending to trash… مورد به سطل زباله فرستاده شد. @@ -738,7 +738,7 @@ با روش‌های جلوگیری از قفل شدن حساب کاربری آشنا شوید کمک با مکان‌های جغرافیایی سرور. نشانی ایمیل (الزامی) - Select the link in the email to verify your email address and continue creating your account. + پیوند موجود در ایمیل را انتخاب کنید تا نشانی ایمیل خود را تأیید کرده و روند ایجاد حساب کاربری را ادامه دهید. تغییر نشانی ایمیل بعدی Bitwarden نمی‌تواند کلمه عبور اصلی گمشده یا فراموش‌شده را بازیابی کند. @@ -768,7 +768,7 @@ Turn on browser autofill integration later? می‌توانید هر زمان برای تکمیل این مرحله به بخش تنظیمات مراجعه کنید. اکنون می‌توانید از تمامی امکانات Bitwarden استفاده کرده و شروع به مدیریت امن کلمات عبور خود کنید. - You’re all set! + همه چیز آماده است! خطا در اتصال به سرویس Duo. از روش ورود دو مرحله‌ای دیگری استفاده کنید یا برای دریافت کمک با Duo تماس بگیرید. یادآور کلمه عبور اصلی یادآور کلمه عبور اصلی جدید @@ -808,7 +808,7 @@ نیاز به کمک دارید؟ به راهنمای درون ریزی مراجعه کنید. پرونده برون ریزی شده را ذخیره کنید در مکانی روی رایانه‌تان که به‌راحتی بتوانید آن را پیدا کنید. این یک سرور معتبر Bitwarden نیست. ممکن است لازم باشد با ارائه‌دهنده خود بررسی کنید یا سرور را به‌روزرسانی نمایید. - Syncing logins… + همگام‌سازی ورودها... افزونه مرورگر را بارگیری کنید به نشانی bitwarden.com/download بروید تا Bitwarden را در مرورگر مورد علاقه‌تان یکپارچه‌سازی کنید و تجربه‌ای روان داشته باشید. از برنامه وب استفاده کنید @@ -866,13 +866,13 @@ ۳ از ۳ برای استفاده از قابلیت پر کردن خودکار جهت دسترسی به این حساب کاربری، باید یک نشانی وب اضافه کنید. درباره ورودهای جدید بیشتر بدانید - We’ll walk you through the key features to add a new login. + ما شما را با ویژگی‌های کلیدی برای افزودن یک ورود جدید راهنمایی می‌کنیم. تولید کننده را بررسی کنید با یک راهنمای قدم به قدم، بیشتر درباره ایجاد اطلاعات ورود امن بیاموزید. گواهی‌نامه مشتری را وارد کنید کلمه عبور گواهی‌نامه مشتری و نام مستعار مورد نظر برای این گواهی‌نامه را وارد کنید. نام مستعار - Use the generator to create secure passwords, passphrases and usernames. + از تولیدکننده استفاده کنید تا کلمات عبور، عبارات عبور و نام‌های کاربری امن بسازید. عبارات عبور، کلمات عبور قوی‌ای هستند که نسبت به کلمات تصادفی معمولاً آسان‌تر به خاطر سپرده شده و نوشته می‌شوند. این عبارات برای ورود به حساب‌های کاربری که قابلیت پر کردن خودکار ندارند، مانند سرویس‌های پخش فیلم روی تلویزیون، بسیار مفید هستند. نام‌های کاربری منحصربه‌فرد یک لایه امنیتی اضافی ایجاد می‌کنند و می‌توانند به جلوگیری از دسترسی هکرها به حساب‌های کاربری شما کمک کنند. ۱ از ۶ @@ -881,8 +881,8 @@ ۴ از ۶ ۵ از ۶ ۶ از ۶ - Use these options to adjust your password to meet your account website’s requirements. - After you save your new password to Bitwarden, don’t forget to update it on your account website. + از این گزینه‌ها استفاده کنید تا کلمه عبور خود را مطابق با الزامات وب‌سایت حساب کاربری‌تان تنظیم کنید. + بعد از اینکه کلمه عبور جدیدتان را در Bitwarden ذخیره کردید، فراموش نکنید آن را در وب‌سایت حساب کاربری‌تان هم به‌روزرسانی کنید. هویت خود را تأیید کنید خطا در بارگذاری گواهی‌نامه نام مستعار گواهی‌نامه @@ -988,7 +988,7 @@ برنامه‌های نصب شده حذف %s Failed to decrypt cipher. Contact support. - Decryption error + خطای رمزگشایی Scan a QR code نمی‌توانید کلید احراز هویت را اضافه کنید؟ اجازه دوربین را برای استفاده از اسکنر فعال کنید @@ -1125,9 +1125,9 @@ Import passwords, passkeys, and other item types from your Bitwarden vault. Items to import Exporting items… - Export failed - Passwords - Passkeys + برون ریزی ناموفق + کلمه‌های عبور + کلیدهای عبور Why is this step required? Kdf update failed, active account not found. Please try again or contact us. An error occurred while trying to update your kdf settings. Please try again or contact us. @@ -1135,4 +1135,6 @@ Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-fi-rFI/strings.xml b/ui/src/main/res/values-fi-rFI/strings.xml index 00c2cdc327..0a1923ead3 100644 --- a/ui/src/main/res/values-fi-rFI/strings.xml +++ b/ui/src/main/res/values-fi-rFI/strings.xml @@ -85,7 +85,7 @@ Muokkaa korttia Muokkaa henkilöllisyyttä Muokkaa muistiota - Edit SSH key + Muokkaa SSH avainta Syötä tilisi sähköpostiosoite saadaksesi pääsalasanan vihjeen. Suosikki Poista suosikeista @@ -156,7 +156,7 @@ Näytä kortti Näytä henkilöllisyys Näytä muistio - View SSH key + Näytä SSH-avain Bitwarden Verkkoholvi Kohteet Kohteet palvelulle %1$s @@ -164,15 +164,15 @@ Holvissasi ei ole kohdetta \"%1$s\" vastavia tietoja Hae kirjautumistietoa tai lisää uusi Ei käytössä - The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. - Autofill + Uusien kirjautumistietojen lisääminen on kötevintä Bitwardenin automaattitäytön palvelun avulla. Asetuksista löydät lisätietoja palvelusta. + Automaattitäyttö Haluatko täyttää kohteen automaattisesti vai tarkastella sitä? Etsi Lisätietoja organisaatioista Todennussovellus Syötä todennussovelluksesi näyttämä kuusinumeroinen todennuskoodi. Syötä osoitteeseen %1$s lähetetty kuusinumeroinen todennuskoodi. - We don’t recognize this device. Enter the code sent to your email to verify your identity. + Laitetta ei tunnistettu. Vahvista henkilöllisyytesi syöttämällä sähköpostitse saamasi koodi. Palautuskoodi Muista Muista sähköpostiosoite @@ -458,7 +458,7 @@ Koodi skannataan automaattisesti. Halutessasi, vaadi käyttäjiä syöttämään salasana Sendin avaamiseksi. Poista salasana Poistetaan salasana - Password removed + Salasana poistettiin Lisää Send Kopioi linkki Jaa linkki @@ -467,8 +467,8 @@ Koodi skannataan automaattisesti. Muokkaa Sendiä Edit file Send Edit text Send - New file Send - New text Send + Uusi tiedosto-Send + Uusi teksti-Send Haluatko varmasti poistaa Sendin? Send poistettiin Send updated @@ -738,11 +738,11 @@ Haluatko vaihtaa tähän tiliin? Learn about ways to prevent account lockout Ohjeita palvelinsijainneista. Sähköpostiosoite (vaaditaan) - Select the link in the email to verify your email address and continue creating your account. + Vahvista sähköpostiosoitteesi ja jatka tilisi luontia avaamalla viestissä oleva linkki. Vaihda sähköpostiosoite Seuraava Bitwarden ei voi palauttaa kadonnutta tai unohtunutta pääsalasanaa. - Bitwarden cannot reset a lost or forgotten master password. + Bitwarden ei voi nollata kadonnutta tai unohtunutta pääsalasanaa. Valitse pääsalasanasi Suojaa tietosi valitsemalla ainutlaatuinen ja vahva salasana. @@ -768,7 +768,7 @@ Haluatko vaihtaa tähän tiliin? Turn on browser autofill integration later? Voit palata viimeistelemään tämän vaiheen milloin tahansa asetuksista. Nyt voit kirjautua sovelluksiin ja verkkosivustoille tallennetuilla salasanoillasi, ja olet vapaa tutustumaan Bitwardenin muihin ominaisuuksiin. - You’re all set! + Kaikki on valmista! Virhe yhdistettäessä Duo-palveluun. Käytä vaihtoehtoista todennustapaa tai ole yhteydessä Duon asiakaspalveluun saadaksesi apua. Pääsalasanan vihje Uusi pääsalasanan vihje @@ -776,7 +776,7 @@ Haluatko vaihtaa tähän tiliin? Tallenna ja suojaa tietojasi The vault protects more than just passwords. Store secure logins, IDs, cards and notes securely here. Uusi kirjautumistieto - Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure. + Jaa tiedostoja ja dataa turvallisesti kenen tahansa kanssa millä tahansa alustalla. Tiedot pysyvät päästä päähän salattuina ja altistuminen rajoitetaan. Lähetä arkaluonteisia tietoja turvallisesti Tuo tallennetut kirjautumistiedot Use a computer to import logins from an existing password manager @@ -807,8 +807,8 @@ Haluatko vaihtaa tähän tiliin? For your security, be sure to delete your saved password file. Need help? Check out import help. Save the exported file somewhere on your computer you can find easily. - This is not a recognized Bitwarden server. You may need to check with your provider or update your server. - Syncing logins… + Tätä ei tunnistettu Bitwarden-palvelimeksi. Tarkista tiedot palveluntarjoajaltasi tai päivitä palvelimesi. + Kirjautumistietoja synkronoidaan... Lataa selaimen laajennus Go to bitwarden.com/download to integrate Bitwarden into your favorite browser for a seamless experience. Käytä verkkosovellusta @@ -866,9 +866,9 @@ Haluatko vaihtaa tähän tiliin? 3/3 You must add a web address to use autofill to access this account. Lisätietoja uusista kirjautumistiedoista - We’ll walk you through the key features to add a new login. + Sinut opastetaan uuden kirjautumistiedon lisäämisen läpi. Tutustu generaattoriin - Learn more about generating secure login credentials with a guided tour. + Tutustu opastetusti turvallisten kirjautumistietojen luontiin. Import client certificate Enter the client certificate password and the desired alias for this certificate. Alias @@ -908,7 +908,7 @@ Haluatko vaihtaa tähän tiliin? Credential operation failed because user is locked out. Credential operation failed because the selected item does not exist. Credential operation failed because user verification was cancelled. - Self-host server URL + Itse ylläpidetyn palvelimen URL-osoite Use Brave autofill integration Käytä Chromen automaattitäytön integrointia Use Chrome Beta autofill integration @@ -918,18 +918,18 @@ Haluatko vaihtaa tähän tiliin? Näytä vähemmän Lisää kenttä Jaa virhetiedot - Flight recorder + Musta laatikko Flight recorder help - View recorded logs - Enable flight recorder - Recorded logs - No logs recorded - Experiencing an issue? - Enable temporary logging to collect and inspect logs locally. When enabled, application states and network calls may be logged—never sensitive vault information. + Näytä tallennetut lokit + Aktivoi musta laatikko + Tallennetut lokit + Lokeja ei ole tallennettu + Oletko kohdannut ongelmia? + Aktivoi tilapäinen lokikirjaus paikallista tallennusta ja tarkastelua varten. Kun käytössä, sovelluksen tilat ja verkkopyynnöt saatetaan kirjata – ei koskaan arkaluonteisia holvin tietoja. To get started, set a logging duration. Logging 
will automatically turn off after this period, giving you time to capture activity while reproducing 
any issues. - Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. + Lokitiedot poistetaan automaattisesti 30 päivän kuluttua. Bitwarden voi tarkastella lokitietojasi vain, jos jaat ne. For details on what is and isn’t logged, visit the\nBitwarden help center. - Logging duration + Lokikirjauksen kesto 1 tunti 8 tuntia 24 tuntia @@ -946,7 +946,7 @@ Haluatko vaihtaa tähän tiliin? Confirm Key Connector domain Key Connector domain: Organisaatio: - A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator. + Pääsalasanaa ei enää tarvita tämän organisaation jäsenille. Ole hyvä ja vahvista alla oleva verkkotunnus organisaation ylläpitäjän kanssa. Please confirm the domain below with your organization administrator.\n\nKey Connector domain:\n%1$s Flight recorder on Flight recorder will be active until %1$s at %2$s. Return to settings to deactivate now. @@ -959,7 +959,7 @@ Haluatko vaihtaa tähän tiliin? Replace certificate Unable to read certificate. Cannot delete your account - This action cannot be completed because your account is owned by an organization. Contact your organization administrator for additional details. + Toimintoa ei voida suorittaa, koska tilisi on organisaation omistama. Saat lisätietoja olemalla yhteydessä organisaatiosi ylläpitoon. This account will soon be deleted. Log in at %1$s to continue using Bitwarden. Näytä tiedosto-Send Näytä teksti-Send @@ -988,7 +988,7 @@ Haluatko vaihtaa tähän tiliin? Installed apps Delete %s Failed to decrypt cipher. Contact support. - Decryption error + Virhe salauksen purussa Skannaa QR-koodi Eikä todennusavaimen lisääminen onnistu? Anna kameran käyttöoikeus käyttääksesi skannausta @@ -1125,9 +1125,9 @@ Haluatko vaihtaa tähän tiliin? Import passwords, passkeys, and other item types from your Bitwarden vault. Items to import Exporting items… - Export failed - Passwords - Passkeys + Vienti epäonnistui + Salasanat + Pääsyavaimet Why is this step required? Kdf update failed, active account not found. Please try again or contact us. An error occurred while trying to update your kdf settings. Please try again or contact us. @@ -1135,4 +1135,6 @@ Haluatko vaihtaa tähän tiliin? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-fil-rPH/strings.xml b/ui/src/main/res/values-fil-rPH/strings.xml index e6141dc387..b8878d0b4d 100644 --- a/ui/src/main/res/values-fil-rPH/strings.xml +++ b/ui/src/main/res/values-fil-rPH/strings.xml @@ -31,7 +31,7 @@ \'Di-wastong master password. Subukan ulit. \'Di-wastong PIN. Subukan ulit. Buksan - Log in + Mag-log in Login Mag-log out Sigurado ka bang gusto mong mag-log out? @@ -72,7 +72,7 @@ Oo Account Your new account has been created! - Set Bitwarden as your passkey provider in device settings. + Itakda bilang passkey provider mo ang Bitwarden sa mga setting ng device mo. Iwasang gumamit ng mga nakakalitong karakter Serbisyo ng Bitwarden Pang-autofill Palitan ang master password @@ -124,7 +124,7 @@ New identity There are no notes in your vault. New note - New item + Bagong item New SSH key There are no text Sends in your vault. There are no file Sends in your vault. @@ -161,7 +161,7 @@ Mga Item Mga item para sa %1$s Walang item para sa %1$s sa vault mo. - There are no items in your vault that match “%1$s” + Walang mga item sa vault mo na tumutugma sa \"%1$s\" Search for a login or add a new login Hindi pinapagana The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. @@ -327,7 +327,7 @@ Awtomatikong itong magsa-scan. Uri Ilipat pababa Ilipat Pataas - Owner + May-ari Walang maililistang koleksyon. Nilipat ang %1$s sa %2$s. Kailangan mong pumili ng isa man lang na koleksyon. @@ -385,7 +385,7 @@ Awtomatikong itong magsa-scan. Ipinadala ang code! Kumpirmahin ang pagkakakilanlan mo para tumuloy. Naglalaman ng unencrypted vault data mo ang export na ito. Hindi mo dapat ilagay o ipadala ang file gamit ang hindi ligtas na mga paraan (tulad ng email). Burahin ito kaagad pagkagamit. - This file export will be password protected and require the file password to decrypt. + Poprotektahan ng password ang file export na ito at kakailanganin ang password para ma-decrypt ang file. Kumpirmahin ang pag-export ng vault Babala There was a problem exporting your vault. If the problem persists, you’ll need to export from the web vault. @@ -405,7 +405,7 @@ Awtomatikong itong magsa-scan. Gusto mo ba talagang permanente itong burahin? Wala nang bawian. Gusto mo ba talagang ibalik ang item na ito? Gusto mo ba talaga itong itapon? - Biometric unlock for this account is disabled pending verification of master password. + Na-disable ang biometrikong pag-unlock para sa account na ito, naghihintay para sa beripikasyon ng master password. Payagan ang pag-sync pagka-refresh Mag-sync ng vault sa pamamagitan ng paghila sa screen pababa. Isahang sign-on para sa enterprise @@ -425,7 +425,7 @@ Awtomatikong itong magsa-scan. Naglo-load Mga Tuntunin ng Serbisyo Patakaran sa Privacy - Passkey management + Pamamahala sa passkey Mga serbisyo sa pag-autofill Display autofill suggestions Inline (shows in keyboard) @@ -458,7 +458,7 @@ Awtomatikong itong magsa-scan. Ipayo na mag-require ng password para ma-access ng mga user ang Send na ito. Tanggalin ang password Tinatanggal ang password - Password removed + Tinanggal ang password Magdagdag ng isang Send Kopyahin ang link Ibahagi ang link @@ -615,18 +615,18 @@ Gusto mo bang pumunta sa account na ito? Nakompromiso na ang mahinang password na ito. Gumamit ng malakas at unique na password para maprotektahan ang account mo. Sigurado ka bang gusto mong gamitin ang password na ito? Walang mga item na tumutugma sa paghahanap Self-hosted - Region - Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour. + Rehiyon + Hindi sumusunod ang master password mo sa isa o higit pang mga patakaran ng organisayon mo. Para ma-access ang vault, kailangan mo nang i-update ngayon ang master password mo. Mala-log out ka sa kasalukuyan mong sesyon, at kailangan mong mag-log in ulit. Maaaring manatiling aktibo ang mga sesyon sa iba mo pang device hanggang sa isang oras. Current master password (required) - Approve with my other device - Request admin approval - Approve with master password - Turn off using a public device - Remember this device + Aprubahan gamit ang isa ko pang device + Humiling ng pag-apruba ng admin + Aprubahan gamit ang master password + I-off kung gumagamit ng pampublikong device + Tandaan ang device na ito Passkey - Passkey will not be copied - The passkey will not be copied to the cloned item. Do you want to continue cloning this item? - Master password re-prompt help + Hindi makokopya ang passkey + Hindi makokopya ang passkey sa dinobleng item. Sigurado ka bang dodoblehin mo ang item na ito? + Tulong para sa pag-reprompt ng master password Admin approval requested Your request has been sent to your admin. You will be notified once approved. @@ -641,7 +641,7 @@ Gusto mo bang pumunta sa account na ito? The URI %1$s is already blocked Login approved Log in with device must be set up in the settings of the Bitwarden app. Need another option? - Log in with device + Mag-log in gamit ang device Logging in on Logging in on: Vault @@ -683,10 +683,10 @@ Gusto mo bang pumunta sa account na ito? Passkey operation failed because browser signature does not match Passkey operation failed because of missing asset links Passkey operation failed because app could not be verified - Confirm file password - File password + Kumpirmahin ang password ng file + Password ng file Password Protected - This password will be used to export and import this file + Gagamitin ang password na ito para i-export at i-import ang file Autofill suggestion Continue to complete WebAuthn verification. Launch WebAuthn @@ -721,7 +721,7 @@ Gusto mo bang pumunta sa account na ito? Set up later Set up unlock later? You can return to complete this step anytime from Account Security in Settings. - Confirm + Kumpirmahin Set up biometrics or choose a PIN code to quickly access your vault and Autofill your logins. Never lose access to your vault The best way to make sure you can always access your vault is to set up safeguards from the start. @@ -770,12 +770,12 @@ Gusto mo bang pumunta sa account na ito? You can now explore everything Bitwarden has to offer and start managing your passwords securely. You’re all set! Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance. - Master password hint + Palatandaan ng master password New master password hint - Get started + Magsimula Save and protect your data The vault protects more than just passwords. Store secure logins, IDs, cards and notes securely here. - New login + Bagong pag login Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure. Send sensitive information, safely Import saved logins @@ -818,9 +818,9 @@ Gusto mo bang pumunta sa account na ito? Import Successful! Manage your logins from anywhere with Bitwarden tools for web and desktop. Bitwarden Tools - Got it + Nakuha ko No logins were imported - Import error + Nagkaproblema sa pag-i-import Logins imported Remember to delete your imported password file from your computer SSH key @@ -833,7 +833,7 @@ Gusto mo bang pumunta sa account na ito? Log in quickly and easily across devices Bitwarden can notify you each time you receive a new login request from another device. Skip for now - Done + Tapos na %1$s of %2$s Copy identity name Copy company @@ -930,7 +930,7 @@ Gusto mo bang pumunta sa account na ito? Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. For details on what is and isn’t logged, visit the\nBitwarden help center. Logging duration - 1 hour + 1 oras 8 hours 24 hours 1 week @@ -963,7 +963,7 @@ Gusto mo bang pumunta sa account na ito? This account will soon be deleted. Log in at %1$s to continue using Bitwarden. View file Send View text Send - Delete Send + I-delete ang Ipadala Missing Send re-sync your vault Use dynamic colors Use dynamic colors? @@ -1127,7 +1127,7 @@ Gusto mo bang pumunta sa account na ito? Exporting items… Export failed Passwords - Passkeys + Mga passkey Why is this step required? Kdf update failed, active account not found. Please try again or contact us. An error occurred while trying to update your kdf settings. Please try again or contact us. @@ -1135,4 +1135,6 @@ Gusto mo bang pumunta sa account na ito? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-fr-rFR/strings.xml b/ui/src/main/res/values-fr-rFR/strings.xml index 3aac6ba4c4..f7be7c0100 100644 --- a/ui/src/main/res/values-fr-rFR/strings.xml +++ b/ui/src/main/res/values-fr-rFR/strings.xml @@ -165,14 +165,14 @@ Rechercher un login ou ajouter un nouveau login Non The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. - Autofill + Saisie automatique Voulez-vous saisir automatiquement ou afficher cet élément ? Rechercher En savoir plus sur les organisations Application d\'authentification Saisissez le code de vérification à 6 chiffres depuis votre application d\'authentification. Saisissez le code de vérification à 6 chiffres qui a été envoyé par courriel à %1$s. - We don’t recognize this device. Enter the code sent to your email to verify your identity. + Nous ne reconnaissons pas cet appareil. Saisissez le code envoyé à votre adresse courriel pour vérifier votre identité. Code de récupération Rappelez-vous Se souvenir de l\'e-mail @@ -866,7 +866,7 @@ Voulez-vous basculer vers ce compte ? 3 SUR 3 Vous devez ajouter une adresse Web afin d\'utiliser la saisie automatique pour accéder à ce compte. En savoir plus sur la création d\'identifiants - We’ll walk you through the key features to add a new login. + Nous vous guiderons à travers les fonctionnalités clés pour ajouter de nouveaux identifiants de connexion. Découvrir le générateur Apprenez-en plus sur la génération d\'identifiants de connexion sécurisés grâce à une visite guidée. Importer un certificat client @@ -1126,7 +1126,7 @@ Voulez-vous basculer vers ce compte ? Items to import Exporting items… Export failed - Passwords + Mots de passe Clés d\'accès Why is this step required? Kdf update failed, active account not found. Please try again or contact us. @@ -1135,4 +1135,6 @@ Voulez-vous basculer vers ce compte ? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-gl-rES/strings.xml b/ui/src/main/res/values-gl-rES/strings.xml index f5fa1626fb..c16f8c30f7 100644 --- a/ui/src/main/res/values-gl-rES/strings.xml +++ b/ui/src/main/res/values-gl-rES/strings.xml @@ -143,7 +143,7 @@ É preciso o contrasinal mestre Buscar na caixa forte Seleccionar - Item details + Detalles do entrada Entrada gardada Submitting… Syncing… @@ -164,8 +164,8 @@ Non hai entradas coincidentes para \"%1$s\" na caixa forte Buscar unha credencial ou engadir unha nova Deshabilitado - The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. - Autofill + O xeito máis sinxelo de engadir credenciais á túa caixa forte é dende o Servizo de Autoenchido de Bitwarden. Aprende máis do Servizo de Autoenchido de Bitwarden na pantalla de \"Axustes\". + Autoencher Queres autoencher ou ver esta entrada? Busca Aprende sobre as organizacións @@ -305,7 +305,7 @@ Escanearase automaticamente. Correo electrónico non válido. Tarxetas Identidades - Identification + Identificación Credenciais Notas seguras Personal Details @@ -327,7 +327,7 @@ Escanearase automaticamente. Tipo Baixar Subir - Owner + Propietario Non hai coleccións que listar. %1$s movido a %2$s. Debes seleccionar polo menos unha colección. @@ -394,7 +394,7 @@ Escanearase automaticamente. As directivas da organización están afectando á configuración do xerador Houbo un problema exportando a caixa forte. Se o problema persiste, terás que exportalo dende a páxina web. Anexo gardado - Please turn on “Autofill Accessibility Service” from Bitwarden Settings to use the Autofill tile. + Por favor habilita o \"Servizo de Accesibilidade de Autoenchido\" de Bitwarden para usar o botón de autoenchido. Non se detectan campos de contrasinal Sending to trash… A entrada moveuse ó lixo. @@ -458,7 +458,7 @@ Escanearase automaticamente. Opcionalmente pódese requirir un contrasinal para acceder ó Send. Eliminar contrasinal Eliminando contrasinal - Password removed + Contrasinal eliminado Novo Send Copiar ligazón Compartir ligazón @@ -467,8 +467,8 @@ Escanearase automaticamente. Editar Send Edit file Send Edit text Send - New file Send - New text Send + Novo Send de arquivo + Novo Send de texto Seguro que queres eliminar este Send? Send eliminado Send updated @@ -742,7 +742,7 @@ Queres comprobalo dende esa conta? Cambiar o enderezo electrónico Seguinte Bitwarden non pode recuperar contrasinais mestres oxidados ou perdidos. - Bitwarden cannot reset a lost or forgotten master password. + Bitwarden non pode recuperar contrasinais mestres oxidados ou perdidos. Escolle un contrasinal mestre Escolle un contrasinal único e seguro para ofrecer a túa información. @@ -768,7 +768,7 @@ Queres comprobalo dende esa conta? Turn on browser autofill integration later? Podes volver a facer este paso en calquera momento dende os Axustes. Xa podes explorar todo o que ofrece Bitwarden e xestionar os teus contrasinais de forma segura. - You’re all set! + Todo listo! Erro conectando co servizo de Duo. Usa un método de verificación en 2 pasos alternativo ou contacta con Duo. Obter pista do contrasinal mestre New master password hint @@ -808,7 +808,7 @@ Queres comprobalo dende esa conta? Precisas axuda? Bótalle un ollo á axuda de importado. Garda o arquivo exportado nalgún lugar do teu computador onde o atopes doadamente. Este non é un servidor de Bitwarden recoñecido. Pode que teñas que comprobalo co teu provedor ou actualizar o servidor. - Syncing logins… + Sincronizando credenciais... Descarga a extensión de navegador Visita bitwarden.com/download e integra Bitwarden no teu navegador favorito para unha experiencia completa. Usa a aplicación web @@ -908,7 +908,7 @@ Queres comprobalo dende esa conta? Credential operation failed because user is locked out. Credential operation failed because the selected item does not exist. Credential operation failed because user verification was cancelled. - Self-host server URL + URL do servidor de aloxamento propio Use Brave autofill integration Use Chrome autofill integration Use Chrome Beta autofill integration @@ -930,7 +930,7 @@ Queres comprobalo dende esa conta? Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. For details on what is and isn’t logged, visit the\nBitwarden help center. Logging duration - 1 hour + 1 hora 8 hours 24 hours 1 week @@ -963,7 +963,7 @@ Queres comprobalo dende esa conta? This account will soon be deleted. Log in at %1$s to continue using Bitwarden. View file Send View text Send - Delete Send + Eliminar Send Missing Send re-sync your vault Use dynamic colors Use dynamic colors? @@ -988,7 +988,7 @@ Queres comprobalo dende esa conta? Installed apps Delete %s Failed to decrypt cipher. Contact support. - Decryption error + Erro de descifrado Escanear un código QR Non se pode engadir a Clave de autenticación? Activa o permiso de cámara para empregar o escáner @@ -1125,9 +1125,9 @@ Queres comprobalo dende esa conta? Import passwords, passkeys, and other item types from your Bitwarden vault. Items to import Exporting items… - Export failed - Passwords - Passkeys + Exportado falido + Contrasinais + Claves de acceso Why is this step required? Kdf update failed, active account not found. Please try again or contact us. An error occurred while trying to update your kdf settings. Please try again or contact us. @@ -1135,4 +1135,6 @@ Queres comprobalo dende esa conta? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-hi-rIN/strings.xml b/ui/src/main/res/values-hi-rIN/strings.xml index 408c8eb0ad..c4e920754b 100644 --- a/ui/src/main/res/values-hi-rIN/strings.xml +++ b/ui/src/main/res/values-hi-rIN/strings.xml @@ -31,7 +31,7 @@ मास्टर पासवर्ड गलत है। वापस कोशिश करें। पिन गलत है। वापस कोशिश करें। खोलें - Log in + Log In लॉगइन लॉगआउट करें पक्का लॉगआउट करें? @@ -161,7 +161,7 @@ आइटम %1$s के लिए आइटम %1$s के लिए आपकी तिजोरी में कोई आइटम नहीं हैं। - There are no items in your vault that match “%1$s” + आपके तिजोरी में ऐसी कोई भी चीज़ नहीं है जो \"%1$s\" से मेल खाती है Search for a login or add a new login बंद The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. @@ -929,7 +929,7 @@ Do you want to switch to this account? Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. For details on what is and isn’t logged, visit the\nBitwarden help center. Logging duration - 1 hour + 1 घंटा 8 hours 24 hours 1 week @@ -962,7 +962,7 @@ Do you want to switch to this account? This account will soon be deleted. Log in at %1$s to continue using Bitwarden. View file Send View text Send - Delete Send + Send हटाए Missing Send re-sync your vault Use dynamic colors Use dynamic colors? @@ -1126,7 +1126,7 @@ Do you want to switch to this account? Exporting items… Export failed Passwords - Passkeys + पासकी Why is this step required? Kdf update failed, active account not found. Please try again or contact us. An error occurred while trying to update your kdf settings. Please try again or contact us. @@ -1134,4 +1134,6 @@ Do you want to switch to this account? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-hr-rHR/strings.xml b/ui/src/main/res/values-hr-rHR/strings.xml index d39ecdc918..b0bdd24508 100644 --- a/ui/src/main/res/values-hr-rHR/strings.xml +++ b/ui/src/main/res/values-hr-rHR/strings.xml @@ -1141,4 +1141,6 @@ bilo kakav problem. Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-hu-rHU/strings.xml b/ui/src/main/res/values-hu-rHU/strings.xml index 6d3e33e134..a05c7a31cc 100644 --- a/ui/src/main/res/values-hu-rHU/strings.xml +++ b/ui/src/main/res/values-hu-rHU/strings.xml @@ -164,7 +164,7 @@ Nincs elem a széfben \"%1$s\" egyezéssel. Keressünk egy bejelentkezést vagy adjunk hozzá új bejelentkezést. Letiltva - The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. + A legeszerűbben a Bitwarden Automata-kitöltő Szolgáltatással tud belépést hozzáadni széfjéhez. A Beállításokben többet tudhat meg a Bitwarden Automat-kitöltő szolgáltatásról. Automatikus kitöltés Automatikusan kitöltésre vagy megtekintésre kerüljön ez az elem? Keresés @@ -172,7 +172,7 @@ Hitelesítő alkalmazás Add meg a 6 számjegyű ellenőrző kódot a hitelesítő alkalmazásodból. 6 számjegyű ellenőrző kód megadása, ami %1$s e-mail címre lett küldve. - We don’t recognize this device. Enter the code sent to your email to verify your identity. + Nem ismerhető fel ez az eszköz. Írjuk be az email címünkre küldött kódot a személyazonosság igazolásához. Helyreállító kód Megjegyzés Email cím megjegyzése @@ -737,7 +737,7 @@ Szeretnénk átváltani erre a fiókra? További információ a fiókzárolás megelőzésének módjairól Segítség szerver geolokációval. Email cím (kötelező) - Select the link in the email to verify your email address and continue creating your account. + Válasszuk ki az emailben található hivatkozást az email cím ellenőrzéséhez és folytassuk a fiók létrehozását. Email cím megváltoztatása Következő A Bitward nem tudja visszaállítani az elveszett vagy elfelejtett mesterjelszót. @@ -767,7 +767,7 @@ Szeretnénk átváltani erre a fiókra? A böngésző automatikus kitöltési integrációjának bekapcsolása? Bármikor be tudja fejezni ezt a lépést a Beállításokban. Mostantól az automatikus kitöltéssel bejelentkezhetünk az alkalmazásokba és webhelyekre a mentett jelszavakkal. Most mindent felfedezhetünk, amit a Bitwarden kínál. - You’re all set! + Készen is vagyunk! Hiba történt a Duo szolgáltatáshoz csatlakozáskor. Használjunk másik kétlépcsős bejelentkezési módot vagy kérjünk segítséget a Duotól. Mesterjelszó emlékeztető Új mesterjelszó kérés @@ -807,7 +807,7 @@ Szeretnénk átváltani erre a fiókra? Segítségre van szükség? Nézzük meg az importálás súgót. Mentsük el az exportált fájlt olyan helyre a számítógépen, ahol könnyen megtalálhatjuk. Ez nem egy felismert Bitwarden szerver. Konzultálhatunk a szolgáltatóval vagy frissítsük a szervert. - Syncing logins… + Bejelentkezések szinkronizálása... Böngésző bővítmény letöltése Keressük fel a bitwarden.com/download webhelyet és integráljuk a Bitwardent kedvenc böngészőbe a zökkenőmentes élmény érdekében. Webalkalmazás használata @@ -865,13 +865,13 @@ Szeretnénk átváltani erre a fiókra? 3/3 Meg kell adnia egy webcímet, hogy az automatikus kitöltést használjunk a fiók eléréséhez. További információ az új bejelentkezésekről - We’ll walk you through the key features to add a new login. + Végigmegyünk az új bejelentkezés hozzáadásához szükséges legfontosabb funkciókon. A generátor felfedezése Tudjunk meg többet a biztonságos bejelentkezési hitelesítő adatok létrehozásáról egy vezetett bemutatóval. Ügyfél tanúsítvány importálása Adjuk meg az ügyfél tanúsítvány jelszavát és a tanúsítvány kívánt álnevét. Álnév - Use the generator to create secure passwords, passphrases and usernames. + Használjuk a generátort biztonságos jelszavak, jelmondatok és felhasználónevek létrehozásához. A jelmondatok erős jelszavak, amelyeket gyakran könnyebb megjegyezni és begépelni, mint a véletlenszerű jelszavakat. Hasznosak az olyan fiókokba bejelentkezéshez, ahol az Automatikus kitöltés nem érhető el, például a tévén a streaming szolgáltatásba. Az egyedi felhasználónevek további biztonsági réteget adnak és megakadályozhatják, hogy a hackerek megtalálják a fiókokat. 1/6 @@ -880,8 +880,8 @@ Szeretnénk átváltani erre a fiókra? 4/6 5/6 6/6 - Use these options to adjust your password to meet your account website’s requirements. - After you save your new password to Bitwarden, don’t forget to update it on your account website. + Ezekkel az opciókkal állíthatjuk be a jelszót a fiók követelményeihez. + Miután elmentettük az új jelszót a Bitwardenbe, ne felejtsük el frissíteni azt a fiók webhelyén. Személyazonosság ellenőrzése Hiba történt a tanúsítványok betöltésekor. Tanúsítvány álnév @@ -1131,7 +1131,9 @@ Szeretnénk átváltani erre a fiókra? A Kdf frissítés sikertelen volt, aktív fiók nem található. Próbáljuk újra vagy vegyük fel a kapcsolatot a szolgáltatóval. Hiba történt a kdf beállítások frissítésének kísérlete során. Próbáljuk újra vagy vegyük fel a kapcsolatot a szolgáltatóval. Az importálási kérelmet nem lehetett feldolgozni. - Your vault may be empty, or importing some item types isn’t allowed for your account. - No items available to import - Select a different account + Előfordulhat, hogy a széf üres vagy egyes elemtípusok importálása nem engedélyezett a fiókhoz. + Nincsenek elérhető importálandó elemek. + Válasszunk egy másik fiókot. + Fiók email cím ellenőrzése + Írjuk be azt a 6 számjegyű kódot, amely emailben lett elküldve az alábbi címre. diff --git a/ui/src/main/res/values-in-rID/strings.xml b/ui/src/main/res/values-in-rID/strings.xml index 34c559535a..cb05225b8c 100644 --- a/ui/src/main/res/values-in-rID/strings.xml +++ b/ui/src/main/res/values-in-rID/strings.xml @@ -1105,8 +1105,8 @@ Apakah Anda ingin beralih ke akun ini? %1$d item telah diimpor ke brankas Anda. Aktifkan Isi Otomatis browser untuk tetap mengisi sandi - Your browser has recently updated, which has disabled Bitwarden autofill. To continue filling your passwords with Bitwarden, enable browser autofill in autofill settings. - Your browsers have recently updated, which has disabled Bitwarden autofill. To continue filling your passwords with Bitwarden, enable browser autofill for all installed browsers in autofill settings. + Browser Anda baru saja diperbarui, yang menyebabkan isi otomatis Bitwarden nonaktif. Untuk tetap mengisi sandi dengan Bitwarden, aktifkan isi otomatis browser di pengaturan isi otomatis. + Browser Anda baru saja diperbarui, yang menyebabkan isi otomatis Bitwarden nonaktif. Untuk tetap mengisi sandi dengan Bitwarden, aktifkan isi otomatis browser di pengaturan isi otomatis. Lain kali Impor dari Bitwarden Pilih akun @@ -1126,7 +1126,9 @@ Apakah Anda ingin beralih ke akun ini? Gagal memperbarui Kdf, tidak ada akun aktif. Silakan coba lagi atau hubungi kami. Terjadi kesalahan saat mencoba memperbarui pengaturan Kdf Anda. Coba lagi atau hubungi kami. Permintaan impor tidak dapat diproses. - Your vault may be empty, or importing some item types isn’t allowed for your account. - No items available to import - Select a different account + Brankas Anda mungkin kosong, atau mengimpor beberapa jenis item yang tidak diizinkan untuk akun Anda. + Tidak ada item yang tersedia untuk diimpor + Pilih akun berbeda + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-it-rIT/strings.xml b/ui/src/main/res/values-it-rIT/strings.xml index a34e0483e9..3cd5c82e00 100644 --- a/ui/src/main/res/values-it-rIT/strings.xml +++ b/ui/src/main/res/values-it-rIT/strings.xml @@ -101,8 +101,8 @@ 1 minuto 4 ore Immediata - Set session timeout to “Log out”? - After the timeout period, you will be logged out. You will need to be connected to the internet to log in and access your vault again. Your settings and PIN saved on this device won’t change. + Vuoi impostare un timeout per la disconnessione? + Dopo il periodo di timeout, sarai disconnesso. Dovrai avere una connessione attiva per rifare il login e accedere nuovamente alla tua cassaforte. Le impostazioni e il PIN salvati su questo dispositivo non cambieranno. Accesso… Accedi a Bitwarden Password principale non corrispondente @@ -164,7 +164,7 @@ Nessun elemento corrispondente a \'%1$s\' Cerca o crea un login Disabilitato - The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. + Puoi aggiungere facilmente nuove credenziali di login alla tua cassaforte dal servizio di riempimento automatico. Scopri di più sul riempimento automatico nel menu Impostazioni. Riempimento automatico Seleziona l\'azione Cerca @@ -172,7 +172,7 @@ App di autenticazione Inserisci il codice di verifica a 6 cifre dell\'app di autenticazione Inserisci il codice di verifica a 6 cifre inviato a %1$s - We don’t recognize this device. Enter the code sent to your email to verify your identity. + Dispositivo non riconosciuto. Inserisci il codice che è stato inviato alla tua email. Codice di recupero Ricorda Ricorda l\'indirizzo email @@ -363,7 +363,7 @@ Metodo di corrispondenza degli URL predefinito La corrispondenza URL è il metodo predefinito per identificare i suggerimenti di riempimento automatico. Tema - Change the application’s color theme + Cambia lo schema di colori dell\'applicazione Copia le note Richiedi la password principale dopo il riavvio Vuoi richiedere lo sblocco con la password principale quando l\'app viene riavviata? @@ -393,7 +393,7 @@ Il generatore di password è limitato dalle politiche dell\'organizzazione Salvataggio dell\'allegato non riuscito. Prova a salvare l\'allegato dall\'app web. Allegato salvato - Please turn on “Autofill Accessibility Service” from Bitwarden Settings to use the Autofill tile. + Attiva l\'opzione \'Servizio di Accessibilità per il riempimento automatico\' per usare la funzionalità indicata. Nessun campo password rilevato Spostamento nel cestino… Elemento eliminato @@ -737,7 +737,7 @@ Vuoi passare a questo account? Scopri i modi per prevenire il blocco dell\'account Aiuta con le geolocalizzazioni dei server. Indirizzo email (necessario) - Select the link in the email to verify your email address and continue creating your account. + Seleziona il collegamento nell\'e-mail per verificare il tuo indirizzo e-mail e continuare a creare il tuo account. Modifica l\'indirizzo email Continua Bitwarden non può reimpostare la password principale al posto tuo. @@ -755,19 +755,19 @@ Vuoi passare a questo account? Permetti il sync di Bitwarden Authenticator Si è verificato un errore durante la convalida del token di registrazione. Attiva il riempimento automatico - Autofill setup - Turn on browser autofill integration - You’re using a browser that requires special permissions for Bitwarden to autofill your passwords. - You’re using browsers that requires special permissions for Bitwarden to autofill your passwords. - You’re using a browser that requires special permissions for Bitwarden to autofill your passwords. Enable your preferred autofill integration below. - You’re using browsers that requires special permissions for Bitwarden to autofill your passwords. Enable autofill for all your installed browsers to continue. + Impostazioni riempimento automatico + Attiva l\'integrazione di riempimento automatico nel browser + Per attivare il riempimento automatico nel tuo browser, Bitwarden richiede dei permessi speciali. + Per attivare il riempimento automatico nei tuoi browser, Bitwarden richiede dei permessi speciali. + Per attivare il riempimento automatico nel tuo browser, Bitwarden richiede dei permessi speciali. Abilita la tua integrazione preferita qui sotto. + Per attivare il riempimento automatico nei tuoi browser, Bitwarden richiede dei permessi speciali. Abilita il riempimento automatico in tutti i tuoi browser per continuare. Usa il riempimento automatico per accedere ai tuoi account con un solo tocco. Attiva più tardi Attivare il riempimento automatico più tardi? - Turn on browser autofill integration later? + Preferisci attivare l\'integrazione di riempimento automatico in un secondo momento? Puoi completare questo passaggio in qualsiasi momento tornando nelle Impostazioni. Esplora tutto ciò che Bitwarden ha da offrire e inizia a gestire le tue credenziali di accesso in modo sicuro. - You’re all set! + Tutto pronto! Errore di connessione al servizio Duo. Utilizza un metodo di accesso in due passaggi diverso o contatta Duo per l\'assistenza. Suggerimento per la password principale Nuovo suggerimento parola d\'accesso principale @@ -865,13 +865,13 @@ Vuoi passare a questo account? 3 di 3 Devi aggiungere un indirizzo web per usare l\'auto-riempimento per accedere a questo account. Scopri sui nuovi accessi - We’ll walk you through the key features to add a new login. + Ti guideremo attraverso le funzioni chiave per aggiungere un nuovo accesso. Esplora il generatore Scopri di più sulla generazione di credenziali di accesso sicure con un tour guidato. Importa certificato client Inserire la parola d\'accesso del certificato client, e l\'alias desiderato per questo certificato. Alias - Use the generator to create secure passwords, passphrases and usernames. + Usa il generatore per creare parole d\'accesso sicure, espressioni d\'accesso e nomi utente. Le espressioni d\'accesso sono parole d\'accesso forti che sono spesso più facili da ricordare e digitare rispetto alle parole d\'accesso casuali. Sono utili per accedere ad account dove AutoFill non è disponibile, come un servizio di streaming sulla TV. I nomi utente unici aggiungono un ulteriore livello di sicurezza e possono aiutare a impedire agli hacker di trovare i tuoi account. 1 DI 6 @@ -880,8 +880,8 @@ Vuoi passare a questo account? 4 DI 6 5 DI 6 6 DI 6 - Use these options to adjust your password to meet your account website’s requirements. - After you save your new password to Bitwarden, don’t forget to update it on your account website. + Usa queste opzioni per modificare la parola d\'accesso per soddisfare i requisiti del sito web del tuo account. + Dopo aver salvato la tua nuova parola d\'accesso in Bitwarden, non dimenticare di aggiornarla sul sito web del tuo account. Verifica la tua identità Errore caricamento certificato Alias del certificato @@ -910,7 +910,7 @@ Vuoi passare a questo account? URL server autogestito Usa l\'integrazione di riempimento automatico di Brave Usa l\'integrazione di riempimento automatico Chrome - Use Chrome Beta autofill integration + Usa l\'integrazione di Chrome Beta Migliora il riempimento dei campi di accesso per i siti supportati sui browser con integrazione. Se abiliti questa opzione, dovrai attivare l\'integrazione del riempimento automatico nelle impostazioni del browser. Mostra di più Nessuna cartella @@ -954,7 +954,7 @@ Vuoi passare a questo account? Registrazione eliminata Impostazioni app Vuoi sostituire il certificato esistente? - A certificate with the alias “%s” already exists. Do you want to replace it?\nReplacing the certificate may impact your connection to any environments currently using it. + Esiste già un certificato con l\'alias \"%s\". Vuoi sostituirlo?\nSostituire il certificato potrebbe influire sulla connessione a qualsiasi ambiente che lo utilizza. Sostituisci certificato Impossibile leggere il certificato. Impossibile eliminare l\'account @@ -967,12 +967,12 @@ Vuoi passare a questo account? Usa colori dinamici Vuoi applicare i colori dinamici di Android? I colori dinamici utilizzano i colori di sistema e potrebbero non soddisfare tutte le linee guida di accessibilità. - Passkey operation failed because browser (%1$s) is not recognized. Select “Trust” to add %1$s to the list of locally trusted applications. + Operazione passkey fallita perché il browser (%1$s) non è riconosciuto. Seleziona \'Riconosci come affidabile\' per aggiungere %1$s all\'elenco delle applicazioni affidabili localmente. Passkey non utilizzabile: il browser non è nell\'elenco delle applicazioni affidabili. Riconosci come affidabile Applicazioni non riconosciute automaticamente da Bitwarden ma impostate come affidabili per l\'utilizzo di passkey. App non provenienti dal Play Store ma riconosciute come affidabili da Bitwarden grazie alle segnalazioni positive degli utenti. - These are applications Google considers safe and are available in Google’s Play Store. + Applicazioni disponibili nel Google Play Store, con tutti i vincoli di sicurezza e affidabilità richiesti. Riconosciuto affidabile da te Riconosciuto affidabile dagli utenti Riconosciuto affidabile da Google @@ -1002,7 +1002,7 @@ Vuoi passare a questo account? Comprimi opzioni avanzate Numero di cifre - %d second + %d secondo %d secondi Elemento salvato @@ -1090,48 +1090,50 @@ Vuoi passare a questo account? Il metodo di rilevamento URL specifica il modo in cui Bitwarden rileva l\'indirizzo per mostrare suggerimenti pertinenti di riempimento automatico.\nAttenzione: \'Inizia con\' è un\'opzione avanzata con un rischio maggiore di esporre le credenziali. \'Inizia con\' è un\'opzione avanzata con un rischio maggiore di esporre le credenziali. \'Espressione regolare\' è un\'opzione avanzata con un rischio maggiore di esporre le credenziali se usato senza cognizione di causa. - Later - Encryption settings updated - Update your encryption settings - The new recommended encryption settings will improve your account security. Enter your master password to update now. - Credential import was cancelled in the selected app. No items have been imported. + Più tardi + Impostazioni di crittografia aggiornate + Aggiorna le impostazioni di crittografia + Le nuove impostazioni di crittografia consigliate miglioreranno la sicurezza del tuo account. Inserisci la tua password principale per aggiornare. + L\'importazione delle credenziali è stata annullata nell\'app selezionata. Nessun elemento è stato importato. Importazione annullata Nessun elemento importato Nessun elemento ricevuto dall\'app selezionata. - Vault sync failed - Your items have been successfully imported, but they will not be visible in your vault until sync is performed. - There was a problem importing your items. Please try again. If the problem persists, contact support. + Sincronizzazione cassaforte fallita + Gli elementi sono stati importati con successo, ma non saranno visibili nella tua cassaforte fino a quando non sarà eseguita la sincronizzazione. + Si è verificato un problema durante l\'importazione. Riprova. Se il problema persiste, contatta il supporto. Salvataggio elementi… Impossibile importare i tuoi elementi Importa dal computer Importa da un\'altra app - %1$d item has been imported to your vault. + %1$d elemento è stato importato nella tua cassaforte. %1$d elementi sono stati importati nella tua cassaforte. - Enable browser Autofill to keep filling passwords - Your browser has recently updated, which has disabled Bitwarden autofill. To continue filling your passwords with Bitwarden, enable browser autofill in autofill settings. - Your browsers have recently updated, which has disabled Bitwarden autofill. To continue filling your passwords with Bitwarden, enable browser autofill for all installed browsers in autofill settings. - Not now - Import from Bitwarden - Select account - No accounts available - You don’t have any accounts you can import from. Your organization’s security policy may restrict importing items from Bitwarden to another app. - Import restricted, unable to import cards from this account. - Verify your master password - Having trouble with autofill? - Access help and troubleshooting documentation here - Import passwords, passkeys, and other item types from your Bitwarden vault. - Items to import - Exporting items… - Export failed - Passwords - Passkeys - Why is this step required? - Kdf update failed, active account not found. Please try again or contact us. - An error occurred while trying to update your kdf settings. Please try again or contact us. - The import request could not be processed. - Your vault may be empty, or importing some item types isn’t allowed for your account. - No items available to import - Select a different account + Abilita il riempimento automatico nel browser per mantenere la funzionalità + Il tuo browser è stato aggiornato di recente, e il riempimento automatico di Bitwarden è stato disattivato. Per continuare a riempire le password con Bitwarden, abilita il riempimento automatico del browser. + I tuoi browser sono stati aggiornati di recente, e il riempimento automatico di Bitwarden è stato disattivato. Per continuare a riempire le password con Bitwarden, abilita il riempimento automatico dei browser. + Non adesso + Importa da Bitwarden + Scegli un account + Nessun account disponibile + Non hai account disponibili come origini dell\'importazione. La politica di sicurezza della tua organizzazione potrebbe limitare l\'importazione di elementi da Bitwarden a un\'altra app. + Impossibile concludere l\'operazione: la funzionalità di importazione è stata limitata. + Verifica la tua password principale + Problemi con il riempimento automatico? + Consulta la documentazione di aiuto e risoluzione problemi + Importa password, passkey e altro dalla tua cassaforte Bitwarden. + Elementi da importare + Esportazione… + Esportazione non riuscita + Password + Passkey + Perché questo passo è necessario? + Aggiornamento di KDF non riuscito: non è stato rilevato un account attivo. Riprova o contatta l\'assistenza tecnica. + Si è verificato un errore durante l\'aggiornamento delle impostazioni di KDF. Riprova o contatta l\'assistenza tecnica. + L\'importazione non è riuscita. + Il problema potrebbe essere la cassaforte vuota, o una restrizione del tuo account che consente l\'importazione solo di alcuni tipi di elemento. + Nessun elemento disponibile per l\'importazione + Scegli un altro account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-iw-rIL/strings.xml b/ui/src/main/res/values-iw-rIL/strings.xml index 0b56bef8df..49d85e9169 100644 --- a/ui/src/main/res/values-iw-rIL/strings.xml +++ b/ui/src/main/res/values-iw-rIL/strings.xml @@ -166,7 +166,7 @@ אין פריטים בכספת שלך התואמים את “%1$s” חפש כניסה או הוסף כניסה חדשה מושבת - The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. + הדרך הקלה ביותר להוסיף כניסות חדשות לכספת שלך היא דרך שירות המילוי האוטומטי של Bitwarden. למד עוד אודות השימוש בשירות המילוי האוטומטי של Bitwarden על ידי ניווט למסך ה\"הגדרות\". מילוי אוטומטי האם ברצונך למלא אוטומטית או להציג פריט זה? חיפוש @@ -174,7 +174,7 @@ יישום מאמת הזן את קוד האימות בן 6 הספרות מהיישום המאמת שלך. הזן את קוד האימות בן 6 הספרות שנשלח בדוא\"ל אל %1$s. - We don’t recognize this device. Enter the code sent to your email to verify your identity. + אנחנו לא מזהים את המכשיר הזה. הזן את הקוד שנשלח לדוא\"ל שלך כדי לאמת את זהותך. קוד שחזור זכור זכור דוא\"ל @@ -398,7 +398,7 @@ מדיניות ארגון אחת או יותר משפיעה על הגדרות המחולל שלך הייתה בעיה בשמירת צרופה זו. אם הבעיה נמשכת, אתה יכול לשמור אותה מכספת הרשת. הצרופה נשמרה בהצלחה - Please turn on “Autofill Accessibility Service” from Bitwarden Settings to use the Autofill tile. + נא להפעיל את \"שירות הנגישות של המילוי האוטומטי\" מהגדרות Bitwarden כדי להשתמש באריח המילוי האוטומטי. לא זוהו שדות סיסמה שולח לאשפה… הפריט נשלח לאשפה. @@ -742,7 +742,7 @@ למד על דרכים למניעת השבתת חשבון עזרה עם מיקומים גיאוגרפיים של שרת. כתובת דוא\"ל (נדרשת) - Select the link in the email to verify your email address and continue creating your account. + בחר את הקישור בדוא\"ל שלך כדי לאמת את כתובת הדוא\"ל שלך ולהמשיך ליצור את החשבון שלך. שנה כתובת דוא\"ל הבא Bitwarden לא יכול לשחזר סיסמה ראשית שנאבדה או נשכחה. @@ -774,7 +774,7 @@ Turn on browser autofill integration later? אתה יכול לחזור כדי להשלים את השלב הזה בכל עת בהגדרות. אתה יכול עכשיו לגלות את כל מה שיש ל־Bitwarden להציע ולהתחיל לנהל את הסיסמאות שלך באופן מאובטח. - You’re all set! + אתה מוכן! שגיאה בהתחברות עם השירות Duo. השתמש בשיטת כניסה דו־שלבית אחרת או פנה אל Duo לסיוע. רמז לסיסמה הראשית רמז לסיסמה ראשית חדש @@ -872,13 +872,13 @@ 3 מתוך 3 אתה מוכרח להוסיף כתובת אינטרנט על מנת להשתמש במילוי אוטומטי כדי לגשת לחשבון זה. למד על כניסות חדשות - We’ll walk you through the key features to add a new login. + אנו נדריך אותך בתכונות העיקריות להוספת כניסה חדשה. גלה את המחולל למד עוד על יצירת אישורי כניסה מאובטחים עם סיור מודרך. ייבא אישור לקוח הזן את סיסמת אישור הלקוח ואת הכינוי הרצוי עבור אישור זה. כינוי - Use the generator to create secure passwords, passphrases and usernames. + השתמש במחולל כדי ליצור סיסמאות מאובטחות, ביטויי סיסמה ושמות משתמש. ביטויי סיסמה הם סיסמאות חזקות שלרוב קל יותר לזכור ולהקליד מאשר סיסמאות אקראיות. הם שימושיים לכניסה לחשבונות היכן שמילוי אוטומטי אינו זמין, כמו שירות סטרימינג בטלוויזיה שלך. שמות משתמש ייחודיים מוסיפים שכבה נוספת של אבטחה ויכולים לעזור למנוע מהאקרים למצוא את החשבונות שלך. 1 מתוך 6 @@ -887,8 +887,8 @@ 4 מתוך 6 5 מתוך 6 6 מתוך 6 - Use these options to adjust your password to meet your account website’s requirements. - After you save your new password to Bitwarden, don’t forget to update it on your account website. + השתמש באפשרויות אלה כדי להתאים את הסיסמה שלך כך שתעמוד בדרישות של אתר החשבון שלך. + לאחר שאתה שומר את הסיסמה החדשה שלך ב־Bitwarden, אל תשכח לעדכן אותה באתר החשבון שלך. אמת את זהותך שגיאה בטעינת אישור כינוי אישור @@ -1137,9 +1137,9 @@ Import passwords, passkeys, and other item types from your Bitwarden vault. Items to import Exporting items… - Export failed - Passwords - Passkeys + ייצוא נכשל + סיסמאות + מפתחות גישה Why is this step required? Kdf update failed, active account not found. Please try again or contact us. An error occurred while trying to update your kdf settings. Please try again or contact us. @@ -1147,4 +1147,6 @@ Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-ja-rJP/strings.xml b/ui/src/main/res/values-ja-rJP/strings.xml index e411a871fe..e75b254996 100644 --- a/ui/src/main/res/values-ja-rJP/strings.xml +++ b/ui/src/main/res/values-ja-rJP/strings.xml @@ -163,15 +163,15 @@ \"%1$s\" に一致するアイテムは保管庫にありません ログイン情報を検索するか、新しいログイン情報を追加します 無効 - The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. - Autofill + ログイン情報を保管庫に追加する一番簡単な方法は Bitwarden の自動入力機能を使うことです。詳しくは「設定」画面に進んでください。 + 自動入力 このアイテムを自動入力するか表示しますか? 検索 組織について学ぶ 認証アプリ 認証アプリに表示された6桁の認証コードを入力してください。 %1$s に送信された6桁の認証コードを入力してください。 - We don’t recognize this device. Enter the code sent to your email to verify your identity. + このデバイスは未確認です。本人確認のため、メールアドレスに送信されたコードを入力してください。 リカバリーコード ログイン状態を記憶 メールアドレスを記録 @@ -392,7 +392,7 @@ 一つ以上の組織のポリシーがパスワード生成の設定に影響しています。 添付ファイルの保存時に問題が発生しました。問題が続くようであれば、ウェブ保管庫から保存してください。 添付ファイルを保存しました - Please turn on “Autofill Accessibility Service” from Bitwarden Settings to use the Autofill tile. + 自動入力タイルを使用するには、Bitwarden の設定で「自動入力のユーザー補助」を有効にしてください。 パスワードフィールドが見つかりませんでした Sending to trash… アイテムをごみ箱に入れました。 @@ -736,7 +736,7 @@ アカウントのロックアウトを防ぐ方法について学ぶ サーバーの位置情報のヘルプ メールアドレス(必須) - Select the link in the email to verify your email address and continue creating your account. + メール内のリンクを選択してメールアドレスを確認し、アカウント作成を続行してください。 メールアドレスを変更 次へ Bitwarden は紛失した、または忘れられたマスターパスワードを復元できません。 @@ -765,7 +765,7 @@ Turn on browser autofill integration later? いつでも「設定」からこのステップに戻れます。 自動入力を使用して、保存したパスワードを使ってアプリやウェブサイトにログインできるようになりました。これで、Bitwarden が提供しているすべての機能の確認が終わりました。 - You’re all set! + 準備完了です! Duo サービスへの接続中にエラーが発生しました。異なる二段階ログイン方法を使用するか、Duo に連絡してください。 マスターパスワードのヒント 新しいマスターパスワードのヒント @@ -792,45 +792,45 @@ Webアプリでインポートデータ を選択し、同期を完了します。 手順1/3 保存したログイン情報をエクスポート - You’ll delete this file after import is complete. + インポートが完了したら、このファイルを削除します。 On your computer, open a new browser tab and go to %1$s Log in to the Bitwarden web app. Step 2 of 3 - Log in to Bitwarden + Bitwarden にログイン Step 3 of 3 - Import logins to Bitwarden + Bitwarden にログイン情報をインポート In the Bitwarden navigation, find the Tools option and select Import data. Fill out the form and import your saved password file. For your security, be sure to delete your saved password file. Need help? Check out import help. Save the exported file somewhere on your computer you can find easily. - This is not a recognized Bitwarden server. You may need to check with your provider or update your server. - Syncing logins… - Download the browser extension - Go to bitwarden.com/download to integrate Bitwarden into your favorite browser for a seamless experience. - Use the web app - Log in at bitwarden.com to easily manage your account and update settings. - Autofill passwords - Set up autofill on all your devices to login with a single tap anywhere. + これは認識された Bitwarden サーバーではありません。プロバイダーに確認するか、サーバーを更新する必要があるかもしれません。 + ログインを同期... + ブラウザーの拡張機能をダウンロード + bitwarden.com/download にアクセスして、Bitwarden をお気に入りのブラウザから利用しましょう。 + Webアプリを使用する + bitwarden.com にログインして、アカウントと設定を簡単に管理します。 + パスワードの自動入力 + すべてのデバイスで自動入力を設定して、ワンタップでどこにでもログインできます。 Import Successful! - Manage your logins from anywhere with Bitwarden tools for web and desktop. + Bitwarden ツールでログイン情報をどこからでも管理できます。 Bitwarden Tools - Got it - No logins were imported - Import error - Logins imported + 了解 + ログイン情報がインポートされませんでした + インポートエラー + ログイン情報をインポートしました Remember to delete your imported password file from your computer - SSH key - Public key - Private key - SSH keys - Copy public key - Copy fingerprint + SSH 鍵 + 公開鍵 + 秘密鍵 + SSHキー + 公開鍵をコピー + フィンガープリントをコピー Enable notifications Log in quickly and easily across devices Bitwarden can notify you each time you receive a new login request from another device. Skip for now - Done + 完了 %1$s of %2$s Copy identity name Copy company @@ -844,43 +844,43 @@ You’ve been logged out because your device’s biometrics don’t meet the latest security requirements. To update settings, log in once again or contact your administrator for access. CXP Import CXP Export - Choose three or four random words + 3つまたは4つのランダムな単語を選択 Pick three or four random, unrelated words that you can easily remember. Think of objects, places, or things you like. - Combine those words together + それらの単語を組み合わせてください Put the words together in any order to form your passphrase. Use hyphens, spaces, or leave them as one long word—your choice! - Make it yours + 自分好みに Add a number or symbol to make it even stronger. Now you have a unique, secure, and memorable passphrase! - Need some inspiration? - Check out the passphrase generator + インスピレーションが必要ですか? + パスフレーズジェネレーターをチェックしてください We couldn’t verify the server’s certificate. The certificate chain or proxy settings on your device or your Bitwarden server may not be set up correctly. - Copy private key + 秘密鍵をコピー Login Credentials Autofill Options - Use this button to generate a new unique password. + このボタンを使用して、新しい一意のパスワードを生成します。 1 OF 3 2 OF 3 - You’ll only need to set up Authenticator Key for logins that require two-factor authentication with a code. The key will continuously generate six-digit codes you can use to log in. + 認証キーを設定する必要があるのは、コードによる2要素認証を要求するログイン項目のみです。 認証キーによって、ログインに使用する6桁のコードが継続的に生成されます。 3 OF 3 - You must add a web address to use autofill to access this account. - Learn about new logins - We’ll walk you through the key features to add a new login. - Explore the generator - Learn more about generating secure login credentials with a guided tour. + 自動入力を使用してこのアカウントにアクセスするには、Webアドレスを追加する必要があります。 + ログイン情報の追加について学ぶ + 新しいログインを追加するための主要な機能について説明します。 + 生成機能について知る + セキュアなログイン資格情報を生成する方法を、ガイド付きツアーでより深く学習しましょう。 Import client certificate Enter the client certificate password and the desired alias for this certificate. Alias - Use the generator to create secure passwords, passphrases and usernames. + 生成ツールを使用して、安全なパスワード、パスフレーズ、ユーザー名を作成します。 Passphrases are strong passwords that are often easier to remember and type than random passwords. They are helpful for logging into accounts where Autofill is not available, like a streaming service on your TV. - Unique usernames add an extra layer of security and can help prevent hackers from finding your accounts. + 一意のユーザー名は追加のセキュリティ層となり、あなたのアカウントがハッカーに見つかりにくくするのに役立ちます。 1 OF 6 2 OF 6 3 OF 6 4 OF 6 5 OF 6 6 OF 6 - Use these options to adjust your password to meet your account website’s requirements. - After you save your new password to Bitwarden, don’t forget to update it on your account website. - Verify your identity + これらのオプションを使用して、アカウントのウェブサイトの要件を満たすためにパスワードを調整します。 + 新しいパスワードを Bitwarden に保存したら、そのアカウントのウェブサイトでも忘れずにパスワードを更新してください。 + 本人確認を行ってください Error loading certificate Certificate alias Import certificate @@ -905,7 +905,7 @@ Credential operation failed because user is locked out. Credential operation failed because the selected item does not exist. Credential operation failed because user verification was cancelled. - Self-host server URL + 自己ホスト型サーバー URL Use Brave autofill integration Use Chrome autofill integration Use Chrome Beta autofill integration @@ -914,7 +914,7 @@ No folder Show less Add field - Share error details + エラーの詳細を共有 Flight recorder Flight recorder help View recorded logs @@ -927,12 +927,12 @@ Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. For details on what is and isn’t logged, visit the\nBitwarden help center. Logging duration - 1 hour + 1時間 8 hours 24 hours - 1 week - Delete all - Share all + 1週間 + すべて削除 + すべてを共有 Unable to share Please try again or select a different log. The log file you are trying to share has been removed. @@ -947,7 +947,7 @@ Please confirm the domain below with your organization administrator.\n\nKey Connector domain:\n%1$s Flight recorder on Flight recorder will be active until %1$s at %2$s. Return to settings to deactivate now. - Go to settings + 設定に移動 All logs deleted Log deleted App settings @@ -956,11 +956,11 @@ Replace certificate Unable to read certificate. Cannot delete your account - This action cannot be completed because your account is owned by an organization. Contact your organization administrator for additional details. + このアカウントは組織が所有しているため、操作を完了できません。詳しくは組織の管理者へご確認ください。 This account will soon be deleted. Log in at %1$s to continue using Bitwarden. View file Send View text Send - Delete Send + Send を削除 Missing Send re-sync your vault Use dynamic colors Use dynamic colors? @@ -985,7 +985,7 @@ Installed apps Delete %s Failed to decrypt cipher. Contact support. - Decryption error + 復号エラー QRコードを読み取る 認証キーを追加できませんか? スキャナーを利用するためにカメラの使用を許可する @@ -1119,9 +1119,9 @@ Import passwords, passkeys, and other item types from your Bitwarden vault. Items to import Exporting items… - Export failed - Passwords - Passkeys + エクスポート失敗 + パスワード + パスキー Why is this step required? Kdf update failed, active account not found. Please try again or contact us. An error occurred while trying to update your kdf settings. Please try again or contact us. @@ -1129,4 +1129,6 @@ Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-ka-rGE/strings.xml b/ui/src/main/res/values-ka-rGE/strings.xml index ba32059f53..6e6df724fd 100644 --- a/ui/src/main/res/values-ka-rGE/strings.xml +++ b/ui/src/main/res/values-ka-rGE/strings.xml @@ -31,7 +31,7 @@ Invalid master password. Try again. Invalid PIN. Try again. Launch - Log in + შესვლა Login Log out Are you sure you want to log out? @@ -124,7 +124,7 @@ New identity There are no notes in your vault. New note - New item + ახალი ჩანაწერი New SSH key There are no text Sends in your vault. There are no file Sends in your vault. @@ -165,7 +165,7 @@ Search for a login or add a new login Disabled The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. - Autofill + ავტომატური შევსება Do you want to autofill or view this item? Search Learn about organizations @@ -305,7 +305,7 @@ Scanning will happen automatically. Invalid email address. Cards Identities - Identification + იდენტიფიკაცია Logins Secure notes Personal Details @@ -327,7 +327,7 @@ Scanning will happen automatically. Type Move down Move Up - Owner + მფლობელი There are no collections to list. %1$s moved to %2$s. You must select at least one collection. @@ -700,9 +700,9 @@ Do you want to switch to this account? We sent an email to %1$s. By continuing, you agree to the Terms of Service and Privacy Policy Unsubscribe - Check your email + შეამოწმეთ თქვენი ელფოსტა Open email app - Email verified + ელფოსტა გადამოწმებულია Get emails from Bitwarden for announcements, advice, and research opportunities. Unsubscribe at any time. Security, prioritized Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you. @@ -721,7 +721,7 @@ Do you want to switch to this account? Set up later Set up unlock later? You can return to complete this step anytime from Account Security in Settings. - Confirm + დადასტურება Set up biometrics or choose a PIN code to quickly access your vault and Autofill your logins. Never lose access to your vault The best way to make sure you can always access your vault is to set up safeguards from the start. @@ -770,7 +770,7 @@ Do you want to switch to this account? You can now explore everything Bitwarden has to offer and start managing your passwords securely. You’re all set! Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance. - Master password hint + მთავარი პაროლის მინიშნება New master password hint Get started Save and protect your data @@ -818,9 +818,9 @@ Do you want to switch to this account? Import Successful! Manage your logins from anywhere with Bitwarden tools for web and desktop. Bitwarden Tools - Got it + გავიგე No logins were imported - Import error + შემოტანის შეცდომა Logins imported Remember to delete your imported password file from your computer SSH key @@ -833,7 +833,7 @@ Do you want to switch to this account? Log in quickly and easily across devices Bitwarden can notify you each time you receive a new login request from another device. Skip for now - Done + დასრულებული %1$s of %2$s Copy identity name Copy company @@ -1135,4 +1135,6 @@ Do you want to switch to this account? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-kn-rIN/strings.xml b/ui/src/main/res/values-kn-rIN/strings.xml index 98a86bd8f2..d1ffc38dc6 100644 --- a/ui/src/main/res/values-kn-rIN/strings.xml +++ b/ui/src/main/res/values-kn-rIN/strings.xml @@ -327,7 +327,7 @@ Scanning will happen automatically. ಪ್ರಕಾರ ಕೆಳಕ್ಕೆ ಸರಿಸು ಮೇಲಕ್ಕೆ ಸರಿಸಿ - Owner + ಮಾಲೀಕರು ಪಟ್ಟಿ ಮಾಡಲು ಯಾವುದೇ ಸಂಗ್ರಹಗಳಿಲ್ಲ. %1$s moved to %2$s. ನೀವು ಕನಿಷ್ಠ ಒಂದು ಸಂಗ್ರಹವನ್ನು ಆರಿಸಬೇಕು. @@ -436,7 +436,7 @@ Scanning will happen automatically. ಕಳುಹಿಸಿ Send Details ಎಲ್ಲಾ ಕಳುಹಿಸುತ್ತದೆ - Text + ಪಠ್ಯ Text to share ಪಠ್ಯ ಕಳುಹಿಸುವಿಕೆಯನ್ನು ಪ್ರವೇಶಿಸುವಾಗ, ಪಠ್ಯವನ್ನು ಪೂರ್ವನಿಯೋಜಿತವಾಗಿ ಮರೆಮಾಡಿ @@ -721,7 +721,7 @@ Do you want to switch to this account? Set up later Set up unlock later? You can return to complete this step anytime from Account Security in Settings. - Confirm + ದೃಢೀಕರಿಸಿ Set up biometrics or choose a PIN code to quickly access your vault and Autofill your logins. Never lose access to your vault The best way to make sure you can always access your vault is to set up safeguards from the start. @@ -930,7 +930,7 @@ Do you want to switch to this account? Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. For details on what is and isn’t logged, visit the\nBitwarden help center. Logging duration - 1 hour + ೧ ಗಂಟೆ 8 hours 24 hours 1 week @@ -963,7 +963,7 @@ Do you want to switch to this account? This account will soon be deleted. Log in at %1$s to continue using Bitwarden. View file Send View text Send - Delete Send + ಅಳಿಸಿ ಕಳುಹಿಸಿ Missing Send re-sync your vault Use dynamic colors Use dynamic colors? @@ -1135,4 +1135,6 @@ Do you want to switch to this account? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-ko-rKR/strings.xml b/ui/src/main/res/values-ko-rKR/strings.xml index 372d2667d3..42dcfc7b1f 100644 --- a/ui/src/main/res/values-ko-rKR/strings.xml +++ b/ui/src/main/res/values-ko-rKR/strings.xml @@ -40,8 +40,8 @@ 이미 추가된 계정입니다. 해당 계정으로 전환할까요? 마스터 비밀번호 - Master password (required) - New master password (required) + 마스터 비밀번호 (필수) + 새 마스터 비밀번호 (필수) 자세히 내 보관함 이름 @@ -61,7 +61,7 @@ 보내기 동기화 URI - Website (URI) + 웹사이트 (URI) 사용자 이름 %1$s 필드는 반드시 입력해야 합니다. 이 Send를 저장하려면 파일을 첨부해야 합니다. @@ -72,7 +72,7 @@ 예 계정 Your new account has been created! - Set Bitwarden as your passkey provider in device settings. + 기기 설정에서 Bitwarden을 패스키 공급자로 설정하세요. 모호한 문자 사용 안 함 Bitwarden 자동 완성 서비스 마스터 비밀번호 변경 @@ -104,7 +104,7 @@ Set session timeout to “Log out”? After the timeout period, you will be logged out. You will need to be connected to the internet to log in and access your vault again. Your settings and PIN saved on this device won’t change. Logging in… - Log in to Bitwarden + Bitwarden에 로그인 비밀번호 확인과 비밀번호가 일치하지 않습니다. 마스터 비밀번호는 보관함을 열 때 필요한 비밀번호입니다. 절대 마스터 비밀번호를 잊어버리지 마세요. 잊어버리면 복구할 수 있는 방법이 없습니다. 마스터 비밀번호 힌트 (선택) @@ -117,13 +117,13 @@ 잠그지 않음 새 항목을 만들었습니다. There are no cards in your vault. - New card + 새 카드 There are no logins in your vault. There are no identities in your vault. - New identity + 신규 ID There are no notes in your vault. New note - New item + 새 항목 New SSH key 보관함에 텍스트 Send가 없습니다. 보관함에 파일 Send가 없습니다. @@ -138,11 +138,11 @@ We’ve sent you an email with your master password hint. 정말 현재 비밀번호를 덮어쓰시겠습니까? 마스터 비밀번호 다시 입력 - Re-type new master password (required) - Re-type master password (required) + 새 마스터 비밀번호 재입력 (필수) + 마스터 비밀번호 재입력 (필수) 보관함 검색 선택 - Item details + 항목 세부사항 항목을 업데이트했습니다. Submitting… Syncing… @@ -160,11 +160,11 @@ 항목 %1$s에 대한 항목 보관함에 %1$s에 대한 항목이 없습니다. - There are no items in your vault that match “%1$s” + 보관함에 \'%1$s\'와(과) 일치하는 항목이 없습니다. Search for a login or add a new login 꺼짐 - The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. - Autofill + 보관함에 새 로그인을 추가하는 가장 쉬운 방법은 Bitwarden 자동 완성 서비스를 사용하는 것입니다. \"설정\" 화면으로 이동하여 Bitwarden 자동 완성 서비스에 대해 더 자세히 알아보세요. + 자동 완성 이 항목을 보거나 자동 완성하시겠습니까? 검색 조직에 대해 알아보기 @@ -286,7 +286,7 @@ 어떤 유형의 사용자 지정 필드를 추가하시겠습니까? 제거 새 URI - Add website + 웹사이트 추가 기본 도메인 Default (%1$s) 정확히 일치 @@ -304,7 +304,7 @@ 잘못된 이메일 주소입니다. 카드 신원 - Identification + 본인 확인 로그인 보안 메모 Personal Details @@ -325,7 +325,7 @@ 유형 아래로 옮기기 위로 옮기기 - Owner + 소유자 컬렉션이 없습니다. %1$s 항목이 %2$s 조직으로 이동되었습니다. 반드시 하나 이상의 컬렉션을 선택해야 합니다. @@ -383,7 +383,7 @@ 코드가 전송되었습니다! 계속하려면 암호를 확인하세요. 내보내기는 보관함 데이터가 암호화되지 않은 형식으로 포함됩니다. 내보낸 파일을 안전하지 않은 채널(예: 이메일)을 통해 저장하거나 보내지 마십시오. 사용이 끝난 후에는 즉시 삭제하십시오. - This file export will be password protected and require the file password to decrypt. + 파일 내보내기는 암호로 보호될 것이며, 파일을 열기 위해서는 파일 암호가 필요합니다. 보관함 내보내기 확인 경고 There was a problem exporting your vault. If the problem persists, you’ll need to export from the web vault. @@ -392,7 +392,7 @@ 하나 이상의 단체 정책이 생성기 규칙에 영항을 미치고 있습니다. 첨부 파일을 저장하던 도중 문제가 있었습니다. 문제가 계속 발생한다면 웹 보관함에서 저장할 수 있습니다. 첨부 파일을 성공적으로 저장했습니다. - Please turn on “Autofill Accessibility Service” from Bitwarden Settings to use the Autofill tile. + 자동 채우기 타일을 사용하려면 Bitwarden 설정에서 \"자동 채우기 접근성 서비스\"를 활성화해주세요. 비밀번호 필드가 탐지되지 않음 Sending to trash… 항목이 휴지통으로 이동되었습니다. @@ -456,7 +456,7 @@ 이 Send에 접근하기 위해 암호를 입력하도록 선택적으로 요구합니다. 비밀번호 제거 비밀번호 제거 중 - Password removed + 비밀번호 제거됨 Send 추가 링크 복사 링크 공유 @@ -495,8 +495,8 @@ 앱으로 돌아가기 이 조직에는 자동으로 비밀번호 재설정에 등록하는 기업 정책이 있습니다. 등록하면 조직 관리자가 마스터 암호를 변경할 수 있습니다. 조직 정책이 보관함 제한 시간에 영향을 미치고 있습니다. 최대 허용 보관함 제한 시간은 %1$s시간 %2$s분입니다 - Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is %1$s hour(s) and %2$s minute(s). Your vault timeout action is set to %3$s. - Your organization policies have set your vault timeout action to %1$s. + 조직에서 보관함 타임아웃을 관리하고 있습니다. 허용된 최대 보관함 타임아웃은 %1$s시간 %2$s분입니다. 현재 보관함 타임아웃은 %3$s입니다. + 조직에서 보관함 타임아웃 작업을 %1$s으로 설정했습니다. 볼트 제한 시간이 조직에서 설정한 제한을 초과합니다. 하나 이상의 조직 정책이 개인 보관함을 내보내는 것을 제한하고 있습니다. 계정 추가 @@ -577,8 +577,8 @@ Generate an email alias with an external forwarding service. Accessibility Service Disclosure Bitwarden은 접근성 서비스를 사용하여 앱 및 웹사이트에서 로그인 필드를 찾아내고 일치하는 항목이 발견되면 사용자 이름과 비밀번호를 입력합니다. Bitwarden은 서비스에서 제공하는 어떠한 정보도 저장하지 않으며, 자격 증명 이외의 화면 요소를 제어하려고 시도하지 않습니다. - Accept - Decline + 승인 + 거부 이미 만료된 로그인 요청입니다. 로그인 시도 확인: %1$s @@ -614,32 +614,32 @@ 검색어와 일치하는 항목이 없습니다 셀프호스팅 지역 - Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour. - Current master password (required) + 마스터 비밀번호가 조직 정책에 맞지 않습니다. 보관함에 액세스하려면 지금 마스터 비밀번호를 업데이트해야 합니다. 계속하면 현재 세션에서 로그아웃되며 다시 로그인해야 합니다. 다른 장치의 활성 세션은 최대 1시간 동안 계속 활성 상태로 유지될 수 있습니다. + 현재 마스터 비밀번호 (필수) Approve with my other device Request admin approval Approve with master password Turn off using a public device - Remember this device - Passkey + 이 기기 기억하기 + 패스키 Passkey will not be copied 패스키는 복제된 아이템에 복사되지 않습니다. 계속 이 항목을 복제하시겠어요? Master password re-prompt help Admin approval requested Your request has been sent to your admin. - You will be notified once approved. - Trouble logging in? + 승인되면 알림을 받게 됩니다. + 로그인에 문제가 있나요? 자동 완성 차단 - Autofill will not be offered for these URIs. + 이 URI에는 자동 완성이 적용되지 않습니다. New blocked URI Invalid format. Use https://, http://, or androidapp:// Enter URI - Format: %1$s. Separate multiple URIs with a comma. + 형식: %1$s. 복수의 URI는 쉼표로 구분합니다. Invalid URI - The URI %1$s is already blocked + %1$s는 이미 차단되었습니다. Login approved Log in with device must be set up in the settings of the Bitwarden app. Need another option? - Log in with device + 기기로 로그인 Logging in on Logging in on: 보관함 @@ -672,19 +672,19 @@ Save passkey as new login Overwrite passkey? This item already contains a passkey. Are you sure you want to overwrite the current passkey? - Duo two-step login is required for your account. + 귀하의 계정에는 Duo 2단계 인증이 필요합니다. Follow the steps from Duo to finish logging in. Launch Duo - Your passkey will be saved to your Bitwarden vault for %1$s + 패스키는 Bitwarden 보관함에 %1$s으로 저장됩니다. Passkeys not supported for this app Passkey operation failed because browser is not privileged Passkey operation failed because browser signature does not match Passkey operation failed because of missing asset links Passkey operation failed because app could not be verified - Confirm file password - File password + 파일 비밀번호 확인 + 파일 비밀번호 Password Protected - This password will be used to export and import this file + 이 비밀번호는 이 파일을 내보내고 가져올 때 사용됩니다. Autofill suggestion 계속해서 WebAuthn 인증을 완료해주세요. Launch WebAuthn @@ -698,57 +698,57 @@ We sent an email to %1$s. By continuing, you agree to the Terms of Service and Privacy Policy Unsubscribe - Check your email - Open email app - Email verified + 이메일을 확인해주세요. + 이메일 앱 열기 + 이메일 인증 완료 Get emails from Bitwarden for announcements, advice, and research opportunities. Unsubscribe at any time. - Security, prioritized - Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you. - Set up biometric unlock and autofill to log into your accounts without typing a single letter. - Quick and easy login - Level up your logins - Use the generator to create and save strong, unique passwords for all your accounts. - Your data, when and where you need it - Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps. - Remove passkey - Passkey removed - What makes a password strong? - A secure, memorable password - Account setup - Set up unlock - Set up later + 보안이 먼저다 + 비밀번호, 카드와 신원을 암호화된 보관함에 저장하세요. Bitwarden은 영지식 종단간 암호화 기술을 사용하여 당신에게 중요한 정보를 보호합니다. + 생체 인증과 자동 완성을 사용 설정하여 클릭만으로 계정에 로그인하세요. + 쉽고 빠른 로그인 + 로그인의 단계를 높이세요 + 생성기를 이용하여 모든 계정에 대해 강력하고 새로운 비밀번호를 만들고 저장하세요. + 당신의 데이터, 필요한 때 필요한 곳에서 + Bitwarden 모바일, 브라우저와 데스크톱 앱으로 다양한 기기 사이에 비밀번호를 제한 없이 저장하세요. + 패스키 제거 + 패스키 제거됨 + 어떤 비밀번호가 강한 비밀번호인가요? + 안전하고 기억할 수 있는 비밀번호 + 계정 설정 + 잠금해제 설정 + 나중에 설정하기 Set up unlock later? You can return to complete this step anytime from Account Security in Settings. - Confirm + 확인 Set up biometrics or choose a PIN code to quickly access your vault and Autofill your logins. Never lose access to your vault The best way to make sure you can always access your vault is to set up safeguards from the start. One of the best ways to create a secure and memorable password is to use a passphrase. \nHere’s how: - Create a hint - Your hint will be sent to you via email when you request it. - Write your password down - Be careful to keep your written password somewhere secret and safe. - Prevent account lockout - Generate master password - Generate - Write this password down and keep it somewhere safe. - Learn about other ways to prevent account lockout + 비밀번호 힌트 만들기 + 비밀번호 힌트는 요청 시에 이메일로 전송됩니다. + 비밀번호를 종이에 적어두기 + 비밀번호를 적은 종이를 은밀하고 안전한 곳에 보관하세요. + 계정 잠김 방지하기 + 마스터 비밀번호 생성하기 + 생성 + 이 비밀번호를 종이에 적어 안전한 곳에 보관하세요. + 계정이 잠기는 것을 방지하는 다른 방법에 대해 알아보세요. Learn about ways to prevent account lockout Help with server geolocations. Email address (required) - Select the link in the email to verify your email address and continue creating your account. - Change email address + 이메일의 링크를 클릭하여 이메일 주소를 인증하고 회원가입을 완료해주세요. + 이메일 주소 변경ㅂ Next Bitwarden cannot recover a lost or forgotten master password. - Bitwarden cannot reset a lost or forgotten master password. - Choose your master password - Choose a unique and strong password to keep your information safe. + Bitwarden은 잊어버린 마스터 비밀번호를 재설정할 수 없습니다. + 마스터 비밀번호 설정하기 + 당신의 정보를 안전하게 보관하기 위해 독특하고 강력한 비밀번호를 설정하세요. %d characters - Expired link - Please restart registration or try logging in. You may already have an account. - Restart registration + 만료된 링크 + 등록을 다시 시작하거나 로그인을 시도해 주세요. 이미 가입된 계정일 수 있습니다. + 등록 다시 시작 Authenticator 동기화 Bitwarden Authenticator와 동기화 허용 There was an issue validating the registration token. @@ -766,15 +766,15 @@ You can return to complete this step anytime in Settings. You can now explore everything Bitwarden has to offer and start managing your passwords securely. You’re all set! - Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance. - Master password hint - New master password hint + Duo 서비스와 연결 중 오류가 발생했습니다 다른 2단계 로그인 방법을 사용하거나 Duo에 문의하세요. + 마스터 비밀번호 힌트 + 새 마스터 비밀번호 Get started Save and protect your data The vault protects more than just passwords. Store secure logins, IDs, cards and notes securely here. - New login + 새 로그인 어떤 플랫폼에서든 누구와도 파일과 데이터를 안전하게 공유하세요. 정보는 종단간 암호화되어 안전하게 유지되며, 정해진 시간과 횟수만큼만 노출됩니다. - Send sensitive information, safely + 민감한 정보를 안전하게 전송하세요. Import saved logins Use a computer to import logins from an existing password manager You can return to complete this step anytime in Vault Settings. @@ -796,7 +796,7 @@ On your computer, open a new browser tab and go to %1$s Log in to the Bitwarden web app. Step 2 of 3 - Log in to Bitwarden + Bitwarden에 로그인 Step 3 of 3 Import logins to Bitwarden In the Bitwarden navigation, find the Tools option and select Import data. @@ -805,7 +805,7 @@ Need help? Check out import help. Save the exported file somewhere on your computer you can find easily. This is not a recognized Bitwarden server. You may need to check with your provider or update your server. - Syncing logins… + 로그인 동기화 중... Download the browser extension Go to bitwarden.com/download to integrate Bitwarden into your favorite browser for a seamless experience. Use the web app @@ -815,22 +815,22 @@ Import Successful! Manage your logins from anywhere with Bitwarden tools for web and desktop. Bitwarden Tools - Got it + 이해했습니다 No logins were imported - Import error + 가져오기 오류 Logins imported Remember to delete your imported password file from your computer - SSH key - Public key - Private key + SSH 키 + 공개 키 + 개인 키 SSH keys - Copy public key - Copy fingerprint + 공개 키 복사 + 핑거프린트 복사 Enable notifications Log in quickly and easily across devices Bitwarden can notify you each time you receive a new login request from another device. Skip for now - Done + 완료 %1$s of %2$s Copy identity name Copy company @@ -844,34 +844,34 @@ You’ve been logged out because your device’s biometrics don’t meet the latest security requirements. To update settings, log in once again or contact your administrator for access. CXP Import CXP Export - Choose three or four random words + 무작위 단어 3~4개 고르기 Pick three or four random, unrelated words that you can easily remember. Think of objects, places, or things you like. - Combine those words together + 단어 서로 합치기 Put the words together in any order to form your passphrase. Use hyphens, spaces, or leave them as one long word—your choice! - Make it yours + 당신의 것으로 만드세요 Add a number or symbol to make it even stronger. Now you have a unique, secure, and memorable passphrase! - Need some inspiration? - Check out the passphrase generator + 영감이 필요한가요? + 비밀구절 생성기를 확인해 보세요 We couldn’t verify the server’s certificate. The certificate chain or proxy settings on your device or your Bitwarden server may not be set up correctly. - Copy private key + 개인 키 복사 Login Credentials Autofill Options - Use this button to generate a new unique password. + 새로운 비밀번호를 생성하려면 탭하십시오. 1 OF 3 2 OF 3 You’ll only need to set up Authenticator Key for logins that require two-factor authentication with a code. The key will continuously generate six-digit codes you can use to log in. 3 OF 3 - You must add a web address to use autofill to access this account. - Learn about new logins - We’ll walk you through the key features to add a new login. - Explore the generator - Learn more about generating secure login credentials with a guided tour. + 이 계정에서 자동 완성을 사용하려면 웹 주소를 추가하십시오. + 새 로그인에 대해 알아보기 + 새 로그인을 추가할 때 사용하는 기능들을 안내해 드릴게요. + 생성기 둘러보기 + 안전한 로그인 비밀번호를 생성하는 방법에 대해 알아보세요. Import client certificate Enter the client certificate password and the desired alias for this certificate. Alias - Use the generator to create secure passwords, passphrases and usernames. + 생성기를 이용해 안전한 비밀번호, 암호와 사용자 이름을 생성하십시오. Passphrases are strong passwords that are often easier to remember and type than random passwords. They are helpful for logging into accounts where Autofill is not available, like a streaming service on your TV. - Unique usernames add an extra layer of security and can help prevent hackers from finding your accounts. + 고유한 사용자 이름은 보안을 강화하고 해커들이 당신의 계정을 찾아내는 것을 방지합니다. 1 OF 6 2 OF 6 3 OF 6 @@ -879,7 +879,7 @@ 5 OF 6 6 OF 6 Use these options to adjust your password to meet your account website’s requirements. - After you save your new password to Bitwarden, don’t forget to update it on your account website. + Bitwarden에 새 비밀번호를 저장한 후, 계정 페이지에서 비밀번호를 변경하십시오. Verify your identity Error loading certificate Certificate alias @@ -905,7 +905,7 @@ Credential operation failed because user is locked out. Credential operation failed because the selected item does not exist. Credential operation failed because user verification was cancelled. - Self-host server URL + 자체 호스트 서버 URL Use Brave autofill integration Chrome 자동 완성 연동 사용 Use Chrome Beta autofill integration @@ -927,12 +927,12 @@ Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. For details on what is and isn’t logged, visit the\nBitwarden help center. Logging duration - 1 hour + 1시간 8 hours 24 hours 1 week - Delete all - Share all + 모두 삭제 + 모두 공유 Unable to share Please try again or select a different log. The log file you are trying to share has been removed. @@ -960,7 +960,7 @@ This account will soon be deleted. Log in at %1$s to continue using Bitwarden. 파일 Send 보기 텍스트 Send 보기 - Delete Send + Send 삭제 Missing Send re-sync your vault 다이내믹 컬러 사용 다이내믹 컬러 사용? @@ -1121,7 +1121,7 @@ Exporting items… Export failed Passwords - Passkeys + 패스키 Why is this step required? Kdf update failed, active account not found. Please try again or contact us. An error occurred while trying to update your kdf settings. Please try again or contact us. @@ -1129,4 +1129,6 @@ Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-lt-rLT/strings.xml b/ui/src/main/res/values-lt-rLT/strings.xml index aefccddce4..f01b671de0 100644 --- a/ui/src/main/res/values-lt-rLT/strings.xml +++ b/ui/src/main/res/values-lt-rLT/strings.xml @@ -31,7 +31,7 @@ Neteisingas pagrindinis slaptažodis. Pabandykite dar kartą. Neteisingas PIN kodas. Pabandykite dar kartą. Paleisti - Log in + Prisijungti Prisijungti Atsijungti Ar tikrai norite atsijungti? @@ -123,10 +123,10 @@ New card There are no logins in your vault. There are no identities in your vault. - New identity + Nauja tapatybė There are no notes in your vault. New note - New item + Naujas elementas New SSH key There are no text Sends in your vault. There are no file Sends in your vault. @@ -145,7 +145,7 @@ Re-type master password (required) Ieškoti saugykloje Pasirinkti - Item details + Elemento informacija Elementas pridėtas Submitting… Syncing… @@ -204,7 +204,7 @@ Nuskaitymas vyks automatiškai. Nepasirinktas joks failas Nėra jokių priedų. Failo šaltinis - Maximum file size is 100 MB. + Didžiausias failo dydis yra 100 MB. Required. Maximum file size is 100 MB. Sužinoti daugiau API serverio nuoroda @@ -307,7 +307,7 @@ Nuskaitymas vyks automatiškai. Klaidingas el. pašto adresas. Kortelės Tapatybės - Identification + Identifikavimas Prisijungimai Saugūs įrašai Personal Details @@ -331,7 +331,7 @@ Nuskaitymas vyks automatiškai. Tipas Perkelti žemyn Perkelti aukštyn - Owner + Savininkas Aplankų nėra. %1$s perkelta į %2$s. Turite pasirinkti bent vieną kategoriją. @@ -462,7 +462,7 @@ Nuskaitymas vyks automatiškai. Pasirinktinai reikalauti slaptažodžio, kad vartotojai galėtų pasiekti šį siuntimą. Šalinti slaptažodį Pašalinamas slaptažodis - Password removed + Slaptažodis pašalintas Pridėti siuntinį Kopijuoti nuorodą Dalintis nuoroda @@ -580,7 +580,7 @@ pasirinkite Pridėti TOTP, kad raktas būtų saugiai išsaugotas Sugeneruoti naują vartotojo vardą Use your email provider’s subaddress capabilities Use your domain’s configured catch-all inbox. - Generate an email alias with an external forwarding service. + Sukurkite elektroninio pašto slapyvardį naudodami išorinę persiuntimo paslaugą. Prieinamumo paslaugos atskleidimas „Bitwarden“ naudoja pritaikymo neįgaliesiems paslaugą, kad ieškotų prisijungimo laukų programose ir svetainėse, tada nustato atitinkamus lauko ID, kad būtų įvestas vartotojo vardas ir slaptažodis, kai randama programos ar svetainės atitiktis. Mes nesaugome jokios informacijos, kurią mums teikia paslauga, ir nesistengiame valdyti jokių ekrano elementų, išskyrus teksto įvedimo kredencialus. Priimti @@ -596,7 +596,7 @@ Ar norite pereiti prie šios paskyros? Prisijunkite naudodami pagrindinį slaptažodį Pradėtas prisijungimas Į jūsų įrenginį išsiųstas pranešimas. - Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device. + Įsitikinkite, kad jūsų saugykla yra atrakinta ir piršto atspaudo frazė sutampa su kitais įrenginiais. Iš naujo siųsti pranešimą Peržiūrėkite visas prisijungimo parinktis Laukia prisijungimo užklausos @@ -633,7 +633,7 @@ Ar norite pereiti prie šios paskyros? Master password re-prompt help Admin approval requested Your request has been sent to your admin. - You will be notified once approved. + Jums bus pranešta, kai bus patvirtinta. Trouble logging in? Block autofill Autofill will not be offered for these URIs. @@ -645,7 +645,7 @@ Ar norite pereiti prie šios paskyros? The URI %1$s is already blocked Prisijungimas patvirtintas Log in with device must be set up in the settings of the Bitwarden app. Need another option? - Log in with device + Prisijunkite naudodami įrenginį Prisijungiama prie Logging in on: Vault @@ -678,7 +678,7 @@ Ar norite pereiti prie šios paskyros? Save passkey as new login Overwrite passkey? This item already contains a passkey. Are you sure you want to overwrite the current passkey? - Duo two-step login is required for your account. + Tavo paskyrai reikalingas Duo dviejų veiksmų prisijungimas. Follow the steps from Duo to finish logging in. Paleisti „Duo“ Your passkey will be saved to your Bitwarden vault for %1$s @@ -687,7 +687,7 @@ Ar norite pereiti prie šios paskyros? Passkey operation failed because browser signature does not match Passkey operation failed because of missing asset links Passkey operation failed because app could not be verified - Confirm file password + Patvirtinti failo slaptažodį File password Password Protected This password will be used to export and import this file @@ -706,7 +706,7 @@ Ar norite pereiti prie šios paskyros? Unsubscribe Check your email Open email app - Email verified + Patvirtintas el. paštas Get emails from Bitwarden for announcements, advice, and research opportunities. Unsubscribe at any time. Security, prioritized Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you. @@ -716,8 +716,8 @@ Ar norite pereiti prie šios paskyros? Use the generator to create and save strong, unique passwords for all your accounts. Your data, when and where you need it Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps. - Remove passkey - Passkey removed + Pašalinti slaptaraktį + Pašalintas slaptaraktis What makes a password strong? A secure, memorable password Account setup @@ -755,7 +755,7 @@ Ar norite pereiti prie šios paskyros? %d characters %d characters - Expired link + Nebegaliojanti nuoroda Please restart registration or try logging in. You may already have an account. Restart registration Authenticator Sync @@ -775,13 +775,13 @@ Ar norite pereiti prie šios paskyros? You can return to complete this step anytime in Settings. You can now explore everything Bitwarden has to offer and start managing your passwords securely. You’re all set! - Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance. - Master password hint + Klaida prijungiant su „Duo“ paslauga. Naudokite kitą dvigubo prisijungimo būdą arba susisiekite su „Duo“ dėl pagalbos. + Pagrindinio slaptažodžio užuomina New master password hint Get started Save and protect your data The vault protects more than just passwords. Store secure logins, IDs, cards and notes securely here. - New login + Naujas prisijungimas Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure. Send sensitive information, safely Import saved logins @@ -826,20 +826,20 @@ Ar norite pereiti prie šios paskyros? Bitwarden Tools Got it No logins were imported - Import error + Importavimo klaida Logins imported Remember to delete your imported password file from your computer SSH key Public key Private key SSH keys - Copy public key - Copy fingerprint + Kopijuoti viešą raktą + Kopijuoti piršto antspaudą Enable notifications Log in quickly and easily across devices Bitwarden can notify you each time you receive a new login request from another device. Skip for now - Done + Atlikta %1$s of %2$s Copy identity name Copy company @@ -862,7 +862,7 @@ Ar norite pereiti prie šios paskyros? Need some inspiration? Check out the passphrase generator We couldn’t verify the server’s certificate. The certificate chain or proxy settings on your device or your Bitwarden server may not be set up correctly. - Copy private key + Kopijuoti privatų raktą Login Credentials Autofill Options Use this button to generate a new unique password. @@ -936,7 +936,7 @@ Ar norite pereiti prie šios paskyros? Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. For details on what is and isn’t logged, visit the\nBitwarden help center. Logging duration - 1 hour + 1 valanda 8 hours 24 hours 1 week @@ -969,7 +969,7 @@ Ar norite pereiti prie šios paskyros? This account will soon be deleted. Log in at %1$s to continue using Bitwarden. View file Send View text Send - Delete Send + Ištrinti siuntinį Missing Send re-sync your vault Use dynamic colors Use dynamic colors? @@ -1147,4 +1147,6 @@ Ar norite pereiti prie šios paskyros? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-lv-rLV/strings.xml b/ui/src/main/res/values-lv-rLV/strings.xml index 704fb4d29f..c7f147b3a6 100644 --- a/ui/src/main/res/values-lv-rLV/strings.xml +++ b/ui/src/main/res/values-lv-rLV/strings.xml @@ -165,7 +165,7 @@ Glabātavā nav vienumu, kas atbilst \"%1$s\" Meklēt pieteikšanās vienumu vai pievienot jaunu Atspējots - The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. + Vieglākais veids, kā glabātavā pievienot jaunus pieteikšanās vienumus, ir ar Bitwarden automātiskās aizpildes pakalpojumu. Vairāk par Bitwarden automātisko aizpildi var uzzināt iestatījumu skatā. Automātiskā aizpilde Automātiski aizpildīt vai apskatīt šo vienumu? Meklēt @@ -173,7 +173,7 @@ Autentificētāja lietotne Jāievada 6 ciparu apliecinājuma kods no autentificētāja lietotnes. Jāievada 6 ciparu apliecinājuma kods, kas tika nosūtīts uz %1$s. - We don’t recognize this device. Enter the code sent to your email to verify your identity. + Mēs neatpazīstam šo ierīci. Jāievada kods, kas tika nosūtīts e-pastā, lai apliecinātu savu identitāti. Atkopes kods Atcerēties Atcerēties e-pasta adresi @@ -396,7 +396,7 @@ Nolasīšana notiks automātiski. Viens vai vairāki apvienības nosacījumi ietekmē veidotāja iestatījumus Šī pielikuma saglabāšanā radās sarežgījumi. Ja tie turpina pastāvēt, to var saglabāt tīmekļa glabātavā. Pielikums veiksmīgi saglabāts - Please turn on “Autofill Accessibility Service” from Bitwarden Settings to use the Autofill tile. + Lūgums iespējot \"Automātiskās aizpildes pieejamības pakalpojums\" Bitwarden iestatījumos, lai izmantotu automātiskās aizpildes laukumu. Paroļu lauki netika atrasti Sending to trash… Vienums tika pārvietots uz atkritni. @@ -740,7 +740,7 @@ Vai pārslēgties uz šo kontu? Uzzināt par veidiem, kā nepieļaut nepiekļūšanu kontam Palīdzība par servera ģeogrāfiskajām atrašanās vietām. E-pasta adrese (nepieciešama) - Select the link in the email to verify your email address and continue creating your account. + Jāatver e-pasta ziņojumā esošā saite, lai apliecininātu savu e-pasta adresi un turpinātu sava konta izveidi. Nomainīt e-pasta adresi Turpināt Bitwarden nevar atkopt pazaudētu vai aizmirstu galveno paroli. @@ -771,7 +771,7 @@ Vai pārslēgties uz šo kontu? Ieslēgt pārlūka automātiskās aizpildes iekļaušanu vēlāk? Pie šī soļa pabeigšanas var agriezties jebkurā brīdī iestatījumos. Tagad var izmantot automātisko aizpildi, lai pieteiktos lietotnēs un tīmekļvietnēs ar savām saglabātajām parolēm. Tagad ir izpētāms viss pārējais, kas ir Bitwarden piedāvājumā. - You’re all set! + Viss ir gatavs. Kļūda savienojuma izveidošanā ar Duo pakalpojumu. Jāizmanto cits divpakāpju pieteikšanās veids vai jāvēršas pie Duo pēc palīdzības. Galvenās paroles norāde Jaunā galvenās paroles norāde @@ -811,7 +811,7 @@ Vai pārslēgties uz šo kontu? Nepieciešama palīdzība? Ir vērts ieskatīties ievietošanas palīdzībā. Izgūtā datne jāsaglabā kaut kur viegli atrodamā vietā datorā. Šis nav atzīts Bitwarden serveris. Var būt nepieciešams vērsties pie nodrošinātāja, lai pārbaudītu, vai atjaunināt savu serveri. - Syncing logins… + Sinhronizē pieteikšanās vienumus... Lejupielādēt pārlūka paplašinājumu Jādodas uz bitwarden.com/download, lai iekļautu Bitwarden savā iecienītākajā pārlūkā, lai iegūtu nevainojamu pieredzi. Izmantot tīmekļa lietotni @@ -869,13 +869,13 @@ Vai pārslēgties uz šo kontu? 3. no 3 Jāpievieno tīmekļa adrese, lai izmantotu automātisko aizpildi, lai piekļūtu šim kontam. Uzzināt par jauniem pieteikšanās vienumiem - We’ll walk you through the key features to add a new login. + Mēs izrādīsim galvenās jaunu pieteikšanās vienumu pievienošanas iespējas. Izpētīt veidotāju Drošas pieteikšanās informācijas izveidošanas iepazīšana soli pa solim. Ievietot klienta sertifikātu Jāievada klienta sertifikāta parole un vēlamais aizstājvārds. Aizstājvārds - Use the generator to create secure passwords, passphrases and usernames. + Veidotājs ir izmantojams, lai izveidotu drošas paroles, paroļu vārdkopas un lietotājvārdus. Paroļu vārdkopas ir spēcīgas paroles, kuras bieži vien ir vieglāk atcerēties un rakstīt nekā nejaušas paroles. Tās ir noderīgas, lai pieteiktos kontos, kuros automātiskā aizpilde nav pieejama, piemēram, straumēšanas pakalpojumā tālrādī. Neatkārtojami lietotājvārdi pievieno papildu drošības slāni un var palīdzēt, lai traucētu urķiem kontu atrašanā. 1 NO 6 @@ -884,8 +884,8 @@ Vai pārslēgties uz šo kontu? 4 NO 6 5 NO 6 6 NO 6 - Use these options to adjust your password to meet your account website’s requirements. - After you save your new password to Bitwarden, don’t forget to update it on your account website. + Šīs iespējas ir izmantojamas, lai pielāgotu savas paroles atbilstību konta tīmekļvietnes prasībām. + Pēc savas jaunās paroles saglabāšanas Bitwarden nevajadzētu aizmirst par tās atjaunināšanu sava konta tīmekļvietnē. Apliecināt savu identitāti Kļūda sertifikāta ielādēšanā Sertifikāta aizstājvārds @@ -1138,7 +1138,9 @@ Vai pārslēgties uz šo kontu? KDF atjaunināšana neizdevās, netika atrasts konts. Lūgums mēģināt vēlreiz vai sazināties ar mums. KDF iestatījumu atjaunināšanas laikā atgadījās kļūda. Lūgums mēģināt vēlreiz vai sazināties ar mums. Ievietošanas pieprasījumu nevarēja apstrādāt. - Your vault may be empty, or importing some item types isn’t allowed for your account. - No items available to import - Select a different account + Glabātava var būt tukša vai kontam nav atļauta dažu vienumu veidu ievietošana. + Nav pieejams neviens ievietojams vienums + Atlasīt citu kontu + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-ml-rIN/strings.xml b/ui/src/main/res/values-ml-rIN/strings.xml index b63a4a5848..f11d897984 100644 --- a/ui/src/main/res/values-ml-rIN/strings.xml +++ b/ui/src/main/res/values-ml-rIN/strings.xml @@ -327,7 +327,7 @@ തരം താഴേക്കു നീക്കുക മുകളിലൊട്ടു നീക്കുക - Owner + ഉടമ പ്രദർശിപ്പിക്കാൻ കളക്ഷനുകൾ ഒന്നും ഇല്ല. %1$s %2$s-ലേക്ക് മാറ്റി നിങ്ങൾ ഒരു കളക്ഷനെങ്കിലും തിരഞ്ഞെടുക്കണം. @@ -721,7 +721,7 @@ Do you want to switch to this account? Set up later Set up unlock later? You can return to complete this step anytime from Account Security in Settings. - Confirm + സ്ഥിരീകരിക്കുക Set up biometrics or choose a PIN code to quickly access your vault and Autofill your logins. Never lose access to your vault The best way to make sure you can always access your vault is to set up safeguards from the start. @@ -930,7 +930,7 @@ Do you want to switch to this account? Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. For details on what is and isn’t logged, visit the\nBitwarden help center. Logging duration - 1 hour + 1 മണിക്കൂർ 8 hours 24 hours 1 week @@ -963,7 +963,7 @@ Do you want to switch to this account? This account will soon be deleted. Log in at %1$s to continue using Bitwarden. View file Send View text Send - Delete Send + Send ഇല്ലാതാക്കുക Missing Send re-sync your vault Use dynamic colors Use dynamic colors? @@ -1135,4 +1135,6 @@ Do you want to switch to this account? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-mr-rIN/strings.xml b/ui/src/main/res/values-mr-rIN/strings.xml index a3e47483e1..a05cb42fff 100644 --- a/ui/src/main/res/values-mr-rIN/strings.xml +++ b/ui/src/main/res/values-mr-rIN/strings.xml @@ -31,7 +31,7 @@ अवैध मुख्य पासवर्ड. पुनः प्रयत्न करा. अवैध पिन. पुनः प्रयत्न करा. उघडा - Log in + प्रवेश करा प्रवेश बाहेर पडा नक्की बाहेर पडायचे? @@ -61,7 +61,7 @@ पाठवा संकालन URI - Website (URI) + वेबसाइट (URI) Username The %1$s field is required. You must attach a file to save this send. @@ -186,7 +186,7 @@ Unable to download file. Downloading… This attachment is %1$s in size. Are you sure you want to download it onto your device? - Authenticator key + ऑथेंटिकेटर की Verification code (TOTP) Authenticator key added. Cannot read authenticator key. @@ -533,7 +533,7 @@ Scanning will happen automatically. Cannot add authenticator key? Scan QR Code QR कोड स्कॅन करा Cannot scan QR code? Enter key manually - Authenticator key + ऑथेंटिकेटर की Authenticator key help Enter key manually Add TOTP @@ -1135,4 +1135,6 @@ Do you want to switch to this account? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-my-rMM/strings.xml b/ui/src/main/res/values-my-rMM/strings.xml index 4dc5e16301..ac3129f57e 100644 --- a/ui/src/main/res/values-my-rMM/strings.xml +++ b/ui/src/main/res/values-my-rMM/strings.xml @@ -1129,4 +1129,6 @@ Do you want to switch to this account? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-nb-rNO/strings.xml b/ui/src/main/res/values-nb-rNO/strings.xml index b663e02aea..3669f8fbb7 100644 --- a/ui/src/main/res/values-nb-rNO/strings.xml +++ b/ui/src/main/res/values-nb-rNO/strings.xml @@ -164,7 +164,7 @@ There are no items in your vault that match “%1$s” Search for a login or add a new login Deaktivert - The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. + Den enkleste måten å legge til nye innlogginger i hvelvet ditt, er fra Bitwarden sin autofylltjeneste. Lær mer om å bruke Bitwarden sin autofylltjeneste ved å navigere til \"Innstillinger\". Auto-utfyll Vil du auto-utfylle eller vise denne gjenstanden? Søk @@ -394,7 +394,7 @@ Skanning skjer automatisk. En eller flere av organisasjonens vilkår påvirker generatorinnstillingene dine Det oppsto et problem med å lagre dette vedlegget. Hvis problemet vedvarer, kan du lagre det fra netthvelvet. Vedlegget ble lagret - Please turn on “Autofill Accessibility Service” from Bitwarden Settings to use the Autofill tile. + Aktiver \"Auto-utfyllingstjenester\" fra Bitwarden-innstillingene for å bruke auto-utfyllingsflisen. Ingen passordfelt oppdaget Sending to trash… Elementet ble sendt til papirkurven. @@ -768,7 +768,7 @@ Vil du bytte til denne kontoen? Turn on browser autofill integration later? You can return to complete this step anytime in Settings. You can now explore everything Bitwarden has to offer and start managing your passwords securely. - You’re all set! + Alt er klart for deg! Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance. Få et hint om hovedpassordet Nytt hint til hovedpassordet @@ -1135,4 +1135,6 @@ Vil du bytte til denne kontoen? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-ne-rNP/strings.xml b/ui/src/main/res/values-ne-rNP/strings.xml index 5ca26826fd..71b0ab2665 100644 --- a/ui/src/main/res/values-ne-rNP/strings.xml +++ b/ui/src/main/res/values-ne-rNP/strings.xml @@ -1,76 +1,76 @@ - About + बारेमा Add folder - Add Item + वस्तु थप्नुहोस् An error has occurred Apply - Back - Cancel - Copy - Copy password - Copy username - Delete + पछाडि + रद्द + प्रतिलिपि गर्नुहोस् + पासवर्ड प्रतिलिपि गर्नुहोस् + युजरनेम प्रतिलिपि गर्नुहोस् + मेट्नुहोस् Deleting… - Do you really want to delete? This cannot be undone. - Edit - Edit folder - Email - Email address + के तपाईं साँच्चै मेटाउन चाहनुहुन्छ? यसलाई पूर्ववत गर्न सकिँदैन। + सम्पादन गर्नुहोस् + फोल्डर सम्पादन गर्नुहोस् + इमेल + इमेल ठेगाना Enter your PIN code - Favorites - Folder - New folder created. - Folder deleted. - No Folder - Folders - Folder saved - Hide - Please connect to the internet before continuing. - Internet connection required - Invalid master password. Try again. - Invalid PIN. Try again. - Launch + मनपर्नेहरू + फोल्‍डर + नयाँ फोल्डर सिर्जना गरियो। + फोल्डर मेटाइयो। + कुनै फोल्डरमा हैन + फोल्डरहरू + फोल्डर सेभ गरियो + लुकाउनुहोस् + कृपया जारी राख्नु अघि इन्टरनेटमा जडान गर्नुहोस्। + इन्टरनेट जडान आवश्यक छ + अवैध मास्टर पासवर्ड। फेरि प्रयास गर्नुहोस्। + अवैध PIN। फेरि प्रयास गर्नुहोस्। + वेबसाइटमा जानुहोस् Log in - Login - Log out - Are you sure you want to log out? - Remove account - Are you sure you want to remove this account? - Account already added - Would you like to switch to it now? - Master password + लग इन + लग आउट + के तपाईं लग आउट गर्न निश्चित हुनुहुन्छ? + खाता हटाउनुहोस् + के तपाईं यो खाता हटाउन निश्चित हुनुहुन्छ? + खाता पहिले नै थपिएको छ। + के तपाईं अहिले यसमा स्विच गर्न चाहनुहुन्छ? + मास्टर पासवर्ड Master password (required) New master password (required) - More - My vault - Name + थप + मेरो भल्ट + नाम Item name (required) Send name (required) - No - Notes + होइन + टिपोट Private notes Okay - Password - Save - Move + पासवर्ड + सेभ + सार्नुहोस् Saving… - Settings - Show - Item deleted - Submit - Sync + सेटिंग्स + देखाउनुहोस् + वस्तु हटाइयो + पेश गर्नुहोस् + सिंक गर्नुहोस् URI Website (URI) - Username + युजरनेम The %1$s field is required. You must attach a file to save this send. %1$s copied - Verify master password - Verify PIN - View - Yes - Account + मास्टर पासवर्ड प्रमाणित गर्नुहोस् + PIN प्रमाणित गर्नुहोस्‌ + हेर्नुहोस् + हाे + खाता Your new account has been created! Set Bitwarden as your passkey provider in device settings. Avoid ambiguous characters @@ -223,7 +223,7 @@ Scanning will happen automatically. Security code Card Identity - Login + लग इन Secure note Address 1 Address 2 @@ -1027,7 +1027,7 @@ Do you want to switch to this account? Data exported successfully Security Too many failed biometrics attempts. - Version + संस्करण Learn more about how to use Bitwarden Authenticator on the Help Center. Key Create Verification code @@ -1135,4 +1135,6 @@ Do you want to switch to this account? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-nl-rNL/strings.xml b/ui/src/main/res/values-nl-rNL/strings.xml index bc487687e1..08a0ef931b 100644 --- a/ui/src/main/res/values-nl-rNL/strings.xml +++ b/ui/src/main/res/values-nl-rNL/strings.xml @@ -164,7 +164,7 @@ Er zijn geen items in je kluis die overeenkomen met \"%1$s\" Zoeken naar een login of een login toevoegen Uitgeschakeld - The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. + De makkelijkste manier om nieuwe logins toe te voegen aan je kluis is via de Bitwarden Automatisch invullen dienst. Leer meer over het gebruik van de Bitwarden Automatisch invullen dienst door naar het scherm \"Instellingen\" te gaan. Automatisch invullen Wilt je dit item automatisch invullen of bekijken? Zoeken @@ -172,7 +172,7 @@ Authenticatie-app Voer de 6-cijferige verificatiecode uit je authenticatie-app in. Voer de 6-cijferige verificatiecode in die via e-mail is verstuurd naar %1$s. - We don’t recognize this device. Enter the code sent to your email to verify your identity. + We herkennen dit apparaat niet. Voer de code in die naar je e-mail is verzonden om je identiteit te verifiëren. Herstelcode Onthouden E-mailadres onthouden @@ -394,7 +394,7 @@ Het scannen gebeurt automatisch. Een of meer organisatiebeleidseisen heeft invloed op de instellingen van je generator. Er ging iets mis met het bewaren van deze bijlage. Als het probleem aanhoudt, kun je het bewaren via de webkluis. Bijlage succesvol opgeslagen - Please turn on “Autofill Accessibility Service” from Bitwarden Settings to use the Autofill tile. + Zet \"Automatisch invullen toegankelijkheidsservice\" aan bij Bitwarden Instellingen om de Autofill tegel te gebruiken. Geen wachtwoordvelden gevonden Sending to trash… Item verplaatst naar de prullenbak. @@ -738,7 +738,7 @@ Wilt u naar dit account wisselen? Lees meer over manieren om te voorkomen dat je wordt buitengesloten van je account Ondersteuning met servergeolocaties. E-mailadres (verplicht) - Select the link in the email to verify your email address and continue creating your account. + Gebruik de link in het e-mailbericht om je e-mailadres te verifiëren en door te gaan met het aanmaken van je account. E-mailadres aanpassen Volgende Bitwarden kan een verloren of vergeten hoofdwachtwoord niet herstellen. @@ -768,7 +768,7 @@ Wilt u naar dit account wisselen? Automatisch aanvullen in browser later inschakelen? Je kunt deze stap op ieder moment afronden via Instellingen. Je kunt nu automatisch invullen om in te loggen op apps en websites met je opgeslagen wachtwoorden. Nu kun je alles ontdekken wat Bitwarden te bieden heeft. - You’re all set! + Je bent helemaal klaar! Fout bij het verbinden met de Duo-service. Gebruik een andere tweestapsaanmeldingsmethode of neem contact op met Duo voor hulp. Hoofdwachtwoordhint Nieuwe hoofdwachtwoordhint @@ -808,7 +808,7 @@ Wilt u naar dit account wisselen? Hulp nodig? Bekijk importhulp. Sla het geëxporteerde bestand ergens op je computer waar je deze gemakkelijk kunt vinden. Dit is geen herkende Bitwarden-server. Je moet mogelijk controleren met je provider of je server bijwerken. - Syncing logins… + Inloggegevens synchroniseren... Browserextensie downloaden Ga naar bitwarden.com/download om Bitwarden in je favoriete browser te integreren voor een naadloze werking. Webapp gebruiken @@ -866,13 +866,13 @@ Wilt u naar dit account wisselen? 3 VAN 3 Je moet een webadres toevoegen om auto-invullen te gebruiken om toegang te krijgen tot dit account. Meer informatie over nieuwe logins - We’ll walk you through the key features to add a new login. + We doorlopen de belangrijkste functies voor het toevoegen van een nieuwe login. Ontdek de generator Leer meer over het genereren van veilige logingegevens met een begeleide tour. Clientcertificaat importeren Voer het wachtwoord van het clientcertificaat en de gewenste alias voor dit certificaat in. Alias - Use the generator to create secure passwords, passphrases and usernames. + Gebruik de generator om sterke wachtwoorden, wachtwoordzinnen en gebruikersnamen te genereren. Wachtwoordzinnen zijn sterke wachtwoorden die vaak makkelijker zijn te onthouden en typen dan willekeurige wachtwoorden. Ze helpen om in te loggen op accounts waar auto-invullen niet beschikbaar is, zoals een streaming-service op je TV. Unieke gebruikersnamen voegen een extra beveiligingslaag toe en helpen te voorkomen dat hackers je accounts vinden. 1 VAN 6 @@ -881,8 +881,8 @@ Wilt u naar dit account wisselen? 4 VAN 6 5 VAN 6 6 VAN 6 - Use these options to adjust your password to meet your account website’s requirements. - After you save your new password to Bitwarden, don’t forget to update it on your account website. + Gebruik deze opties om je wachtwoord aan de vereisten van je websiteaccount aan te passen. + Vergeet je wachtwoord niet bij te werken op de website van je account nadat je je nieuwe wachtwoord in Bitwarden hebt opgeslagen. Verifieer je identiteit Fout bij laden van certificaat Certificaatalias @@ -1132,7 +1132,9 @@ Wilt u naar dit account wisselen? Kdf update mislukt, actief account niet gevonden. Probeer het opnieuw of neem contact met ons op. Er is een fout opgetreden tijdens het bijwerken van de kdf-instellingen. Probeer het opnieuw of neem contact met ons op. Het importverzoek kon niet worden verwerkt. - Your vault may be empty, or importing some item types isn’t allowed for your account. - No items available to import - Select a different account + Je kluis is mogelijk leeg of het importeren van sommige itemtypen is niet toegestaan voor je account. + Geen items beschikbaar om te importeren + Een ander account selecteren + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-nn-rNO/strings.xml b/ui/src/main/res/values-nn-rNO/strings.xml index 34785618fd..05009c4307 100644 --- a/ui/src/main/res/values-nn-rNO/strings.xml +++ b/ui/src/main/res/values-nn-rNO/strings.xml @@ -31,7 +31,7 @@ Ugild hovudpassord. Freista om att. Ugild PIN-kode. Freista om att. Opna - Log in + Logg inn Innskriving Skriv deg ut Er du trygg på at du vil skriva deg ut? @@ -41,7 +41,7 @@ Vil du byta til det no? Hovudpassord Master password (required) - New master password (required) + Nytt hovudpassord (påkravt) Meir Kvelvet mitt Namn @@ -81,11 +81,11 @@ Oppretta konto Create an account Rediger oppføringa - Edit login - Edit card - Edit identity - Edit note - Edit SSH key + Rediger innlogging + Rediger kort + Rediger identitet + Rediger notat + Rediger SSH-nøkkel Skriv inn e-postadressa til kontoen din for å få vinket til hovudpassordet ditt. Favoritt Fjern frå favorittar @@ -125,7 +125,7 @@ Det er ingen notat i kvelvet ditt. Nytt notat Ny oppføring - New SSH key + Ny SSH-nøkkel Det er ingen tekst-Sendar i kvelvet ditt. Det er ingen fil-Sendar i kvelvet ditt. There are no SSH keys in your vault. @@ -143,7 +143,7 @@ Re-type master password (required) Leita i kvelvet Vel - Item details + Elementdetaljar Oppføringa er retta. Submitting… Syncing… @@ -152,11 +152,11 @@ Unlock with Biometrics Lås opp med PIN-kode Stadfestingskode - View login - View card - View identity - View note - View SSH key + Syn innlogging + Syn kort + Syn identitet + Syn notat + Syn SSH-nøkkel Bitwarden nettkvelv Oppføringar Oppføringar for %1$s @@ -305,7 +305,7 @@ Skanning skjer automatisk. Ugild e-postadresse. Kort Identitetar - Identification + Identifikasjon Innskrivingar Trygge notat Personal Details @@ -327,7 +327,7 @@ Skanning skjer automatisk. Slag Flytta ned Flytta opp - Owner + Eigar There are no collections to list. %1$s er flytta til %2$s. You must select at least one collection. @@ -467,8 +467,8 @@ Skanning skjer automatisk. Rediger Send Edit file Send Edit text Send - New file Send - New text Send + Ny fil-Send + Ny tekst-Send Er du trygg på at du vil sletta denne Send-en? Send-en er vorten fjerna. Send updated @@ -602,7 +602,7 @@ Do you want to switch to this account? Enable camera permission to use the scanner Language The language has been changed to %1$s. Please restart the app to see the change - Default (System) + Standard (System) Weak Master Password Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password? Weak @@ -617,7 +617,7 @@ Do you want to switch to this account? Self-hosted Region Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour. - Current master password (required) + Noverande hovudpassord (påkravd) Approve with my other device Request admin approval Approve with master password @@ -658,7 +658,7 @@ Do you want to switch to this account? Choose how your autofill suggestions will appear when you sign in to other apps on your device. Additional options Continue to web app? - Continue to %1$s? + Fortsetje til %1$s? Continue to Help center? Fortset til personvernerklæringa? Continue to device Settings? @@ -721,7 +721,7 @@ Do you want to switch to this account? Set up later Set up unlock later? You can return to complete this step anytime from Account Security in Settings. - Confirm + Stadfesta Set up biometrics or choose a PIN code to quickly access your vault and Autofill your logins. Never lose access to your vault The best way to make sure you can always access your vault is to set up safeguards from the start. @@ -753,7 +753,7 @@ Do you want to switch to this account? Please restart registration or try logging in. You may already have an account. Restart registration Authenticator Sync - Allow authenticator syncing + Tillat autentiseringssynkronisering Det oppstod eit problem under validering av registreringsnøkkelen. Turn on autofill Autofill setup @@ -771,11 +771,11 @@ Do you want to switch to this account? You’re all set! Feil under tilkopling til Duo-tenesta. Bruk ein annan 2-trinnsinnloggingsmetode eller kontakt Duo for assistanse. Master password hint - New master password hint + Nytt hovudpassordhint Get started Save and protect your data The vault protects more than just passwords. Store secure logins, IDs, cards and notes securely here. - New login + Ny innlogging Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure. Send sensitive information, safely Import saved logins @@ -801,7 +801,7 @@ Do you want to switch to this account? Step 2 of 3 Log in to Bitwarden Step 3 of 3 - Import logins to Bitwarden + Importer innloggingar til Bitwarden In the Bitwarden navigation, find the Tools option and select Import data. Fill out the form and import your saved password file. For your security, be sure to delete your saved password file. @@ -823,12 +823,12 @@ Do you want to switch to this account? Import error Logins imported Remember to delete your imported password file from your computer - SSH key - Public key - Private key - SSH keys - Copy public key - Copy fingerprint + SSH-nøkkel + Offentleg nøkkel + Privat nøkkel + SSH-nøklar + Kopier offentleg nøkkel + Kopier fingeravtrykk Enable notifications Log in quickly and easily across devices Bitwarden can notify you each time you receive a new login request from another device. @@ -856,7 +856,7 @@ Do you want to switch to this account? Treng du inspirasjon? Sjekk ut passordfrase-generatoren We couldn’t verify the server’s certificate. The certificate chain or proxy settings on your device or your Bitwarden server may not be set up correctly. - Copy private key + Kopier privat nøkkel Login Credentials Autofill Options Use this button to generate a new unique password. @@ -872,17 +872,17 @@ Do you want to switch to this account? Import client certificate Enter the client certificate password and the desired alias for this certificate. Alias - Use the generator to create secure passwords, passphrases and usernames. + Bruk generatoren til å opprette sikre passord, passordfraser og brukarnamn. Passphrases are strong passwords that are often easier to remember and type than random passwords. They are helpful for logging into accounts where Autofill is not available, like a streaming service on your TV. - Unique usernames add an extra layer of security and can help prevent hackers from finding your accounts. + Unike brukarnamn legg til eit ekstra lag sikkerheit og kan bidra til å hindre at hackarar finn kontoane dine. 1 OF 6 2 OF 6 3 OF 6 4 AV 6 5 AV 6 6 AV 6 - Use these options to adjust your password to meet your account website’s requirements. - After you save your new password to Bitwarden, don’t forget to update it on your account website. + Bruk desse innstillingane for å justere passordet ditt til kontoen sine krav. + Etter at du har lagra det nye passordet ditt til Bitwarden, ikkje gløym å oppdatere det på konto-nettsida di. Verify your identity Error loading certificate Certificate alias @@ -920,29 +920,29 @@ Do you want to switch to this account? Del feildetaljar Flight recorder Flight recorder help - View recorded logs + Vis registrerte loggar Enable flight recorder - Recorded logs - No logs recorded + Registrerte loggar + Ingen loggar registrert Experiencing an issue? Enable temporary logging to collect and inspect logs locally. When enabled, application states and network calls may be logged—never sensitive vault information. To get started, set a logging duration. Logging 
will automatically turn off after this period, giving you time to capture activity while reproducing 
any issues. Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. For details on what is and isn’t logged, visit the\nBitwarden help center. Logging duration - 1 hour + 1 time 8 hours 24 hours 1 week - Delete all - Share all + Slett alle + Del alle Unable to share Please try again or select a different log. The log file you are trying to share has been removed. Delete log - Do you really want to delete this log? + Vil du verkeleg slette denne oppføringa? Delete logs - Do you really want to delete all recorded logs? + Vil du verkeleg slette alle oppføringane? Confirm Key Connector domain Key Connector domain: Organization: @@ -1127,7 +1127,7 @@ Do you want to switch to this account? Exporting items… Export failed Passwords - Passkeys + Passnøklar Why is this step required? Kdf update failed, active account not found. Please try again or contact us. An error occurred while trying to update your kdf settings. Please try again or contact us. @@ -1135,4 +1135,6 @@ Do you want to switch to this account? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-or-rIN/strings.xml b/ui/src/main/res/values-or-rIN/strings.xml index a813a419fd..db82793ec5 100644 --- a/ui/src/main/res/values-or-rIN/strings.xml +++ b/ui/src/main/res/values-or-rIN/strings.xml @@ -1135,4 +1135,6 @@ Do you want to switch to this account? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-pl-rPL/strings.xml b/ui/src/main/res/values-pl-rPL/strings.xml index 0196d11bd6..114d383da8 100644 --- a/ui/src/main/res/values-pl-rPL/strings.xml +++ b/ui/src/main/res/values-pl-rPL/strings.xml @@ -1122,8 +1122,8 @@ Czy chcesz przełączyć się na to konto? Zaimportowano %1$d elementów do sejfu. Włącz autouzupełnianie w przeglądarce, aby uzupełniać hasła - Your browser has recently updated, which has disabled Bitwarden autofill. To continue filling your passwords with Bitwarden, enable browser autofill in autofill settings. - Your browsers have recently updated, which has disabled Bitwarden autofill. To continue filling your passwords with Bitwarden, enable browser autofill for all installed browsers in autofill settings. + Twoja przeglądarka została zaktualizowana, co spowodowało wyłączenie autouzupełniania Bitwarden. Aby nadal uzupełniać hasła za pomocą Bitwarden, włącz autouzupełnianie w przeglądarce. + Twoje przeglądarki zostały zaktualizowane, co spowodowało wyłączenie autouzupełniania Bitwarden. Aby nadal uzupełniać hasła za pomocą Bitwarden, włącz autouzupełnianie we wszystkich przeglądarkach. Nie teraz Importuj z Bitwarden Wybierz konto @@ -1143,7 +1143,9 @@ Czy chcesz przełączyć się na to konto? Aktualizacja ustawień KDF nie powiodła się. Nie znaleziono aktywnego konta. Spróbuj ponownie lub skontaktuj się z nami. Wystąpił błąd podczas aktualizowania ustawień KDF. Spróbuj ponownie lub skontaktuj się z nami. Importowanie nie mogło zostać przetworzone. - Your vault may be empty, or importing some item types isn’t allowed for your account. - No items available to import - Select a different account + Twój sejf może być pusty lub importowanie niektórych rodzajów elementów nie jest dozwolone. + Brak dostępnych elementów do zaimportowania + Wybierz inne konto + Zweryfikuj adres e-mail konta + Wpisz 6-cyfrowy kod wysłany na poniższy adres e-mail diff --git a/ui/src/main/res/values-pt-rBR/strings.xml b/ui/src/main/res/values-pt-rBR/strings.xml index c6a83c5017..22724d759a 100644 --- a/ui/src/main/res/values-pt-rBR/strings.xml +++ b/ui/src/main/res/values-pt-rBR/strings.xml @@ -914,7 +914,7 @@ Você deseja mudar para esta conta? Usar integração com o preenchimento automático do Chrome Beta Melhora o preenchimento de credenciais para sites suportados em navegadores selecionados. Assim que ativado, você será direcionado para as configurações do navegador para ativar o preenchimento automático de terceiros. Mostrar mais - Nenhuma pasta + Sem pasta Mostrar menos Adicionar campo Compartilhar detalhes do erro @@ -1134,7 +1134,9 @@ quaisquer problema. Falha na atualização da KDF, conta ativa não encontrada. Tente novamente ou entre em contato conosco. Ocorreu um erro ao tentar atualizar as suas configurações da KDF. Tente novamente ou entre em contato conosco. A solicitação de importação não pôde ser processada. - Your vault may be empty, or importing some item types isn’t allowed for your account. - No items available to import - Select a different account + Seu cofre está vazio, ou não é permitido importar certos tipos de itens na sua conta. + Nenhum item disponível para importar + Selecione uma conta diferente + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-pt-rPT/strings.xml b/ui/src/main/res/values-pt-rPT/strings.xml index 2cbb289b95..ffb23bc2a9 100644 --- a/ui/src/main/res/values-pt-rPT/strings.xml +++ b/ui/src/main/res/values-pt-rPT/strings.xml @@ -1135,4 +1135,6 @@ Pretende mudar para esta conta? O seu cofre pode estar vazio ou a importação de alguns tipos de itens pode não ser permitida para a sua conta. Não há itens disponíveis para importar Selecione uma conta diferente + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-ro-rRO/strings.xml b/ui/src/main/res/values-ro-rRO/strings.xml index 2b66164fa1..56163d1a07 100644 --- a/ui/src/main/res/values-ro-rRO/strings.xml +++ b/ui/src/main/res/values-ro-rRO/strings.xml @@ -61,7 +61,7 @@ Trimitere Sincronizare URI - Website (URI) + Site web (URI) Nume utilizator Câmpul %1$s este necesar. You must attach a file to save this send. @@ -125,7 +125,7 @@ New identity There are no notes in your vault. New note - New item + Element nou New SSH key There are no text Sends in your vault. There are no file Sends in your vault. @@ -173,7 +173,7 @@ Aplicația Autentificator Introducere cod de verificare din 6 cifre din aplicația de autentificare. Introducere cod de verificare din 6 cifre, care a fost trimis prin e-mail la %1$s. - We don’t recognize this device. Enter the code sent to your email to verify your identity. + Dispozitiv nerecunoscut. Introdu codul trimis pe email pentru a verifica identitatea. Cod de recuperare Remember Remember email @@ -288,7 +288,7 @@ Scanarea se va face automat. Ce tip de câmp particularizat doriți să adăugați? Ștergere URI nou - Add website + Adăugare site Domeniu de bază Default (%1$s) Exact @@ -306,7 +306,7 @@ Scanarea se va face automat. Adresă de e-mail greșită. Carduri Identități - Identification + Identificare Conectări Note securizate Personal Details @@ -329,7 +329,7 @@ Scanarea se va face automat. Tip Mutare în jos Mutare în sus - Owner + Proprietar Nu există colecții de afișat. %1$s s-a mutat la %2$s. Trebuie să selectați cel puțin o colecție. @@ -460,7 +460,7 @@ Scanarea se va face automat. Opțional, este necesară o parolă pentru ca utilizatorii să acceseze acest Send. Eliminare parolă Se elimină parola - Password removed + Parolă eliminată Adăugați un Send Copiere link Partajare link @@ -686,9 +686,9 @@ Doriți să comutați la acest cont? Operațiunea cheie de acces a eșuat din cauza lipsei legăturilor activelor Operațiunea cheie de acces a eșuat deoarece aplicația nu a putut fi verificată Confirmați parola fișierului - File password + Parola fișierului Password Protected - This password will be used to export and import this file + Această parolă se va folosi pentru exportul și importul acestui fișier Sugestie autocompletare Continue to complete WebAuthn verification. Lansare WebAuthn @@ -714,8 +714,8 @@ Doriți să comutați la acest cont? Use the generator to create and save strong, unique passwords for all your accounts. Your data, when and where you need it Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps. - Remove passkey - Passkey removed + Înlăturare parolă + Parolă eliminată Ce face o parolă puternică? A secure, memorable password Configurare cont @@ -754,7 +754,7 @@ Doriți să comutați la acest cont? Link expirat Please restart registration or try logging in. You may already have an account. - Restart registration + Reporniți înregistrarea Authenticator Sync Allow authenticator syncing There was an issue validating the registration token. @@ -773,12 +773,12 @@ Doriți să comutați la acest cont? You can now explore everything Bitwarden has to offer and start managing your passwords securely. You’re all set! Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance. - Master password hint + Indiciu pentru parola principală New master password hint Get started Save and protect your data The vault protects more than just passwords. Store secure logins, IDs, cards and notes securely here. - New login + Autentificare nouă Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure. Send sensitive information, safely Import saved logins @@ -821,22 +821,22 @@ Doriți să comutați la acest cont? Import Successful! Manage your logins from anywhere with Bitwarden tools for web and desktop. Bitwarden Tools - Got it + Am înțeles No logins were imported - Import error + Eroare de importare Logins imported Remember to delete your imported password file from your computer - SSH key + Cheie SSH Public key Private key SSH keys - Copy public key - Copy fingerprint + Copiază cheia de siguranța publică + Copiați amprenta Enable notifications Log in quickly and easily across devices Bitwarden can notify you each time you receive a new login request from another device. Skip for now - Done + Făcut %1$s of %2$s Copy identity name Copy company @@ -859,7 +859,7 @@ Doriți să comutați la acest cont? Need some inspiration? Check out the passphrase generator We couldn’t verify the server’s certificate. The certificate chain or proxy settings on your device or your Bitwarden server may not be set up correctly. - Copy private key + Copiază cheia de siguranța privată Login Credentials Autofill Options Use this button to generate a new unique password. @@ -886,7 +886,7 @@ Doriți să comutați la acest cont? 6 OF 6 Use these options to adjust your password to meet your account website’s requirements. After you save your new password to Bitwarden, don’t forget to update it on your account website. - Verify your identity + Verificați- vă identitatea Error loading certificate Certificate alias Import certificate @@ -933,7 +933,7 @@ Doriți să comutați la acest cont? Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. For details on what is and isn’t logged, visit the\nBitwarden help center. Logging duration - 1 hour + 1 oră 8 hours 24 hours 1 week @@ -966,7 +966,7 @@ Doriți să comutați la acest cont? This account will soon be deleted. Log in at %1$s to continue using Bitwarden. View file Send View text Send - Delete Send + Ștergere Send Missing Send re-sync your vault Use dynamic colors Use dynamic colors? @@ -1132,8 +1132,8 @@ Doriți să comutați la acest cont? Items to import Exporting items… Export failed - Passwords - Passkeys + Parole + Chei de acces Why is this step required? Kdf update failed, active account not found. Please try again or contact us. An error occurred while trying to update your kdf settings. Please try again or contact us. @@ -1141,4 +1141,6 @@ Doriți să comutați la acest cont? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-ru-rRU/strings.xml b/ui/src/main/res/values-ru-rRU/strings.xml index 3ac17ddda1..09b70dd7c1 100644 --- a/ui/src/main/res/values-ru-rRU/strings.xml +++ b/ui/src/main/res/values-ru-rRU/strings.xml @@ -166,7 +166,7 @@ В вашем хранилище нет элементов, совпадающих с \"%1$s\" Поиск или добавление нового логина Отключено - The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. + Самый простой способ добавить новые логины в ваше хранилище – это служба автозаполнения Bitwarden. Дополнительные сведения об использовании службы автозаполнения Bitwarden в разделе \'Настройки\'. Автозаполнение Выполнить автозаполнение или просмотреть этот элемент? Поиск @@ -174,7 +174,7 @@ Приложение-аутентификатор Введите 6-значный код подтверждения из вашего приложения-аутентификатора. Введите 6-значный код подтверждения, который был отправлен на %1$s. - We don’t recognize this device. Enter the code sent to your email to verify your identity. + Мы не распознали это устройство. Введите код, отправленный на ваш email, чтобы подтвердить вашу личность. Код восстановления Запомнить Запомнить email @@ -398,7 +398,7 @@ На настройки генератора влияют одна или несколько политик организации Возникла проблема с сохранением этого вложения. Если проблема не исчезнет, вы можете сохранить его из веб-хранилища. Вложение успешно сохранено - Please turn on “Autofill Accessibility Service” from Bitwarden Settings to use the Autofill tile. + Пожалуйста, включите службу специальных возможностей автозаполнения в настройках Bitwarden для использования панели автозаполнения. Полей ввода пароля не обнаружено Sending to trash… Элемент отправлен в корзину. @@ -742,7 +742,7 @@ Узнайте о способах предотвращения блокировки аккаунта Справка по геолокации сервера. Email (обязательно) - Select the link in the email to verify your email address and continue creating your account. + Кликните ссылку в письме, чтобы подтвердить свой адрес email и продолжить создание у аккаунта. Изменить адрес email Далее Bitwarden не может восстановить утерянный или забытый мастер-пароль. @@ -774,7 +774,7 @@ Включить интеграцию с автозаполнением браузера позже? Вы можете вернуться к выполнению этого шага в любое время в Настройках. Теперь вы можете изучить все возможности Bitwarden и начать безопасно управлять своими паролями. - You’re all set! + Все готово! Ошибка при подключении к сервису Duo. Используйте другой метод двухэтапной аутентификации или обратитесь за помощью в Duo. Подсказка к мастер-паролю Новая подсказка к мастер-паролю @@ -814,7 +814,7 @@ Нужна помощь? Ознакомьтесь с помощью по импорту. Сохраните экспортированный файл на компьютере, где его можно будет легко найти. Этот сервер Bitwarden не распознан. Возможно вам следует связаться с провайдером или изменить свой сервер. - Syncing logins… + Синхронизация логинов... Скачать расширение браузера Перейдите на bitwarden.com/download для интеграции Bitwarden в ваш любимый браузер для удобной работы. Использовать веб-приложение @@ -872,13 +872,13 @@ 3 ИЗ 3 Вы должны добавить веб-адрес, чтобы использовать автозаполнение для доступа к этому аккаунту. Узнайте о новых логинах - We’ll walk you through the key features to add a new login. + Мы расскажем вам о ключевых функциях добавления нового логина. Исследуйте генератор Узнайте больше о создании надежных учетных данных, просмотрев гид. Импорт клиентского сертификата Введите пароль клиентского сертификата и его название. Название - Use the generator to create secure passwords, passphrases and usernames. + Используйте генератор для создания надежных паролей, парольных фраз и имен пользователей. Парольные фразы - это надежные пароли, которые зачастую легче запомнить и ввести, чем случайные пароли. Они полезны для входа в аккаунты, в которых автозаполнение недоступно, например в стриминговый сервис на телевизоре. Уникальные имена пользователей обеспечивают дополнительный уровень безопасности и могут предотвратить поиск ваших аккаунтов хакерами. 1 ИЗ 6 @@ -887,8 +887,8 @@ 4 ИЗ 6 5 ИЗ 6 6 ИЗ 6 - Use these options to adjust your password to meet your account website’s requirements. - After you save your new password to Bitwarden, don’t forget to update it on your account website. + Используйте эти параметры, чтобы настроить пароль в соответствии с требованиями сайтов для вашего аккаунта. + После того как вы сохраните новый пароль в Bitwarden, не забудьте обновить его на сайте вашего аккаунта. Подтвердите вашу личность Ошибка загрузки сертификата Псевдоним сертификата @@ -1144,7 +1144,9 @@ Ошибка обновления Kdf, активный аккаунт не найден. Пожалуйста, попробуйте еще раз или свяжитесь с нами. При попытке обновить настройки kdf произошла ошибка. Пожалуйста, повторите попытку или свяжитесь с нами. Запрос на импорт не может быть обработан. - Your vault may be empty, or importing some item types isn’t allowed for your account. - No items available to import - Select a different account + Возможно, ваше хранилище пусто, или импорт некоторых типов элементов запрещен для вашего аккаунта. + Нет элементов, доступных для импорта + Выберите другой аккаунт + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-si-rLK/strings.xml b/ui/src/main/res/values-si-rLK/strings.xml index 82ed827b3b..2de5773875 100644 --- a/ui/src/main/res/values-si-rLK/strings.xml +++ b/ui/src/main/res/values-si-rLK/strings.xml @@ -440,7 +440,7 @@ Scanning will happen automatically. Text to share Text When accessing the Send, hide the text by default - File + ගොනුව Deletion date Deletion time The Send will be permanently deleted on the specified date and time. @@ -930,7 +930,7 @@ Do you want to switch to this account? Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. For details on what is and isn’t logged, visit the\nBitwarden help center. Logging duration - 1 hour + පැය 1 8 hours 24 hours 1 week @@ -963,7 +963,7 @@ Do you want to switch to this account? This account will soon be deleted. Log in at %1$s to continue using Bitwarden. View file Send View text Send - Delete Send + යවන්න මකන්න Missing Send re-sync your vault Use dynamic colors Use dynamic colors? @@ -1135,4 +1135,6 @@ Do you want to switch to this account? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-sk-rSK/strings.xml b/ui/src/main/res/values-sk-rSK/strings.xml index 6ccbbd0079..d8063d6f06 100644 --- a/ui/src/main/res/values-sk-rSK/strings.xml +++ b/ui/src/main/res/values-sk-rSK/strings.xml @@ -166,7 +166,7 @@ Vo vašom trezore nie sú žiadne položky, ktoré zodpovedajú \"%1$s\" Vyhľadať alebo pridať nové prihlasovacie údaje Vypnuté - The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. + Najjednoduchší spôsob, ako pridať nové prihlasovacie údaje do vášho trezora, je prostredníctvom služby automatického vypĺňania Bitwardenu. Ďalšie informácie o používaní automatického vypĺňania Bitwardenu získate prechodom do obrazovky Nastavení. Automatické vypĺňanie Chcete automaticky vyplniť alebo zobraziť toto prihlásenie? Hladať @@ -174,7 +174,7 @@ Overovacia aplikácia Zadajte 6-miestny verifikačný kód z vašej overovacej aplikácie. Zadajte 6-miestny verifikačný kód, ktorý bol zaslaný e-mailom na %1$s. - We don’t recognize this device. Enter the code sent to your email to verify your identity. + Toto zariadenie nepoznáme. Na overenie vašej totožnosti zadajte kód, ktorý bol zaslaný na váš e-mail. Záchranný kód Zapamätať si Zapamätať si e-mail @@ -398,7 +398,7 @@ Skenovanie prebehne automaticky. Jedno alebo viac nastavení organizácie ovplyvňujú vaše nastavenia generátora Nastal problem pri ukladaní prílohy. Ak problém pretrváva, môžete je uložiť z Webového trezora. Príloha úspešne uložená - Please turn on “Autofill Accessibility Service” from Bitwarden Settings to use the Autofill tile. + Zapnite \"Služba uľahčenia prístupu automatického vypĺňania\" v nastaveniach Bitwardenu, aby ste mohli používať dlaždicu na automatické vypĺňanie. Nenájdené žiadne políčka na heslo Presúva sa do koša… Položka bola poslaná do koša. @@ -742,7 +742,7 @@ Chcete prepnúť na tento účet? Prečítajte si o spôsoboch, ako zabrániť zablokovaniu účtu Pomoc pri určovaní geografickej polohy servera. E-mailová adresa (povinná) - Select the link in the email to verify your email address and continue creating your account. + Vyberte odkaz v e-maile, aby ste overili e-mailovú adresu a pokračujte vo vytváraní účtu. Zmeniť e-mailovú adresu Ďalej Bitwarden nemôže obnoviť stratené alebo zabudnuté hlavné heslo. @@ -774,7 +774,7 @@ Chcete prepnúť na tento účet? Zapnúť integráciu automatického vyplňovania v prehliadači neskôr? K tomuto kroku sa môžete kedykoľvek vrátiť a dokončiť ho v Nastaveniach. Na prihlasovanie do aplikácií a webových lokalít pomocou uložených hesiel môžete teraz používať automatické vypĺňanie. Teraz môžete preskúmať všetko ostatné, čo Bitwarden ponúka. - You’re all set! + Všetko je pripravené! Chyba pri pripájaní k službe Duo. Použite inú metódu dvojstupňového prihlásenia alebo kontaktujte Duo a požiadajte o pomoc. Nápoveď k hlavnému heslu Nová nápoveď pre hlavné heslo @@ -872,13 +872,13 @@ Chcete prepnúť na tento účet? 3 z 3 Ak chcete používať automatické vypĺňanie na prístup k tomuto účtu, musíte pridať webovú adresu. Viac o nových prihláseniach - We’ll walk you through the key features to add a new login. + Prevedieme vás kľúčovými funkciami na pridanie nového prihlásenia. Preskúmajte generátor Ďalšie informácie o generovaní bezpečných prihlasovacích údajov získate pomocou prehliadky so sprievodcom. Import klientskeho certifikátu Zadajte heslo klientskeho certifikátu a požadovaný alias pre tento certifikát. Alias - Use the generator to create secure passwords, passphrases and usernames. + Pomocou generátora môžete vytvárať bezpečné heslá, prístupové frázy a používateľské mená. Prístupové frázy sú silné heslá, ktoré sa často ľahšie pamätajú a zadávajú ako náhodné heslá. Sú užitočné pri prihlasovaní do účtov, kde nie je k dispozícii funkcia automatického vypĺňania, napríklad do streamovacej služby na televízore. Unikátne používateľské mená predstavujú ďalšiu úroveň zabezpečenia a môžu pomôcť zabrániť hackerom nájsť vaše účty. 1 Z 6 @@ -887,8 +887,8 @@ Chcete prepnúť na tento účet? 4 Z 6 5 Z 6 6 Z 6 - Use these options to adjust your password to meet your account website’s requirements. - After you save your new password to Bitwarden, don’t forget to update it on your account website. + Tieto možnosti môžete použiť na úpravu hesla, aby spĺňalo požiadavky webovej stránky. + Po uložení nového hesla do Bitwardenu ho nezabudnite aktualizovať na webovej stránke účtu. Overte svoju totožnosť Chyba pri načítaní certifikátu Alias certifikátu @@ -1144,7 +1144,9 @@ Chcete prepnúť na tento účet? Aktualizácia Kdf zlyhala, aktívny účet nebol nájdený. Skúste to znova alebo nás kontaktujte. Pri pokuse o aktualizáciu nastavení kdf došlo k chybe. Skúste to znova alebo nás kontaktujte. Požiadavku na import nebolo možné spracovať. - Your vault may be empty, or importing some item types isn’t allowed for your account. - No items available to import - Select a different account + Váš trezor môže byť prázdny, alebo importovanie niektorých typov položiek nie je pre váš účet povolený. + K dispozícii nie sú žiadne položky na importovanie + Vyberte iný účet + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-sl-rSI/strings.xml b/ui/src/main/res/values-sl-rSI/strings.xml index d28d01d8a9..d837f868e8 100644 --- a/ui/src/main/res/values-sl-rSI/strings.xml +++ b/ui/src/main/res/values-sl-rSI/strings.xml @@ -126,7 +126,7 @@ New identity There are no notes in your vault. New note - New item + Nov element New SSH key There are no text Sends in your vault. There are no file Sends in your vault. @@ -163,7 +163,7 @@ Elementi Elementi za %1$s V vašem trezorju ni elementov za %1$s. - There are no items in your vault that match “%1$s” + V vašem trezorju ni elementov, ki bi ustrezali \"%1$s\" Search for a login or add a new login Onemogočeno The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. @@ -389,7 +389,7 @@ Scanning will happen automatically. Koda poslana! Potrdite svojo identiteto za nadaljevanje. This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it. - This file export will be password protected and require the file password to decrypt. + Ta izvoz bo zaščiten z geslom; to geslo bo potrebno tudi pri uvozu. Confirm vault export Opozorilo There was a problem exporting your vault. If the problem persists, you’ll need to export from the web vault. @@ -462,7 +462,7 @@ Scanning will happen automatically. Require this password to view the Send. Odstrani geslo Odstranjevanje gesla - Password removed + Geslo odstranjeno Dodaj pošiljko Kopiraj povezavo Deli povezavo @@ -645,7 +645,7 @@ Do you want to switch to this account? The URI %1$s is already blocked Login approved Log in with device must be set up in the settings of the Bitwarden app. Need another option? - Log in with device + Prijava z napravo Logging in on Logging in on: Vault @@ -687,10 +687,10 @@ Do you want to switch to this account? Passkey operation failed because browser signature does not match Passkey operation failed because of missing asset links Passkey operation failed because app could not be verified - Confirm file password - File password + Potrdi geslo datoteke + Geslo datoteke Password Protected - This password will be used to export and import this file + Pri izvozu in uvozu te datoteke bo potrebno vpisati geslo Autofill suggestion Continue to complete WebAuthn verification. Launch WebAuthn @@ -824,7 +824,7 @@ Do you want to switch to this account? Import Successful! Manage your logins from anywhere with Bitwarden tools for web and desktop. Bitwarden Tools - Got it + Razumem No logins were imported Import error Logins imported @@ -936,7 +936,7 @@ Do you want to switch to this account? Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. For details on what is and isn’t logged, visit the\nBitwarden help center. Logging duration - 1 hour + 1 ura 8 hours 24 hours 1 week @@ -969,7 +969,7 @@ Do you want to switch to this account? This account will soon be deleted. Log in at %1$s to continue using Bitwarden. View file Send View text Send - Delete Send + Izbriši pošiljko Missing Send re-sync your vault Use dynamic colors Use dynamic colors? @@ -1147,4 +1147,6 @@ Do you want to switch to this account? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-sr-rSP/strings.xml b/ui/src/main/res/values-sr-rSP/strings.xml index 87c1ed2a36..89a796eb60 100644 --- a/ui/src/main/res/values-sr-rSP/strings.xml +++ b/ui/src/main/res/values-sr-rSP/strings.xml @@ -761,10 +761,10 @@ Омогућите ауто-пуњење Подешавање за ауто-попуњавање Укључите интеграцију ауто-пуњења прегледача - You’re using a browser that requires special permissions for Bitwarden to autofill your passwords. - You’re using browsers that requires special permissions for Bitwarden to autofill your passwords. - You’re using a browser that requires special permissions for Bitwarden to autofill your passwords. Enable your preferred autofill integration below. - You’re using browsers that requires special permissions for Bitwarden to autofill your passwords. Enable autofill for all your installed browsers to continue. + Користите прегледач који захтева посебне дозволе да би Bitwarden аутоматски попунио ваше лозинке. + Користите прегледач који захтева посебне дозволе да би Bitwarden аутоматски попунио ваше лозинке. + Користите прегледач који захтева посебне дозволе да би Bitwarden аутоматски попунио ваше лозинке. Омогућите жељену интеграцију аутоматског попуњавања испод. + Користите прегледаче који захтевају посебне дозволе за Bitwarden да аутоматски попуњава ваше лозинке. Омогућите аутоматско попуњавање за све инсталиране прегледаче да бисте наставили. Користите ауто-пуњење да бисте се пријавили на своје налоге једним додиром. Упалити касније Упалити ауто-пуњење касније? @@ -960,7 +960,7 @@ Извештај је избрисан Подешавања апликације Замените постојећи сертификат? - A certificate with the alias “%s” already exists. Do you want to replace it?\nReplacing the certificate may impact your connection to any environments currently using it. + Сертификат са тим алиасом \"%s\" веш постији. Да се промени?\nЗаменити сертификат може утицати на вашу везу са било којим срединама које тренутно користе. Преписати сертификат Није могуће прочитати сертификат. Није могуће избрисати Ваш налог @@ -973,7 +973,7 @@ Користи динамичке боје Користити динамичке боје? Динамичне боје користе боје система и не могу да испуне све смернице за приступачност. - Passkey operation failed because browser (%1$s) is not recognized. Select “Trust” to add %1$s to the list of locally trusted applications. + Операција лозинке није успела јер прегледач (%1$s) није препознат. Изаберите „Повери“ да бисте додали %1$s на листу локално поузданих апликација. Операција кључа за приступ није успела јер прегледач није поуздан. Повери Ово су апликације или прегледачи који Bitwarden не верује стандардно, али ВИ верујее да урадите операције са кључом за приступ. @@ -1098,7 +1098,7 @@ URI match detection controls how Bitwarden identifies autofill suggestions.\nWarning: “Starts with” is an advanced option with increased risk of exposing credentials. „Почиње са“ је напредна опција са повећаним ризиком од откривања акредитива. „Регуларни израз“ је напредна опција са повећаним ризиком од откривања акредитива ако се неправилно користе. - Later + Касније Encryption settings updated Update your encryption settings The new recommended encryption settings will improve your account security. Enter your master password to update now. @@ -1143,4 +1143,6 @@ Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-sv-rSE/strings.xml b/ui/src/main/res/values-sv-rSE/strings.xml index 52add13ee7..a85aef6d44 100644 --- a/ui/src/main/res/values-sv-rSE/strings.xml +++ b/ui/src/main/res/values-sv-rSE/strings.xml @@ -394,7 +394,7 @@ Skanningen sker automatiskt. En eller flera organisationspolicyer påverkar dina generatorinställningar Det gick inte att spara bilagan. Om problemet kvarstår kan du spara den från webbvalvet. Bilagan sparades - Please turn on “Autofill Accessibility Service” from Bitwarden Settings to use the Autofill tile. + Slå på \"Autofill Accessibility Service\" från Bitwarden Settings för att använda Autofill-kaklet. Inga lösenordsfält hittades Skickar till papperskorg… Objektet har skickats till papperskorgen. @@ -1133,6 +1133,8 @@ Vill du byta till detta konto? Ett fel inträffade vid försök att uppdatera dina kdf-inställningar. Försök igen eller kontakta oss. Importbegäran kunde inte behandlas. Your vault may be empty, or importing some item types isn’t allowed for your account. - No items available to import - Select a different account + Inga objekt tillgängliga att importera + Välj ett annat konto + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-ta-rIN/strings.xml b/ui/src/main/res/values-ta-rIN/strings.xml index 80e41ac5de..03f008b2fb 100644 --- a/ui/src/main/res/values-ta-rIN/strings.xml +++ b/ui/src/main/res/values-ta-rIN/strings.xml @@ -164,7 +164,7 @@ உம் பெட்டகத்தில் “%1$s”-உடன் பொருந்தும் உருப்படிகள் இல்லை உள்நுழைவைத் தேடு அல்லது புது உள்நுழைவைச் சேர் முடக்கத்தில் - The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the “Settings” screen. + புதிய உள்நுழைவுகளை உங்கள் பெட்டகத்தில் சேர்க்க எளிதான வழி, பிட்வார்டன் தானாக நிரப்புதல் சேவையிலிருந்து ஆகும். \"அமைப்புகள்\" திரைக்குச் சென்று பிட்வார்டன் தானாக நிரப்புதல் சேவையைப் பயன்படுத்துவது பற்றி மேலும் அறிக. தானியங்குநிரப்பு இவ்வுருப்படியை தன்னிரப்ப அல்லது பார்க்க வேண்டுமா? தேடுக @@ -172,7 +172,7 @@ அங்கீகரிப்பான் செயலி உங்கள் அங்கீகார செயலியிலிருந்து ௬ இலக்க சரிபார்ப்புக் குறியீட்டை உள்ளிடவும். %1$s க்கு மின்னஞ்சல் செய்த ௬ இலக்க சரிபார்ப்புக் குறியீட்டை உள்ளிடவும். - We don’t recognize this device. Enter the code sent to your email to verify your identity. + இந்த சாதனத்தை நாங்கள் அடையாளம் காணவில்லை. உங்கள் அடையாளத்தைச் சரிபார்க்க உங்கள் மின்னஞ்சலுக்கு அனுப்பப்பட்ட குறியீட்டை உள்ளிடவும். மீட்புக் குறியீடு நினைவில் கொள்ளுங்கள் மின்னஞ்சலை நினைவில் கொள்ளுங்கள் @@ -394,7 +394,7 @@ ஒன்று அ மேற்பட்ட நிறுவன கொள்கைகள் உமது உருவாக்கி அமைப்புகளை பாதிக்கிறது இவ்விணைப்பை சேமிப்பதில் ஏதோ சிக்கல். சிக்கல் தொடர்ந்தால், வலைப்பெட்டகத்திலிருந்து இதைச் சேமிக்கலாம். சேர்ப்பு வெற்றிகரமாக சேமிக்கப்பட்டது - Please turn on “Autofill Accessibility Service” from Bitwarden Settings to use the Autofill tile. + தானாக நிரப்புதல் டைலை பயன்படுத்த பிட்வார்டன் அமைப்புகளிலிருந்து \"தானாக நிரப்புதல் அணுகல் சேவை\" என்பதை இயக்கவும். கடவுச்சொல் புலங்களேதும் கண்டறியப்படவில்லை குப்பைக்கு அனுப்புகிறது… உருப்படி குப்பைக்கு அனுப்பப்பட்டது. @@ -738,7 +738,7 @@ கணக்கு லாக் அவுட்டைத் தடுப்பதற்கான வழிகளைப் பற்றி அறிக சர்வர் புவிஇருப்பிடங்களுடன் உதவி. மின்னஞ்சல் முகவரி (தேவை) - Select the link in the email to verify your email address and continue creating your account. + உங்கள் மின்னஞ்சல் முகவரியைச் சரிபார்க்கவும், உங்கள் கணக்கை உருவாக்குவதைத் தொடரவும் மின்னஞ்சலில் உள்ள இணைப்பைத் தேர்ந்தெடுக்கவும். மின்னஞ்சல் முகவரியை மாற்று அடுத்து தொலைந்த அல்லது மறக்கப்பட்ட முதன்மை கடவுச்சொல்லை Bitwarden மீட்டெடுக்க முடியாது. @@ -768,7 +768,7 @@ Turn on browser autofill integration later? அமைப்புகளில் எந்த நேரத்திலும் இந்த படிநிலையை முடிக்க நீங்கள் திரும்பலாம். இப்போது நீங்கள் Bitwarden வழங்க வேண்டிய அனைத்தையும் ஆராயலாம் மற்றும் உங்கள் கடவுச்சொற்களை பாதுகாப்பாக நிர்வகிக்கத் தொடங்கலாம். - You’re all set! + நீங்கள் தயாராக உள்ளீர்கள்! Duo சேவைடன் இணைப்பதில் பிழை. வேறு இரண்டு-படி உள்நுழைவு முறையைப் பயன்படுத்தவும் அல்லது உதவிக்கு Duo-ஐ தொடர்பு கொள்ளவும். முதன்மை கடவுச்சொல் குறிப்பு புதிய முதன்மை கடவுச்சொல் குறிப்பு @@ -866,13 +866,13 @@ 3/3 இந்த கணக்கை அணுக தானியங்கு நிரப்புதலைப் பயன்படுத்த ஒரு வலை முகவரியைச் சேர்க்க வேண்டும். புதிய உள்நுழைவுகளைப் பற்றி அறிக - We’ll walk you through the key features to add a new login. + புதிய உள்நுழைவைச் சேர்ப்பதற்கான முக்கிய அம்சங்கள் பற்றி நாங்கள் உங்களுக்கு விளக்குவோம். ஜெனரேட்டரை ஆராயுங்கள் வழிகாட்டப்பட்ட சுற்றுப்பயணத்துடன் பாதுகாப்பான உள்நுழைவு சான்றுகளை உருவாக்குவது பற்றி மேலும் அறிக. வாடிக்கையாளர் சான்றிதழை இறக்குமதி செய் வாடிக்கையாளர் சான்றிதழ் கடவுச்சொல் மற்றும் இந்த சான்றிதழுக்கான விரும்பிய புனைப்பெயரை உள்ளிடவும். புனைப்பெயர் - Use the generator to create secure passwords, passphrases and usernames. + பாதுகாப்பான கடவுச்சொற்கள், கடவுக்குறிச்சொற்கள் மற்றும் பயனர்பெயர்களை உருவாக்க ஜெனரேட்டரைப் பயன்படுத்தவும். கடவுச்சொற்றொடர்கள் வலுவான கடவுச்சொற்கள் ஆகும், அவை சீரற்ற கடவுச்சொற்களை விட நினைவில் கொள்ளவும் தட்டச்சு செய்யவும் எளிதானவை. உங்கள் டிவியில் உள்ள ஸ்ட்ரீமிங் சேவை போன்ற தானியங்கு நிரப்புதல் கிடைக்காத கணக்குகளில் உள்நுழைய அவை உதவியாக இருக்கும். தனிப்பட்ட பயனர்பெயர்கள் பாதுகாப்பின் ஒரு கூடுதல் அடுக்கைச் சேர்க்கின்றன மற்றும் ஹேக்கர்கள் உங்கள் கணக்குகளைக் கண்டுபிடிப்பதைத் தடுக்க உதவும். 1/6 @@ -881,8 +881,8 @@ 4/6 5/6 6/6 - Use these options to adjust your password to meet your account website’s requirements. - After you save your new password to Bitwarden, don’t forget to update it on your account website. + உங்கள் கணக்கு வலைத்தளத்தின் தேவைகளைப் பூர்த்தி செய்ய உங்கள் கடவுச்சொல்லை சரிசெய்ய இந்த விருப்பங்களைப் பயன்படுத்தவும். + உங்கள் புதிய கடவுச்சொல்லை பிட்வார்டனில் சேமித்த பிறகு, உங்கள் கணக்கு வலைத்தளத்தில் அதைப் புதுப்பிக்க மறக்க வேண்டாம். உங்கள் அடையாளத்தை சரிபார்க்கவும் சான்றிதழை ஏற்றுவதில் பிழை சான்றிதழ் புனைப்பெயர் @@ -1125,9 +1125,9 @@ Import passwords, passkeys, and other item types from your Bitwarden vault. Items to import Exporting items… - Export failed - Passwords - Passkeys + ஏற்றுமதி தோல்வியடைந்தது + கடவுச்சொற்கள் + கடவுவிசைகள் Why is this step required? Kdf update failed, active account not found. Please try again or contact us. An error occurred while trying to update your kdf settings. Please try again or contact us. @@ -1135,4 +1135,6 @@ Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-te-rIN/strings.xml b/ui/src/main/res/values-te-rIN/strings.xml index 4e58d356a0..53851b2522 100644 --- a/ui/src/main/res/values-te-rIN/strings.xml +++ b/ui/src/main/res/values-te-rIN/strings.xml @@ -1135,4 +1135,6 @@ Do you want to switch to this account? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-th-rTH/strings.xml b/ui/src/main/res/values-th-rTH/strings.xml index 7f9911ca2c..2dc3ffe8f2 100644 --- a/ui/src/main/res/values-th-rTH/strings.xml +++ b/ui/src/main/res/values-th-rTH/strings.xml @@ -434,7 +434,7 @@ Scanning will happen automatically. Send Send Details Sends ทั้งหมด - Text + ข้อความ Text to share ข้อความ When accessing the Send, hide the text by default @@ -704,7 +704,7 @@ Do you want to switch to this account? Get emails from Bitwarden for announcements, advice, and research opportunities. Unsubscribe at any time. Security, prioritized Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you. - Set up biometric unlock and autofill to log into your accounts without typing a single letter. + ตั้งค่าการปลดล็อกด้วยไบโอเมตริกซ์และการกรอกข้อมูลอัตโนมัติ เพื่อลงชื่อเข้าใช้บัญชีของคุณโดยไม่ต้องพิมพ์แม้แต่ตัวอักษรเดียว Quick and easy login Level up your logins Use the generator to create and save strong, unique passwords for all your accounts. @@ -767,7 +767,7 @@ Do you want to switch to this account? You can now explore everything Bitwarden has to offer and start managing your passwords securely. You’re all set! Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance. - Master password hint + รับคำใบ้เกี่ยวกับรหัสผ่านหลักของคุณ New master password hint Get started Save and protect your data @@ -830,7 +830,7 @@ Do you want to switch to this account? Log in quickly and easily across devices Bitwarden can notify you each time you receive a new login request from another device. Skip for now - Done + เสร็จสิ้น %1$s of %2$s Copy identity name Copy company @@ -927,7 +927,7 @@ Do you want to switch to this account? Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. For details on what is and isn’t logged, visit the\nBitwarden help center. Logging duration - 1 hour + 1 ชั่วโมง 8 hours 24 hours 1 week @@ -960,7 +960,7 @@ Do you want to switch to this account? This account will soon be deleted. Log in at %1$s to continue using Bitwarden. View file Send View text Send - Delete Send + ลบ Send Missing Send re-sync your vault Use dynamic colors Use dynamic colors? @@ -1129,4 +1129,6 @@ Do you want to switch to this account? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-tr-rTR/strings.xml b/ui/src/main/res/values-tr-rTR/strings.xml index 505e20c3de..deba5f30f7 100644 --- a/ui/src/main/res/values-tr-rTR/strings.xml +++ b/ui/src/main/res/values-tr-rTR/strings.xml @@ -880,8 +880,8 @@ Bu hesaba geçmek ister misiniz? 4/6 5/6 6/6 - Use these options to adjust your password to meet your account website’s requirements. - After you save your new password to Bitwarden, don’t forget to update it on your account website. + Bu seçenekleri kullanarak parolanızı hesap web sitenizin gereksinimlerine uygun hale getirin. + Yeni parolanızı Bitwarden\'a kaydettikten sonra, hesap web sitenizde de güncellemeyi unutmayın. Kimliğinizi doğrulayın Sertifika yüklenirken hata oluştu Sertifika takma adı @@ -948,7 +948,7 @@ Bu hesaba geçmek ister misiniz? Aşağıdaki organizasyonun üyeleri için artık ana parola gerekmemektedir. Lütfen alan adını organizasyon yöneticinizle doğrulayın. Lütfen aşağıdaki etki alanını kuruluş yöneticinizle onaylayın.\n\Key Connector etki alanı:\n%1$s Uçuş kaydedici etkin - Flight recorder will be active until %1$s at %2$s. Return to settings to deactivate now. + Uçuş kaydedici, %1$s saat %2$s\'ye kadar aktif olacaktır. Şimdi devre dışı bırakmak için ayarlara geri dönün. Ayarlara git Tüm günlükler silindi Günlük silindi @@ -1134,4 +1134,6 @@ Bu hesaba geçmek ister misiniz? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-uk-rUA/strings.xml b/ui/src/main/res/values-uk-rUA/strings.xml index 2e8ab42b91..5e3ca56f49 100644 --- a/ui/src/main/res/values-uk-rUA/strings.xml +++ b/ui/src/main/res/values-uk-rUA/strings.xml @@ -1139,9 +1139,9 @@ Import passwords, passkeys, and other item types from your Bitwarden vault. Items to import Exporting items… - Export failed - Passwords - Passkeys + Не вдалося експортувати + Паролі + Ключі доступу Why is this step required? Kdf update failed, active account not found. Please try again or contact us. An error occurred while trying to update your kdf settings. Please try again or contact us. @@ -1149,4 +1149,6 @@ Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-vi-rVN/strings.xml b/ui/src/main/res/values-vi-rVN/strings.xml index b07a8121c9..2a013fcc76 100644 --- a/ui/src/main/res/values-vi-rVN/strings.xml +++ b/ui/src/main/res/values-vi-rVN/strings.xml @@ -1109,8 +1109,8 @@ các vấn đề. %1$d mục đã được nhập vào kho của bạn. Bật Tự động điền trình duyệt để tiếp tục điền mật khẩu - Your browser has recently updated, which has disabled Bitwarden autofill. To continue filling your passwords with Bitwarden, enable browser autofill in autofill settings. - Your browsers have recently updated, which has disabled Bitwarden autofill. To continue filling your passwords with Bitwarden, enable browser autofill for all installed browsers in autofill settings. + Trình duyệt của bạn vừa được cập nhật, điều này đã vô hiệu hóa tính năng tự động điền của Bitwarden. Để tiếp tục tự động điền bằng Bitwarden, hãy bật tính năng tự động điền của trình duyệt trong cài đặt tự động điền. + Trình duyệt của bạn đã được cập nhật gần đây, điều này đã vô hiệu hóa tính năng tự động điền của Bitwarden. Để tiếp tục điền mật khẩu bằng Bitwarden, hãy bật tính năng tự động điền trình duyệt cho tất cả các trình duyệt đã cài đặt trong cài đặt tự động điền. Để sau Nhập từ Bitwarden Chọn tài khoản @@ -1130,7 +1130,9 @@ các vấn đề. Cập nhật KDF thất bại, không tìm thấy tài khoản đang hoạt động. Vui lòng thử lại hoặc liên hệ với chúng tôi. Đã xảy ra lỗi khi cố gắng cập nhật cài đặt KDF của bạn. Vui lòng thử lại hoặc liên hệ với chúng tôi. Không thể xử lý yêu cầu nhập. - Your vault may be empty, or importing some item types isn’t allowed for your account. - No items available to import - Select a different account + Kho của bạn có thể trống, hoặc tài khoản của bạn không được phép nhập một số loại mục. + Không có mục nào để nhập + Chọn một tài khoản khác + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-zh-rCN/strings.xml b/ui/src/main/res/values-zh-rCN/strings.xml index 84672b2887..db99304782 100644 --- a/ui/src/main/res/values-zh-rCN/strings.xml +++ b/ui/src/main/res/values-zh-rCN/strings.xml @@ -5,7 +5,7 @@ 添加项目 发生错误 应用 - 后退 + 返回 取消 复制 复制密码 @@ -925,7 +925,7 @@ 启用临时日志记录,以在本地收集和检查日志。启用后,可能会记录应用程序状态和网络调用,但绝不会记录敏感的密码库信息。 要开始使用,请设置日志记录持续时间,以便您在复现问题时捕获相关活动。 日志记录将在该时间段后自动停用。 - 日志将在 30 天后自动删除。只有当您共享它时,Bitwarden 才能访问您的日志数据。 + 日志将在 30 天后自动删除。只有当您分享它时,Bitwarden 才能访问您的日志数据。 要了解哪些内容会被记录、哪些不会被记录,请访问\nBitwarden 帮助中心。 日志记录持续时间 1 小时 @@ -1127,7 +1127,9 @@ KDF 更新失败,未找到活动的账户。请重试或联系我们。 尝试更新您的 KDF 设置时发生错误。请重试或联系我们。 无法处理导入请求。 - Your vault may be empty, or importing some item types isn’t allowed for your account. - No items available to import - Select a different account + 您的密码库可能是空的,或者您的账户不允许导入某些项目类型。 + 没有可供导入的项目 + 选择其他账户 + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values-zh-rTW/strings.xml b/ui/src/main/res/values-zh-rTW/strings.xml index b0b41bb862..38a286f0b0 100644 --- a/ui/src/main/res/values-zh-rTW/strings.xml +++ b/ui/src/main/res/values-zh-rTW/strings.xml @@ -1130,4 +1130,6 @@ Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below diff --git a/ui/src/main/res/values/strings.xml b/ui/src/main/res/values/strings.xml index 12e912f202..aa129487c1 100644 --- a/ui/src/main/res/values/strings.xml +++ b/ui/src/main/res/values/strings.xml @@ -1135,4 +1135,8 @@ Do you want to switch to this account? Your vault may be empty, or importing some item types isn’t allowed for your account. No items available to import Select a different account + Verify your account email address + Enter the 6-digit code that was emailed to the address below + Lock app + Use your device’s lock method to unlock the app diff --git a/ui/src/main/res/values/strings_non_localized.xml b/ui/src/main/res/values/strings_non_localized.xml index 065a3501de..4495a77df6 100644 --- a/ui/src/main/res/values/strings_non_localized.xml +++ b/ui/src/main/res/values/strings_non_localized.xml @@ -37,6 +37,7 @@ LastPass (.json) Aegis (.json) Force update KDF settings + Avoid logout on KDF change