From 0feac46711e0e2741ff473c25a2641d8e3f0281c Mon Sep 17 00:00:00 2001 From: David Perez Date: Fri, 11 Jul 2025 08:17:22 -0500 Subject: [PATCH 1/6] PM-23692: Remove auth sync feature flag from password manager (#5514) --- .../manager/di/PlatformManagerModule.kt | 2 - .../data/platform/manager/model/FlagKey.kt | 9 --- .../AuthenticatorBridgeProcessorImpl.kt | 12 +--- .../components/FeatureFlagListItems.kt | 2 - .../AccountSecurityViewModel.kt | 37 +---------- .../data/platform/manager/FlagKeyTest.kt | 5 -- .../AuthenticatorBridgeProcessorTest.kt | 23 +------ .../debugmenu/DebugMenuViewModelTest.kt | 2 - .../AccountSecurityViewModelTest.kt | 63 +------------------ 9 files changed, 9 insertions(+), 146 deletions(-) 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 ff505773e1..9dbdce2d4e 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 @@ -138,13 +138,11 @@ object PlatformManagerModule { addTotpItemFromAuthenticatorManager: AddTotpItemFromAuthenticatorManager, @ApplicationContext context: Context, dispatcherManager: DispatcherManager, - featureFlagManager: FeatureFlagManager, ): AuthenticatorBridgeProcessor = AuthenticatorBridgeProcessorImpl( authenticatorBridgeRepository = authenticatorBridgeRepository, addTotpItemFromAuthenticatorManager = addTotpItemFromAuthenticatorManager, context = context, dispatcherManager = dispatcherManager, - featureFlagManager = featureFlagManager, ) @Provides diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/FlagKey.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/FlagKey.kt index 2eb441356e..4b2fcb04fc 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/FlagKey.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/FlagKey.kt @@ -21,7 +21,6 @@ sealed class FlagKey { */ val activeFlags: List> by lazy { listOf( - AuthenticatorSync, EmailVerification, ImportLoginsFlow, CredentialExchangeProtocolImport, @@ -40,14 +39,6 @@ sealed class FlagKey { } } - /** - * Data object holding the key for syncing with the Bitwarden Authenticator app. - */ - data object AuthenticatorSync : FlagKey() { - override val keyName: String = "enable-pm-bwa-sync" - override val defaultValue: Boolean = false - } - /** * Data object holding the key for Email Verification feature. */ diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/processor/AuthenticatorBridgeProcessorImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/processor/AuthenticatorBridgeProcessorImpl.kt index d4f1f0e640..491e6c3dce 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/processor/AuthenticatorBridgeProcessorImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/processor/AuthenticatorBridgeProcessorImpl.kt @@ -18,8 +18,6 @@ import com.bitwarden.authenticatorbridge.util.toSymmetricEncryptionKeyData import com.bitwarden.core.util.isBuildVersionAtLeast import com.bitwarden.data.manager.DispatcherManager import com.x8bit.bitwarden.data.auth.manager.AddTotpItemFromAuthenticatorManager -import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager -import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import com.x8bit.bitwarden.data.platform.repository.AuthenticatorBridgeRepository import com.x8bit.bitwarden.data.platform.util.createAddTotpItemFromAuthenticatorIntent import com.x8bit.bitwarden.ui.vault.util.getTotpDataOrNull @@ -33,7 +31,6 @@ import timber.log.Timber class AuthenticatorBridgeProcessorImpl( private val authenticatorBridgeRepository: AuthenticatorBridgeRepository, private val addTotpItemFromAuthenticatorManager: AddTotpItemFromAuthenticatorManager, - private val featureFlagManager: FeatureFlagManager, dispatcherManager: DispatcherManager, context: Context, ) : AuthenticatorBridgeProcessor { @@ -44,12 +41,9 @@ class AuthenticatorBridgeProcessorImpl( override val binder: IAuthenticatorBridgeService.Stub? get() { - return if ( - !featureFlagManager.getFeatureFlag(FlagKey.AuthenticatorSync) || - !isBuildVersionAtLeast(Build.VERSION_CODES.S) - ) { - // If the feature flag is not enabled, OR if version is below Android 12, - // return a null binder which will no-op all service calls + return if (!isBuildVersionAtLeast(Build.VERSION_CODES.S)) { + // If version is below Android 12, return a null binder which will no-op all + // service calls null } else { // Otherwise, return real binder implementation: diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/components/FeatureFlagListItems.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/components/FeatureFlagListItems.kt index 75f60f3320..27a127471d 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/components/FeatureFlagListItems.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/components/FeatureFlagListItems.kt @@ -25,7 +25,6 @@ fun FlagKey.ListItemContent( Unit } - FlagKey.AuthenticatorSync, FlagKey.EmailVerification, FlagKey.ImportLoginsFlow, FlagKey.CredentialExchangeProtocolImport, @@ -82,7 +81,6 @@ private fun FlagKey.getDisplayLabel(): String = when (this) { FlagKey.DummyString, -> this.keyName - FlagKey.AuthenticatorSync -> stringResource(R.string.authenticator_sync) FlagKey.EmailVerification -> stringResource(R.string.email_verification) FlagKey.ImportLoginsFlow -> stringResource(R.string.import_logins_flow) FlagKey.CredentialExchangeProtocolImport -> stringResource(R.string.cxp_import) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModel.kt index bd3b0cd8c3..b73e742b84 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModel.kt @@ -17,10 +17,8 @@ import com.x8bit.bitwarden.data.auth.repository.model.PolicyInformation import com.x8bit.bitwarden.data.auth.repository.model.UserFingerprintResult import com.x8bit.bitwarden.data.auth.repository.util.policyInformation import com.x8bit.bitwarden.data.platform.manager.BiometricsEncryptionManager -import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager import com.x8bit.bitwarden.data.platform.manager.FirstTimeActionManager import com.x8bit.bitwarden.data.platform.manager.PolicyManager -import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository import com.x8bit.bitwarden.data.platform.repository.SettingsRepository import com.x8bit.bitwarden.data.platform.repository.model.BiometricsKeyResult @@ -51,7 +49,6 @@ class AccountSecurityViewModel @Inject constructor( private val settingsRepository: SettingsRepository, private val environmentRepository: EnvironmentRepository, private val biometricsEncryptionManager: BiometricsEncryptionManager, - private val featureFlagManager: FeatureFlagManager, private val firstTimeActionManager: FirstTimeActionManager, policyManager: PolicyManager, savedStateHandle: SavedStateHandle, @@ -74,9 +71,7 @@ class AccountSecurityViewModel @Inject constructor( ?.activeAccount ?.hasMasterPassword != false, isUnlockWithPinEnabled = settingsRepository.isUnlockWithPinEnabled, - shouldShowEnableAuthenticatorSync = - featureFlagManager.getFeatureFlag(FlagKey.AuthenticatorSync) && - isBuildVersionAtLeast(Build.VERSION_CODES.S), + shouldShowEnableAuthenticatorSync = isBuildVersionAtLeast(Build.VERSION_CODES.S), userId = userId, vaultTimeout = settingsRepository.vaultTimeout, vaultTimeoutAction = settingsRepository.vaultTimeoutAction, @@ -123,13 +118,6 @@ class AccountSecurityViewModel @Inject constructor( .onEach(::sendAction) .launchIn(viewModelScope) - featureFlagManager - .getFeatureFlagFlow(FlagKey.AuthenticatorSync) - .onEach { - trySendAction(AccountSecurityAction.Internal.AuthenticatorSyncFeatureFlagUpdate(it)) - } - .launchIn(viewModelScope) - firstTimeActionManager .firstTimeStateFlow .map { @@ -374,10 +362,6 @@ class AccountSecurityViewModel @Inject constructor( private fun handleInternalAction(action: AccountSecurityAction.Internal) { when (action) { - is AccountSecurityAction.Internal.AuthenticatorSyncFeatureFlagUpdate -> { - handleAuthenticatorSyncFeatureFlagUpdate(action) - } - is AccountSecurityAction.Internal.BiometricsKeyResultReceive -> { handleBiometricsKeyResultReceive(action) } @@ -448,18 +432,6 @@ class AccountSecurityViewModel @Inject constructor( } } - private fun handleAuthenticatorSyncFeatureFlagUpdate( - action: AccountSecurityAction.Internal.AuthenticatorSyncFeatureFlagUpdate, - ) { - val shouldShowAuthenticatorSync = - action.isEnabled && isBuildVersionAtLeast(Build.VERSION_CODES.S) - mutableStateFlow.update { - it.copy( - shouldShowEnableAuthenticatorSync = shouldShowAuthenticatorSync, - ) - } - } - private fun handleBiometricsKeyResultReceive( action: AccountSecurityAction.Internal.BiometricsKeyResultReceive, ) { @@ -778,13 +750,6 @@ sealed class AccountSecurityAction { */ sealed class Internal : AccountSecurityAction() { - /** - * The feature flag value for authenticator syncing was updated. - */ - data class AuthenticatorSyncFeatureFlagUpdate( - val isEnabled: Boolean, - ) : Internal() - /** * A biometrics key result has been received. */ diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/FlagKeyTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/FlagKeyTest.kt index af2ab46aef..71b911b7b9 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/FlagKeyTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/FlagKeyTest.kt @@ -9,10 +9,6 @@ class FlagKeyTest { @Test fun `Feature flags have the correct key name set`() { - assertEquals( - FlagKey.AuthenticatorSync.keyName, - "enable-pm-bwa-sync", - ) assertEquals( FlagKey.EmailVerification.keyName, "email-verification", @@ -75,7 +71,6 @@ class FlagKeyTest { fun `All feature flags have the correct default value set`() { assertTrue( listOf( - FlagKey.AuthenticatorSync, FlagKey.EmailVerification, FlagKey.ImportLoginsFlow, FlagKey.CredentialExchangeProtocolImport, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/processor/AuthenticatorBridgeProcessorTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/processor/AuthenticatorBridgeProcessorTest.kt index 5f5d3b4f07..ac18b0b558 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/processor/AuthenticatorBridgeProcessorTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/processor/AuthenticatorBridgeProcessorTest.kt @@ -21,8 +21,6 @@ import com.bitwarden.core.data.util.asSuccess import com.bitwarden.core.util.isBuildVersionAtLeast import com.bitwarden.data.datasource.disk.base.FakeDispatcherManager import com.x8bit.bitwarden.data.auth.manager.AddTotpItemFromAuthenticatorManagerImpl -import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager -import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import com.x8bit.bitwarden.data.platform.repository.AuthenticatorBridgeRepository import com.x8bit.bitwarden.data.platform.util.createAddTotpItemFromAuthenticatorIntent import com.x8bit.bitwarden.ui.vault.model.TotpData @@ -49,7 +47,6 @@ import org.junit.jupiter.api.Test class AuthenticatorBridgeProcessorTest { - private val featureFlagManager = mockk() private val addTotpItemFromAuthenticatorManager = AddTotpItemFromAuthenticatorManagerImpl() private val authenticatorBridgeRepository = mockk() private val context = mockk { @@ -64,7 +61,6 @@ class AuthenticatorBridgeProcessorTest { addTotpItemFromAuthenticatorManager = addTotpItemFromAuthenticatorManager, authenticatorBridgeRepository = authenticatorBridgeRepository, context = context, - featureFlagManager = featureFlagManager, dispatcherManager = FakeDispatcherManager(), ) mockkStatic(::createAddTotpItemFromAuthenticatorIntent) @@ -91,30 +87,16 @@ class AuthenticatorBridgeProcessorTest { } @Test - fun `when AuthenticatorSync feature flag is off, should return null binder`() { + fun `when running Android level greater than S, should return non-null binder`() { mockkStatic(::isBuildVersionAtLeast) every { isBuildVersionAtLeast(Build.VERSION_CODES.S) } returns true - every { featureFlagManager.getFeatureFlag(FlagKey.AuthenticatorSync) } returns false - assertNull(bridgeServiceProcessor.binder) - } - - @Test - @Suppress("MaxLineLength") - fun `when AuthenticatorSync feature flag is on and running Android level greater than S, should return non-null binder`() { - mockkStatic(::isBuildVersionAtLeast) - every { isBuildVersionAtLeast(Build.VERSION_CODES.S) } returns true - every { featureFlagManager.getFeatureFlag(FlagKey.AuthenticatorSync) } returns true assertNotNull(bridgeServiceProcessor.binder) } @Test - fun `when below Android level S, should never return a binder regardless of feature flag`() { + fun `when below Android level S, should never return a binder`() { mockkStatic(::isBuildVersionAtLeast) every { isBuildVersionAtLeast(Build.VERSION_CODES.S) } returns false - every { featureFlagManager.getFeatureFlag(FlagKey.AuthenticatorSync) } returns false - assertNull(bridgeServiceProcessor.binder) - - every { featureFlagManager.getFeatureFlag(FlagKey.AuthenticatorSync) } returns true assertNull(bridgeServiceProcessor.binder) } @@ -310,7 +292,6 @@ class AuthenticatorBridgeProcessorTest { private fun getDefaultBinder(): IAuthenticatorBridgeService.Stub { mockkStatic(::isBuildVersionAtLeast) every { isBuildVersionAtLeast(Build.VERSION_CODES.S) } returns true - every { featureFlagManager.getFeatureFlag(FlagKey.AuthenticatorSync) } returns true return bridgeServiceProcessor.binder!! } } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/DebugMenuViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/DebugMenuViewModelTest.kt index a8d26f2eac..10ac7d35da 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/DebugMenuViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/DebugMenuViewModelTest.kt @@ -144,7 +144,6 @@ class DebugMenuViewModelTest : BaseViewModelTest() { } private val DEFAULT_MAP_VALUE: ImmutableMap, Any> = persistentMapOf( - FlagKey.AuthenticatorSync to true, FlagKey.EmailVerification to true, FlagKey.ImportLoginsFlow to true, FlagKey.CredentialExchangeProtocolImport to true, @@ -162,7 +161,6 @@ private val DEFAULT_MAP_VALUE: ImmutableMap, Any> = persistentMapOf ) private val UPDATED_MAP_VALUE: ImmutableMap, Any> = persistentMapOf( - FlagKey.AuthenticatorSync to false, FlagKey.EmailVerification to false, FlagKey.ImportLoginsFlow to false, FlagKey.CredentialExchangeProtocolImport to false, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModelTest.kt index f7e47cc6ba..7a4f02110a 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModelTest.kt @@ -22,11 +22,9 @@ import com.x8bit.bitwarden.data.auth.repository.model.UserFingerprintResult import com.x8bit.bitwarden.data.auth.repository.model.UserState import com.x8bit.bitwarden.data.platform.error.NoActiveUserException import com.x8bit.bitwarden.data.platform.manager.BiometricsEncryptionManager -import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager import com.x8bit.bitwarden.data.platform.manager.FirstTimeActionManager import com.x8bit.bitwarden.data.platform.manager.PolicyManager import com.x8bit.bitwarden.data.platform.manager.model.FirstTimeState -import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository import com.x8bit.bitwarden.data.platform.repository.SettingsRepository import com.x8bit.bitwarden.data.platform.repository.model.BiometricsKeyResult @@ -46,7 +44,6 @@ import io.mockk.runs import io.mockk.unmockkStatic import io.mockk.verify import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.test.runTest import kotlinx.serialization.json.Json @@ -105,9 +102,6 @@ class AccountSecurityViewModelTest : BaseViewModelTest() { getActivePoliciesFlow(type = PolicyTypeJson.REMOVE_UNLOCK_WITH_PIN) } returns mutableRemovePinPolicyFlow } - private val featureFlagManager: FeatureFlagManager = mockk(relaxed = true) { - every { getFeatureFlag(FlagKey.AuthenticatorSync) } returns false - } @BeforeEach fun setup() { @@ -818,29 +812,19 @@ class AccountSecurityViewModelTest : BaseViewModelTest() { } } - @Suppress("MaxLineLength") @Test - fun `when featureFlagManger returns true for AuthenticatorSync, and version is at least 31 should show authenticator sync UI`() { + fun `when version is at least 31 should show authenticator sync UI`() { every { isBuildVersionAtLeast(Build.VERSION_CODES.S) } returns true - val vm = createViewModel( - initialState = null, - featureFlagManager = mockk { - every { getFeatureFlag(FlagKey.AuthenticatorSync) } returns true - every { getFeatureFlagFlow(FlagKey.AuthenticatorSync) } returns emptyFlow() - }, - ) + val vm = createViewModel(initialState = null) assertEquals( DEFAULT_STATE.copy(shouldShowEnableAuthenticatorSync = true), vm.stateFlow.value, ) } - @Suppress("MaxLineLength") @Test - fun `when featureFlagManger returns true for AuthenticatorSync, and version is under 31 should not show authenticator sync UI`() { + fun `when version is under 31 should not show authenticator sync UI`() { every { isBuildVersionAtLeast(Build.VERSION_CODES.S) } returns false - every { featureFlagManager.getFeatureFlag(FlagKey.AuthenticatorSync) } returns true - every { featureFlagManager.getFeatureFlagFlow(FlagKey.AuthenticatorSync) } returns emptyFlow() val vm = createViewModel(initialState = null) assertEquals( DEFAULT_STATE, @@ -848,45 +832,6 @@ class AccountSecurityViewModelTest : BaseViewModelTest() { ) } - @Test - fun `when featureFlagManger updates value AuthenticatorSync, should update UI`() = runTest { - every { isBuildVersionAtLeast(Build.VERSION_CODES.S) } returns true - val featureFlagFlow = MutableStateFlow(false) - val vm = createViewModel( - initialState = null, - featureFlagManager = mockk { - every { getFeatureFlag(FlagKey.AuthenticatorSync) } returns false - every { getFeatureFlagFlow(FlagKey.AuthenticatorSync) } returns featureFlagFlow - }, - ) - vm.stateFlow.test { - assertEquals(DEFAULT_STATE, awaitItem()) - featureFlagFlow.value = true - assertEquals(DEFAULT_STATE.copy(shouldShowEnableAuthenticatorSync = true), awaitItem()) - featureFlagFlow.value = false - assertEquals(DEFAULT_STATE, awaitItem()) - } - } - - @Test - @Suppress("MaxLineLength") - fun `when featureFlagManger updates value AuthenticatorSync, authenticator sync row should never show if below API 31`() = - runTest { - every { isBuildVersionAtLeast(Build.VERSION_CODES.S) } returns false - val featureFlagFlow = MutableStateFlow(false) - every { featureFlagManager.getFeatureFlag(FlagKey.AuthenticatorSync) } returns false - every { - featureFlagManager.getFeatureFlagFlow(FlagKey.AuthenticatorSync) - } returns featureFlagFlow - val vm = createViewModel(initialState = null) - vm.stateFlow.test { - assertEquals(DEFAULT_STATE, awaitItem()) - featureFlagFlow.value = true - featureFlagFlow.value = false - expectNoEvents() - } - } - @Test fun `when showUnlockBadgeFlow updates value, should update state`() = runTest { val viewModel = createViewModel() @@ -951,7 +896,6 @@ class AccountSecurityViewModelTest : BaseViewModelTest() { private fun createViewModel( initialState: AccountSecurityState? = DEFAULT_STATE, authRepository: AuthRepository = this.authRepository, - featureFlagManager: FeatureFlagManager = this.featureFlagManager, vaultRepository: VaultRepository = this.vaultRepository, environmentRepository: EnvironmentRepository = this.fakeEnvironmentRepository, settingsRepository: SettingsRepository = this.settingsRepository, @@ -959,7 +903,6 @@ class AccountSecurityViewModelTest : BaseViewModelTest() { policyManager: PolicyManager = this.policyManager, ): AccountSecurityViewModel = AccountSecurityViewModel( authRepository = authRepository, - featureFlagManager = featureFlagManager, vaultRepository = vaultRepository, settingsRepository = settingsRepository, environmentRepository = environmentRepository, From d2f7d521321491db695100a611a6ca4e7b8b0702 Mon Sep 17 00:00:00 2001 From: David Perez Date: Fri, 11 Jul 2025 08:27:10 -0500 Subject: [PATCH 2/6] PM-23693: Remove Authenticator Sync flag from Authenticator app (#5515) --- .../repository/AuthenticatorRepositoryImpl.kt | 17 +----- .../di/AuthenticatorBridgeModule.kt | 25 ++------- .../di/AuthenticatorRepositoryModule.kt | 3 - .../data/platform/manager/model/FlagKey.kt | 9 --- .../feature/debugmenu/DebugMenuScreen.kt | 1 - .../components/FeatureFlagListItems.kt | 3 - .../feature/settings/SettingsScreen.kt | 2 +- .../feature/settings/SettingsViewModel.kt | 10 +--- authenticator/src/main/res/values/strings.xml | 2 +- .../main/res/values/strings_non_localized.xml | 1 - .../repository/AuthenticatorRepositoryTest.kt | 56 ------------------- .../manager/FeatureFlagManagerTest.kt | 4 +- .../data/platform/manager/FlagKeyTest.kt | 5 -- .../repository/DebugMenuRepositoryTest.kt | 4 -- .../feature/debugmenu/DebugMenuScreenTest.kt | 12 ++-- .../debugmenu/DebugMenuViewModelTest.kt | 8 +-- .../feature/settings/SettingsViewModelTest.kt | 32 +---------- 17 files changed, 25 insertions(+), 169 deletions(-) diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/repository/AuthenticatorRepositoryImpl.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/repository/AuthenticatorRepositoryImpl.kt index d4542e8cc3..017ad997c1 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/repository/AuthenticatorRepositoryImpl.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/repository/AuthenticatorRepositoryImpl.kt @@ -16,11 +16,9 @@ import com.bitwarden.authenticator.data.authenticator.repository.model.SharedVer import com.bitwarden.authenticator.data.authenticator.repository.model.TotpCodeResult import com.bitwarden.authenticator.data.authenticator.repository.util.sortAlphabetically import com.bitwarden.authenticator.data.authenticator.repository.util.toAuthenticatorItems -import com.bitwarden.authenticator.data.platform.manager.FeatureFlagManager import com.bitwarden.authenticator.data.platform.manager.imports.ImportManager import com.bitwarden.authenticator.data.platform.manager.imports.model.ImportDataResult import com.bitwarden.authenticator.data.platform.manager.imports.model.ImportFileFormat -import com.bitwarden.authenticator.data.platform.manager.model.FlagKey import com.bitwarden.authenticator.data.platform.repository.SettingsRepository import com.bitwarden.authenticator.ui.platform.feature.settings.export.model.ExportVaultFormat import com.bitwarden.authenticator.ui.platform.manager.intent.IntentManager @@ -64,7 +62,6 @@ private const val STOP_TIMEOUT_DELAY_MS: Long = 5_000L class AuthenticatorRepositoryImpl @Inject constructor( private val authenticatorBridgeManager: AuthenticatorBridgeManager, private val authenticatorDiskSource: AuthenticatorDiskSource, - private val featureFlagManager: FeatureFlagManager, private val totpCodeManager: TotpCodeManager, private val fileManager: FileManager, private val importManager: ImportManager, @@ -155,17 +152,9 @@ class AuthenticatorRepositoryImpl @Inject constructor( @OptIn(ExperimentalCoroutinesApi::class) override val sharedCodesStateFlow: StateFlow by lazy { - featureFlagManager - .getFeatureFlagFlow(FlagKey.PasswordManagerSync) - .flatMapLatest { isFeatureEnabled -> - if (isFeatureEnabled) { - authenticatorBridgeManager - .accountSyncStateFlow - .flatMapLatest { it.toSharedVerificationCodesStateFlow() } - } else { - flowOf(SharedVerificationCodesState.FeatureNotEnabled) - } - } + authenticatorBridgeManager + .accountSyncStateFlow + .flatMapLatest { it.toSharedVerificationCodesStateFlow() } .stateIn( scope = unconfinedScope, started = SharingStarted.WhileSubscribed(STOP_TIMEOUT_DELAY_MS), diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/repository/di/AuthenticatorBridgeModule.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/repository/di/AuthenticatorBridgeModule.kt index 645f4afc3e..57401dd4b3 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/repository/di/AuthenticatorBridgeModule.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/repository/di/AuthenticatorBridgeModule.kt @@ -4,19 +4,14 @@ import android.content.Context import com.bitwarden.authenticator.BuildConfig import com.bitwarden.authenticator.data.auth.datasource.disk.AuthDiskSource import com.bitwarden.authenticator.data.authenticator.repository.util.SymmetricKeyStorageProviderImpl -import com.bitwarden.authenticator.data.platform.manager.FeatureFlagManager -import com.bitwarden.authenticator.data.platform.manager.model.FlagKey import com.bitwarden.authenticatorbridge.factory.AuthenticatorBridgeFactory import com.bitwarden.authenticatorbridge.manager.AuthenticatorBridgeManager -import com.bitwarden.authenticatorbridge.manager.model.AccountSyncState import com.bitwarden.authenticatorbridge.provider.SymmetricKeyStorageProvider import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow import javax.inject.Singleton /** @@ -38,23 +33,11 @@ object AuthenticatorBridgeModule { fun provideAuthenticatorBridgeManager( factory: AuthenticatorBridgeFactory, symmetricKeyStorageProvider: SymmetricKeyStorageProvider, - featureFlagManager: FeatureFlagManager, ): AuthenticatorBridgeManager = - if (featureFlagManager.getFeatureFlag(FlagKey.PasswordManagerSync)) { - factory.getAuthenticatorBridgeManager( - connectionType = BuildConfig.AUTHENTICATOR_BRIDGE_CONNECTION_TYPE, - symmetricKeyStorageProvider = symmetricKeyStorageProvider, - ) - } else { - // If feature flag is not enabled, return no-op bridge manager so we never - // connect to bridge service: - object : AuthenticatorBridgeManager { - override val accountSyncStateFlow: StateFlow - get() = MutableStateFlow(AccountSyncState.Loading) - - override fun startAddTotpLoginItemFlow(totpUri: String): Boolean = false - } - } + factory.getAuthenticatorBridgeManager( + connectionType = BuildConfig.AUTHENTICATOR_BRIDGE_CONNECTION_TYPE, + symmetricKeyStorageProvider = symmetricKeyStorageProvider, + ) @Provides fun providesSymmetricKeyStorageProvider( diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/repository/di/AuthenticatorRepositoryModule.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/repository/di/AuthenticatorRepositoryModule.kt index 2b40c7a87e..bdaba96994 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/repository/di/AuthenticatorRepositoryModule.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/authenticator/repository/di/AuthenticatorRepositoryModule.kt @@ -5,7 +5,6 @@ import com.bitwarden.authenticator.data.authenticator.manager.FileManager import com.bitwarden.authenticator.data.authenticator.manager.TotpCodeManager import com.bitwarden.authenticator.data.authenticator.repository.AuthenticatorRepository import com.bitwarden.authenticator.data.authenticator.repository.AuthenticatorRepositoryImpl -import com.bitwarden.authenticator.data.platform.manager.FeatureFlagManager import com.bitwarden.authenticator.data.platform.manager.imports.ImportManager import com.bitwarden.authenticator.data.platform.repository.SettingsRepository import com.bitwarden.authenticatorbridge.manager.AuthenticatorBridgeManager @@ -28,7 +27,6 @@ object AuthenticatorRepositoryModule { fun provideAuthenticatorRepository( authenticatorBridgeManager: AuthenticatorBridgeManager, authenticatorDiskSource: AuthenticatorDiskSource, - featureFlagManager: FeatureFlagManager, dispatcherManager: DispatcherManager, fileManager: FileManager, importManager: ImportManager, @@ -37,7 +35,6 @@ object AuthenticatorRepositoryModule { ): AuthenticatorRepository = AuthenticatorRepositoryImpl( authenticatorBridgeManager = authenticatorBridgeManager, authenticatorDiskSource = authenticatorDiskSource, - featureFlagManager = featureFlagManager, dispatcherManager = dispatcherManager, fileManager = fileManager, importManager = importManager, diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/model/FlagKey.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/model/FlagKey.kt index e788939185..2b621bd506 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/model/FlagKey.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/model/FlagKey.kt @@ -22,7 +22,6 @@ sealed class FlagKey { val activeFlags: List> by lazy { listOf( BitwardenAuthenticationEnabled, - PasswordManagerSync, ) } } @@ -35,14 +34,6 @@ sealed class FlagKey { override val defaultValue: Boolean = false } - /** - * Indicates whether syncing with the main Bitwarden password manager app should be enabled.. - */ - data object PasswordManagerSync : FlagKey() { - override val keyName: String = "enable-pm-bwa-sync" - override val defaultValue: Boolean = false - } - /** * Data object holding the key for a [Boolean] flag to be used in tests. */ diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/DebugMenuScreen.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/DebugMenuScreen.kt index c21c97007d..68f816ecaf 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/DebugMenuScreen.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/DebugMenuScreen.kt @@ -147,7 +147,6 @@ private fun FeatureFlagContent_preview() { FeatureFlagContent( featureFlagMap = mapOf( FlagKey.BitwardenAuthenticationEnabled to true, - FlagKey.PasswordManagerSync to false, ), onValueChange = { _, _ -> }, onResetValues = { }, diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/components/FeatureFlagListItems.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/components/FeatureFlagListItems.kt index 5e61dfa7a1..c3789866e4 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/components/FeatureFlagListItems.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/components/FeatureFlagListItems.kt @@ -23,7 +23,6 @@ fun FlagKey.ListItemContent( -> Unit FlagKey.BitwardenAuthenticationEnabled, - FlagKey.PasswordManagerSync, -> BooleanFlagItem( label = flagKey.getDisplayLabel(), key = flagKey as FlagKey, @@ -63,6 +62,4 @@ private fun FlagKey.getDisplayLabel(): String = when (this) { FlagKey.BitwardenAuthenticationEnabled -> stringResource(R.string.bitwarden_authentication_enabled) - - FlagKey.PasswordManagerSync -> stringResource(R.string.password_manager_sync) } 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 2c54aae8dc..ccb231a26b 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 @@ -351,7 +351,7 @@ private fun VaultSettings( BitwardenTextRow( text = stringResource(id = R.string.sync_with_bitwarden_app), description = annotatedStringResource( - id = R.string.this_feature_is_not_not_yet_available_for_self_hosted_users, + id = R.string.learn_more_link, style = spanStyleOf( color = MaterialTheme.colorScheme.onSurfaceVariant, textStyle = MaterialTheme.typography.bodyMedium, 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 e42e7c9d0f..c043ef78b4 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 @@ -10,9 +10,7 @@ import com.bitwarden.authenticator.R import com.bitwarden.authenticator.data.authenticator.repository.AuthenticatorRepository import com.bitwarden.authenticator.data.authenticator.repository.model.SharedVerificationCodesState import com.bitwarden.authenticator.data.authenticator.repository.util.isSyncWithBitwardenEnabled -import com.bitwarden.authenticator.data.platform.manager.FeatureFlagManager import com.bitwarden.authenticator.data.platform.manager.clipboard.BitwardenClipboardManager -import com.bitwarden.authenticator.data.platform.manager.model.FlagKey import com.bitwarden.authenticator.data.platform.repository.SettingsRepository import com.bitwarden.authenticator.data.platform.repository.model.BiometricsKeyResult import com.bitwarden.authenticator.ui.platform.feature.settings.appearance.model.AppLanguage @@ -49,7 +47,6 @@ class SettingsViewModel @Inject constructor( private val authenticatorBridgeManager: AuthenticatorBridgeManager, private val settingsRepository: SettingsRepository, private val clipboardManager: BitwardenClipboardManager, - featureFlagManager: FeatureFlagManager, ) : BaseViewModel( initialState = savedStateHandle[KEY_STATE] ?: createInitialState( @@ -58,8 +55,6 @@ class SettingsViewModel @Inject constructor( appTheme = settingsRepository.appTheme, unlockWithBiometricsEnabled = settingsRepository.isUnlockWithBiometricsEnabled, isSubmitCrashLogsEnabled = settingsRepository.isCrashLoggingEnabled, - isSyncWithBitwardenFeatureEnabled = - featureFlagManager.getFeatureFlag(FlagKey.PasswordManagerSync), accountSyncState = authenticatorBridgeManager.accountSyncStateFlow.value, defaultSaveOption = settingsRepository.defaultSaveOption, sharedAccountsState = authenticatorRepository.sharedCodesStateFlow.value, @@ -323,13 +318,12 @@ class SettingsViewModel @Inject constructor( unlockWithBiometricsEnabled: Boolean, isSubmitCrashLogsEnabled: Boolean, accountSyncState: AccountSyncState, - isSyncWithBitwardenFeatureEnabled: Boolean, sharedAccountsState: SharedVerificationCodesState, ): SettingsState { val currentYear = Year.now(clock) val copyrightInfo = "© Bitwarden Inc. 2015-$currentYear".asText() - // Show sync with Bitwarden row if feature is enabled and the OS is supported: - val shouldShowSyncWithBitwarden = isSyncWithBitwardenFeatureEnabled && + // Show sync with Bitwarden row if the OS is supported: + val shouldShowSyncWithBitwarden = accountSyncState != AccountSyncState.OsVersionNotSupported // Show default save options only if the user had enabled sync with Bitwarden: // (They can enable it via the "Sync with Bitwarden" row. diff --git a/authenticator/src/main/res/values/strings.xml b/authenticator/src/main/res/values/strings.xml index 645ee2280d..131136ed15 100644 --- a/authenticator/src/main/res/values/strings.xml +++ b/authenticator/src/main/res/values/strings.xml @@ -115,7 +115,7 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app - This feature is not yet available for self-hosted users. Learn more + Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s (%3$d) Sync with the Bitwarden app diff --git a/authenticator/src/main/res/values/strings_non_localized.xml b/authenticator/src/main/res/values/strings_non_localized.xml index 44646409b4..83fddd5751 100644 --- a/authenticator/src/main/res/values/strings_non_localized.xml +++ b/authenticator/src/main/res/values/strings_non_localized.xml @@ -14,6 +14,5 @@ Debug Menu Reset values Bitwarden authentication enabled - Password manager sync diff --git a/authenticator/src/test/kotlin/com/bitwarden/authenticator/data/authenticator/repository/AuthenticatorRepositoryTest.kt b/authenticator/src/test/kotlin/com/bitwarden/authenticator/data/authenticator/repository/AuthenticatorRepositoryTest.kt index 33000f3f05..659a1df199 100644 --- a/authenticator/src/test/kotlin/com/bitwarden/authenticator/data/authenticator/repository/AuthenticatorRepositoryTest.kt +++ b/authenticator/src/test/kotlin/com/bitwarden/authenticator/data/authenticator/repository/AuthenticatorRepositoryTest.kt @@ -9,9 +9,7 @@ import com.bitwarden.authenticator.data.authenticator.manager.model.Verification import com.bitwarden.authenticator.data.authenticator.repository.model.AuthenticatorItem import com.bitwarden.authenticator.data.authenticator.repository.model.SharedVerificationCodesState import com.bitwarden.authenticator.data.authenticator.repository.util.toAuthenticatorItems -import com.bitwarden.authenticator.data.platform.manager.FeatureFlagManager import com.bitwarden.authenticator.data.platform.manager.imports.ImportManager -import com.bitwarden.authenticator.data.platform.manager.model.FlagKey import com.bitwarden.authenticator.data.platform.repository.SettingsRepository import com.bitwarden.authenticatorbridge.manager.AuthenticatorBridgeManager import com.bitwarden.authenticatorbridge.manager.model.AccountSyncState @@ -45,15 +43,6 @@ class AuthenticatorRepositoryTest { private val mockFileManager = mockk() private val mockImportManager = mockk() private val mockDispatcherManager = FakeDispatcherManager() - private val mutablePasswordSyncFlagStateFlow = MutableStateFlow(true) - private val mockFeatureFlagManager = mockk { - every { - getFeatureFlagFlow(FlagKey.PasswordManagerSync) - } returns mutablePasswordSyncFlagStateFlow - every { - getFeatureFlag(FlagKey.PasswordManagerSync) - } returns mutablePasswordSyncFlagStateFlow.value - } private val settingsRepository: SettingsRepository = mockk { every { previouslySyncedBitwardenAccountIds } returns emptySet() } @@ -61,7 +50,6 @@ class AuthenticatorRepositoryTest { private val authenticatorRepository = AuthenticatorRepositoryImpl( authenticatorDiskSource = fakeAuthenticatorDiskSource, authenticatorBridgeManager = mockAuthenticatorBridgeManager, - featureFlagManager = mockFeatureFlagManager, totpCodeManager = mockTotpCodeManager, fileManager = mockFileManager, importManager = mockImportManager, @@ -89,29 +77,6 @@ class AuthenticatorRepositoryTest { } } - @Test - fun `sharedCodesStateFlow value should be FeatureNotEnabled when feature flag is off`() = - runTest { - val repository = AuthenticatorRepositoryImpl( - authenticatorDiskSource = fakeAuthenticatorDiskSource, - authenticatorBridgeManager = mockAuthenticatorBridgeManager, - featureFlagManager = mockFeatureFlagManager, - totpCodeManager = mockTotpCodeManager, - fileManager = mockFileManager, - importManager = mockImportManager, - dispatcherManager = mockDispatcherManager, - settingRepository = settingsRepository, - ) - mutablePasswordSyncFlagStateFlow.value = false - mutableAccountSyncStateFlow.value = AccountSyncState.Success(emptyList()) - repository.sharedCodesStateFlow.test { - assertEquals( - SharedVerificationCodesState.FeatureNotEnabled, - awaitItem(), - ) - } - } - @Test fun `ciphersStateFlow should emit sorted authenticator items when disk source changes`() = runTest { @@ -123,27 +88,6 @@ class AuthenticatorRepositoryTest { ) } - @Test - fun `sharedCodesStateFlow should emit FeatureNotEnabled when feature flag is off`() = runTest { - val repository = AuthenticatorRepositoryImpl( - authenticatorDiskSource = fakeAuthenticatorDiskSource, - authenticatorBridgeManager = mockAuthenticatorBridgeManager, - featureFlagManager = mockFeatureFlagManager, - totpCodeManager = mockTotpCodeManager, - fileManager = mockFileManager, - importManager = mockImportManager, - dispatcherManager = mockDispatcherManager, - settingRepository = settingsRepository, - ) - mutablePasswordSyncFlagStateFlow.value = false - repository.sharedCodesStateFlow.test { - assertEquals( - SharedVerificationCodesState.FeatureNotEnabled, - awaitItem(), - ) - } - } - @Suppress("MaxLineLength") @Test fun `sharedCodesStateFlow should emit AppNotInstalled when authenticatorBridgeManager emits AppNotInstalled`() = diff --git a/authenticator/src/test/kotlin/com/bitwarden/authenticator/data/platform/manager/FeatureFlagManagerTest.kt b/authenticator/src/test/kotlin/com/bitwarden/authenticator/data/platform/manager/FeatureFlagManagerTest.kt index cf423d0890..c77fa0e5c4 100644 --- a/authenticator/src/test/kotlin/com/bitwarden/authenticator/data/platform/manager/FeatureFlagManagerTest.kt +++ b/authenticator/src/test/kotlin/com/bitwarden/authenticator/data/platform/manager/FeatureFlagManagerTest.kt @@ -73,7 +73,7 @@ class FeatureFlagManagerTest { ) val flagValue = manager.getFeatureFlag( - key = FlagKey.PasswordManagerSync, + key = FlagKey.DummyBoolean, forceRefresh = false, ) assertFalse(flagValue) @@ -169,7 +169,7 @@ class FeatureFlagManagerTest { fakeServerConfigRepository.serverConfigValue = null val flagValue = manager.getFeatureFlag( - key = FlagKey.PasswordManagerSync, + key = FlagKey.DummyBoolean, forceRefresh = false, ) diff --git a/authenticator/src/test/kotlin/com/bitwarden/authenticator/data/platform/manager/FlagKeyTest.kt b/authenticator/src/test/kotlin/com/bitwarden/authenticator/data/platform/manager/FlagKeyTest.kt index b4af889e08..5fb18a612b 100644 --- a/authenticator/src/test/kotlin/com/bitwarden/authenticator/data/platform/manager/FlagKeyTest.kt +++ b/authenticator/src/test/kotlin/com/bitwarden/authenticator/data/platform/manager/FlagKeyTest.kt @@ -12,10 +12,6 @@ class FlagKeyTest { FlagKey.BitwardenAuthenticationEnabled.keyName, "bitwarden-authentication-enabled", ) - assertEquals( - FlagKey.PasswordManagerSync.keyName, - "enable-pm-bwa-sync", - ) } @Test @@ -23,7 +19,6 @@ class FlagKeyTest { assertTrue( listOf( FlagKey.BitwardenAuthenticationEnabled, - FlagKey.PasswordManagerSync, ).all { !it.defaultValue }, diff --git a/authenticator/src/test/kotlin/com/bitwarden/authenticator/data/platform/repository/DebugMenuRepositoryTest.kt b/authenticator/src/test/kotlin/com/bitwarden/authenticator/data/platform/repository/DebugMenuRepositoryTest.kt index eada73d1b4..41e9af7860 100644 --- a/authenticator/src/test/kotlin/com/bitwarden/authenticator/data/platform/repository/DebugMenuRepositoryTest.kt +++ b/authenticator/src/test/kotlin/com/bitwarden/authenticator/data/platform/repository/DebugMenuRepositoryTest.kt @@ -98,10 +98,6 @@ class DebugMenuRepositoryTest { runTest { debugMenuRepository.resetFeatureFlagOverrides() verify(exactly = 1) { - mockFeatureFlagOverrideDiskSource.saveFeatureFlag( - FlagKey.PasswordManagerSync, - FlagKey.PasswordManagerSync.defaultValue, - ) mockFeatureFlagOverrideDiskSource.saveFeatureFlag( FlagKey.BitwardenAuthenticationEnabled, FlagKey.BitwardenAuthenticationEnabled.defaultValue, diff --git a/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/DebugMenuScreenTest.kt b/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/DebugMenuScreenTest.kt index 776dccb912..2f80cac643 100644 --- a/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/DebugMenuScreenTest.kt +++ b/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/DebugMenuScreenTest.kt @@ -52,7 +52,7 @@ class DebugMenuScreenTest : AuthenticatorComposeTest() { @Test fun `feature flag content should not display if the state is empty`() { composeTestRule - .onNodeWithText("Password manager sync", ignoreCase = true) + .onNodeWithText("Bitwarden authentication enabled", ignoreCase = true) .assertDoesNotExist() } @@ -61,13 +61,13 @@ class DebugMenuScreenTest : AuthenticatorComposeTest() { mutableStateFlow.tryEmit( DebugMenuState( featureFlags = mapOf( - FlagKey.PasswordManagerSync to true, + FlagKey.BitwardenAuthenticationEnabled to true, ), ), ) composeTestRule - .onNodeWithText("Password manager sync", ignoreCase = true) + .onNodeWithText("Bitwarden authentication enabled", ignoreCase = true) .assertExists() } @@ -76,18 +76,18 @@ class DebugMenuScreenTest : AuthenticatorComposeTest() { mutableStateFlow.tryEmit( DebugMenuState( featureFlags = mapOf( - FlagKey.PasswordManagerSync to true, + FlagKey.BitwardenAuthenticationEnabled to true, ), ), ) composeTestRule - .onNodeWithText("Password manager sync", ignoreCase = true) + .onNodeWithText("Bitwarden authentication enabled", ignoreCase = true) .performClick() verify { viewModel.trySendAction( DebugMenuAction.UpdateFeatureFlag( - FlagKey.PasswordManagerSync, + FlagKey.BitwardenAuthenticationEnabled, false, ), ) diff --git a/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/DebugMenuViewModelTest.kt b/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/DebugMenuViewModelTest.kt index a9d4a81e1a..ae348eed8f 100644 --- a/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/DebugMenuViewModelTest.kt +++ b/authenticator/src/test/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/DebugMenuViewModelTest.kt @@ -64,9 +64,11 @@ class DebugMenuViewModelTest : BaseViewModelTest() { fun `handleUpdateFeatureFlag should update the feature flag via the repository`() { val viewModel = createViewModel() viewModel.trySendAction( - DebugMenuAction.UpdateFeatureFlag(FlagKey.PasswordManagerSync, false), + DebugMenuAction.UpdateFeatureFlag(FlagKey.BitwardenAuthenticationEnabled, false), ) - verify { mockDebugMenuRepository.updateFeatureFlag(FlagKey.PasswordManagerSync, false) } + verify { + mockDebugMenuRepository.updateFeatureFlag(FlagKey.BitwardenAuthenticationEnabled, false) + } } private fun createViewModel(): DebugMenuViewModel = DebugMenuViewModel( @@ -77,12 +79,10 @@ class DebugMenuViewModelTest : BaseViewModelTest() { private val DEFAULT_MAP_VALUE: Map, Any> = mapOf( FlagKey.BitwardenAuthenticationEnabled to true, - FlagKey.PasswordManagerSync to true, ) private val UPDATED_MAP_VALUE: Map, Any> = mapOf( FlagKey.BitwardenAuthenticationEnabled to false, - FlagKey.PasswordManagerSync to false, ) private val DEFAULT_STATE = DebugMenuState( 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 0fa129d8be..0511188431 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 @@ -7,9 +7,7 @@ import com.bitwarden.authenticator.R import com.bitwarden.authenticator.data.authenticator.repository.AuthenticatorRepository import com.bitwarden.authenticator.data.authenticator.repository.model.SharedVerificationCodesState import com.bitwarden.authenticator.data.authenticator.repository.util.isSyncWithBitwardenEnabled -import com.bitwarden.authenticator.data.platform.manager.FeatureFlagManager import com.bitwarden.authenticator.data.platform.manager.clipboard.BitwardenClipboardManager -import com.bitwarden.authenticator.data.platform.manager.model.FlagKey import com.bitwarden.authenticator.data.platform.repository.SettingsRepository import com.bitwarden.authenticator.ui.platform.feature.settings.appearance.model.AppLanguage import com.bitwarden.authenticator.ui.platform.feature.settings.data.model.DefaultSaveOption @@ -58,9 +56,6 @@ class SettingsViewModelTest : BaseViewModelTest() { every { isCrashLoggingEnabled } returns true } private val clipboardManager: BitwardenClipboardManager = mockk() - private val featureFlagManager: FeatureFlagManager = mockk { - every { getFeatureFlag(FlagKey.PasswordManagerSync) } returns true - } @BeforeEach fun setup() { @@ -74,25 +69,7 @@ class SettingsViewModelTest : BaseViewModelTest() { } @Test - @Suppress("MaxLineLength") - fun `initialState should be correct when saved state is null and password manager feature flag is off`() { - every { - featureFlagManager.getFeatureFlag(FlagKey.PasswordManagerSync) - } returns false - val viewModel = createViewModel(savedState = null) - val expectedState = DEFAULT_STATE.copy( - showSyncWithBitwarden = false, - showDefaultSaveOptionRow = false, - ) - assertEquals( - expectedState, - viewModel.stateFlow.value, - ) - } - - @Test - @Suppress("MaxLineLength") - fun `initialState should be correct when saved state is null and password manager feature flag is on but OS version is too low`() { + fun `initialState should be correct when saved state is null but OS version is too low`() { every { authenticatorBridgeManager.accountSyncStateFlow } returns MutableStateFlow(AccountSyncState.OsVersionNotSupported) @@ -108,14 +85,10 @@ class SettingsViewModelTest : BaseViewModelTest() { } @Test - @Suppress("MaxLineLength") - fun `initialState should be correct when saved state is null and password manager feature flag is on and OS version is supported`() { + fun `initialState should be correct when saved state is null and OS version is supported`() { every { authenticatorBridgeManager.accountSyncStateFlow } returns MutableStateFlow(AccountSyncState.Loading) - every { - featureFlagManager.getFeatureFlag(FlagKey.PasswordManagerSync) - } returns true val viewModel = createViewModel(savedState = null) val expectedState = DEFAULT_STATE.copy( showSyncWithBitwarden = true, @@ -233,7 +206,6 @@ class SettingsViewModelTest : BaseViewModelTest() { authenticatorRepository = authenticatorRepository, settingsRepository = settingsRepository, clipboardManager = clipboardManager, - featureFlagManager = featureFlagManager, ) } From 390ef34398a0f5a01247672a990a503c25a56b7f Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Fri, 11 Jul 2025 09:27:43 -0400 Subject: [PATCH 3/6] Crowdin Pull - Authenticator (#5516) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- .../src/main/res/values-de-rDE/strings.xml | 8 +- .../src/main/res/values-es-rES/strings.xml | 12 +-- .../src/main/res/values-pl-rPL/strings.xml | 8 +- .../src/main/res/values-ru-rRU/strings.xml | 4 +- .../src/main/res/values-sv-rSE/strings.xml | 100 +++++++++--------- .../src/main/res/values-uk-rUA/strings.xml | 18 ++-- 6 files changed, 75 insertions(+), 75 deletions(-) diff --git a/authenticator/src/main/res/values-de-rDE/strings.xml b/authenticator/src/main/res/values-de-rDE/strings.xml index 33b0bb168e..038bdbd3e7 100644 --- a/authenticator/src/main/res/values-de-rDE/strings.xml +++ b/authenticator/src/main/res/values-de-rDE/strings.xml @@ -142,8 +142,8 @@ "Datei konnte nicht verarbeitet werden. Stelle sicher, dass es sich um ein gültiges JSON handelt und versuche es erneut. Benötigst du Hilfe? Besuche bitwarden.com/help" Hilfe erhalten Erweiterte Optionen ausklappen - Local items are expanded, click to collapse. - Local items are collapsed, click to expand. - Items are expanded, click to collapse. - Items are collapsed, click to expand. + Lokale Einträge sind ausgeklappt, klicke zum Einklappen. + Lokale Einträge sind eingeklappt, klicke zum Ausklappen. + Einträge sind ausgeklappt, klicke zum Einklappen. + Einträge sind eingeklappt, klicke zum Ausklappen. diff --git a/authenticator/src/main/res/values-es-rES/strings.xml b/authenticator/src/main/res/values-es-rES/strings.xml index 547e1c7af7..8d7e2e90f5 100644 --- a/authenticator/src/main/res/values-es-rES/strings.xml +++ b/authenticator/src/main/res/values-es-rES/strings.xml @@ -124,7 +124,7 @@ Llévame a la configuración de la aplicación Algo salió mal Por favor, reinténtalo - Copy to Bitwarden vault + Copiar a caja fuerte de Bitwarden Ajuste de guardado por defecto Guardar en Bitwarden Guardar aquí @@ -141,9 +141,9 @@ "No se pudo procesar el archivo" "No se pudo procesar el archivo. Asegúrate de que sea un JSON válido e inténtalo de nuevo. ¿Necesitas ayuda? Visita bitwarden.com/help" Obtener ayuda - Expand advanced options - Local items are expanded, click to collapse. - Local items are collapsed, click to expand. - Items are expanded, click to collapse. - Items are collapsed, click to expand. + Expandir opciones avanzadas + Los elementos locales están expandidos, clic para colapsar. + Los elementos locales están colapsados, clic para expandir. + Los elementos están expandidos, clic para colapsar. + Los elementos están colapsados, clic para expandir. diff --git a/authenticator/src/main/res/values-pl-rPL/strings.xml b/authenticator/src/main/res/values-pl-rPL/strings.xml index aa746692be..fd89048ab1 100644 --- a/authenticator/src/main/res/values-pl-rPL/strings.xml +++ b/authenticator/src/main/res/values-pl-rPL/strings.xml @@ -142,8 +142,8 @@ "Plik nie może być przetworzony. Upewnij się, że plik JSON jest prawidłowy i spróbuj ponownie. Potrzebujesz pomocy? Odwiedź bitwarden.com/help" Uzyskaj pomoc Rozwiń zaawansowane opcje - Local items are expanded, click to collapse. - Local items are collapsed, click to expand. - Items are expanded, click to collapse. - Items are collapsed, click to expand. + Lokalne elementy są rozwinięte, kliknij, aby zwinąć. + Lokalne elementy są zwijane, kliknij, aby rozwinąć. + Elementy są rozwinięte, kliknij, aby zwinąć. + Elementy są zwinięte, kliknij, aby rozwinąć. diff --git a/authenticator/src/main/res/values-ru-rRU/strings.xml b/authenticator/src/main/res/values-ru-rRU/strings.xml index 28d34e0e75..66f29d8dcb 100644 --- a/authenticator/src/main/res/values-ru-rRU/strings.xml +++ b/authenticator/src/main/res/values-ru-rRU/strings.xml @@ -61,7 +61,7 @@ Защитите свои учетные записи с помощью аутентификатора Bitwarden Получите коды проверки для всех ваших учетных записей, поддерживающих 2-этапную проверку. Используйте камеру вашего устройства для сканирования кодов - Сканируйте QR-код в настройках + Сканируйте QR-код в настройках 2-этапной верификации для любой учетной записи. Авторизуйтесь с помощью уникальных кодов При использовании 2-этапной верификации вы введете свое имя пользователя, пароль и код, сгенерированный в этом приложении. @@ -79,7 +79,7 @@ Подтвердите экспорт Этот экспорт содержит ваши данные в незашифрованном формате. Не следует хранить или отправлять экспортированный файл по незащищенным каналам (например, по электронной почте). Удалите его сразу после завершения работы. Формат файла - Возникла проблема с экспортом вашего хранилища. Если проблема сохраняется, вам нужно экспортировать из + Возникла проблема с экспортом вашего хранилища. Если проблема сохраняется, вам нужно экспортировать из веб хранилища. Данные успешно экспортированы Разблокируйте с помощью %1$s diff --git a/authenticator/src/main/res/values-sv-rSE/strings.xml b/authenticator/src/main/res/values-sv-rSE/strings.xml index c44bd1b2ef..fd71f7a265 100644 --- a/authenticator/src/main/res/values-sv-rSE/strings.xml +++ b/authenticator/src/main/res/values-sv-rSE/strings.xml @@ -4,52 +4,52 @@ Avbryt Lägg till objekt Ett fel har inträffat. - We were unable to process your request. Please try again or contact us. + Vi kunde inte behandla din begäran. Försök igen eller kontakta oss. Internetanslutning krävs Anslut till internet innan du fortsätter. - Okay + Okej Synkroniserar Kopiera Redigera Stäng Bitwarden Authenticator Namn - Add Item Rotation + Lägg till objektrotation Skanna en QR-kod Skanna QR-kod Rikta din kamera mot QR-koden. - Cannot scan QR code? Enter key manually + Kan inte skanna QR-koden? Ange nyckeln manuellt Ange nyckel manuellt. - Cannot add authenticator key? + Kan inte lägga till authenticator-nyckeln? Nej tack Inställningar Bevilja kamerabehörighet för att använda skannern - Empty Item Listing + Tom objektlistning Du har inga objekt att visa. Lägg till en ny kod för att säkra dina konton. Lägg till kod - Cannot read key. + Kan inte läsa nyckel. Verifieringskod har lagts till Användarnamn - Refresh period + Uppdateringstid Algoritm Dölj Visa Avancerat - Collapse advanced options + Fäll in avancerade alternativ Antal siffror Spara - The %1$s field is required. + Fältet %1$s krävs. %d sekunder Sparar Objekt sparat Information - OTP type + OTP-typ Verifieringskoder - There are no items that match the search + Det finns inga objekt som matchar sökningen Tillbaka Rensa - Search codes + Sök koder Alternativ Försök igen Utseende @@ -57,19 +57,19 @@ Tema Mörkt Ljust - The language has been changed to %1$s. Please restart the app to see the change + Språket har ändrats till %1$s. Starta om appen för att aktivera ändringen Säkra dina konton med Bitwarden Authenticator - Get verification codes for all your accounts that support 2-step verification. + Få verifieringskoder för alla dina konton som stöder tvåstegsverifiering. Använd enhetens kamera för att skanna koder - Scan the QR code in your 2-step verification settings for any account. + Skanna QR-koden i inställningarna för din tvåstegsverifiering för alla konton. Logga in med unika koder - When using 2-step verification, you\'ll enter your username and password and a code generated in this app. + När du använder tvåstegsverifiering anger du ditt användarnamn och lösenord samt en kod som genereras i den här appen. Hoppa över Hjälp - Launch tutorial + Starta handledning %1$s kopierades Radera objekt - Item deleted + Objekt togs bort Radera Är du säker på att du vill radera permanent? Detta går inte att ångra. Data @@ -79,12 +79,12 @@ Denna export innehåller din data i ett okrypterat format. Du bör inte lagra eller skicka den exporterade filen över osäkra kanaler (t.ex. e-post). Radera den omedelbart när du är färdig med den. Filformat Det gick inte att exportera ditt valv. Om problemet kvarstår måste du exportera från webbvalvet istället. - Data exported successfully + Dataexporten lyckades Lås upp med %1$s Biometri Säkerhet - Use biometrics to unlock - Too many failed biometrics attempts. + Använd biometri för att låsa upp + För många misslyckade biometriska försök. Om Version Fortsätt @@ -96,54 +96,54 @@ Kolla in vår integritetspolicy på bitwarden.com Nyckel Skapa verifieringskod - Key is required. - Name is required. + Nyckel krävs. + Namn krävs. Skicka kraschloggar - There was a problem importing your vault. - File Source + Det uppstod ett problem vid import av ditt valv. + Filkälla Importera - Vault import successful + Import av valv lyckades Nyckel är ogiltig. Favorit Favoriter - Backup - Data backup + Säkerhetskopiera + Säkerhetskopierad data Bitwarden Authenticator-data säkerhetskopieras och kan återställas med dina regelbundna schemalagda säkerhetskopior. Läs mer - Importing from 2FAS password protected files is not supported. Try again with an exported file that is not password protected. + Importera från 2FAS-lösenordsskyddade filer stöds inte. Försök igen med en exporterad fil som inte är lösenordsskyddad. Import av Bitwarden CSV-filer stöds inte. Försök igen med en exporterad JSON-fil. - Download the Bitwarden app + Ladda ner Bitwarden-appen Spara alla inloggningar och synkronisera verifieringskoder direkt med Authenticator-appen. - Download now + Ladda ner nu Synkronisera med Bitwarden-appen - This feature is not yet available for self-hosted users. Learn more - Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. + Denna funktion är ännu inte tillgänglig för användare med egen hosting. Läs mer + Det går inte att synkronisera koder från Bitwarden-appen. Se till att båda apparna är uppdaterade. Du kan fortfarande komma åt dina befintliga koder i Bitwarden-appen. %1$s | %2$s Synkronisera med Bitwarden-appen - In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. - Take me to the app settings + För att kunna se alla dina verifieringskoder måste du tillåta synkronisering på alla dina konton. + Ta mig till appinställningarna Något gick fel Försök igen - Copy to Bitwarden vault - Default save option + Kopiera till Bitwarden-valv + Standardalternativ Spara på Bitwarden Spara här Ingen - Select where you would like to save new verification codes. + Välj var du vill spara nya verifieringskoder. Bekräfta Verifieringskod skapades - Save this authenticator key here, or add it to a login in your Bitwarden app. + Spara denna autentiseringsnyckel här eller lägg till den i en inloggning i din Bitwarden-app. Spara alternativ som standard Konto synkroniserat från Bitwarden-appen Lokala koder - Required Information Missing - "Required info is missing (e.g., ‘services’ or ‘secret’). Check your file and try again. Visit bitwarden.com/help for support" - "File Could Not Be Processed" - "File could not be processed. Ensure it’s valid JSON and try again. Need help? Visit bitwarden.com/help" - Get Help - Expand advanced options - Local items are expanded, click to collapse. - Local items are collapsed, click to expand. - Items are expanded, click to collapse. - Items are collapsed, click to expand. + Nödvändig information saknas + "Nödvändig information saknas (t.ex. ”services” eller ”secret”). Kontrollera din fil och försök igen. Besök bitwarden.com/help för support." + "Filen kunde inte behandlas" + "Filen kunde inte bearbetas. Kontrollera att det är giltig JSON och försök igen. Behöver du hjälp? Besök bitwarden.com/help" + Få hjälp + Expandera avancerade alternativ + Lokala objekt är expanderade, klicka för att fälla in. + Lokala objekt är infällda, klicka för att expandera. + Objekt är expanderade, klicka för att fälla in. + Objekt är infällda, klicka för att expandera. diff --git a/authenticator/src/main/res/values-uk-rUA/strings.xml b/authenticator/src/main/res/values-uk-rUA/strings.xml index 4b070cd691..da107ede1f 100644 --- a/authenticator/src/main/res/values-uk-rUA/strings.xml +++ b/authenticator/src/main/res/values-uk-rUA/strings.xml @@ -18,7 +18,7 @@ Сканувати QR-код Сканувати QR-код Наведіть камеру на QR-код. - Cannot scan QR code? Enter key manually + Не можете сканувати QR-код? Введіть ключ вручну Введіть ключ вручну. Не вдається додати ключ автентифікації? Ні, дякую @@ -118,13 +118,13 @@ Синхронізувати з програмою Bitwarden Ця функція ще недоступна користувачам із власним розміщенням сховища. Докладніше Неможливо синхронізувати коди з програмою Bitwarden. Переконайтеся, що у вас найновіші версії обох програм. Ви все одно можете отримати доступ до наявних кодів у програмі Bitwarden. - %1$s | %2$s + %1$s | %2$s (%3$d) Синхронізувати з програмою Bitwarden Щоб переглянути всі коди підтвердження, необхідно дозволити синхронізацію з усіма вашими обліковими записами. Перейти до налаштувань програми Щось пішло не так Повторіть спробу - Copy to Bitwarden vault + Копіювати в сховище Bitwarden Типовий параметр збереження Зберегти в Bitwarden Зберегти тут @@ -135,15 +135,15 @@ Збережіть цей ключ автентифікації тут, або додайте його до запису в програмі Bitwarden. Зробити цю дію типовою Обліковий запис синхронізовано з програми Bitwarden - Локальні коди + Локальні коди (%1$d) Відсутня необхідна інформація "Необхідна інформація відсутня (наприклад, 'services' або 'secret'). Перевірте свій файл і повторіть спробу. Відвідайте bitwarden.com/help для підтримки" "Неможливо обробити файл" "Не вдалося обробити файл. Перевірте правильність JSON і повторіть спробу. Потрібна допомога? Відвідайте bitwarden.com/help" Отримати допомогу - Expand advanced options - Local items are expanded, click to collapse. - Local items are collapsed, click to expand. - Items are expanded, click to collapse. - Items are collapsed, click to expand. + Розгорнути додаткові налаштування + Локальні записи розгорнуто. Натисніть, щоб згорнути. + Локальні записи згорнуто. Натисніть, щоб розгорнути. + Записи розгорнуто. Натисніть, щоб згорнути. + Записи згорнуто. Натисніть, щоб розгорнути. From 557c5b46a55810ef04eaa5a2f1865f9c385491cf Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Fri, 11 Jul 2025 09:28:24 -0400 Subject: [PATCH 4/6] Crowdin Pull - Password Manager (#5517) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- app/src/main/res/values-es-rES/strings.xml | 70 +- app/src/main/res/values-fa-rIR/strings.xml | 58 +- app/src/main/res/values-it-rIT/strings.xml | 272 +++---- app/src/main/res/values-ja-rJP/strings.xml | 86 +-- app/src/main/res/values-pl-rPL/strings.xml | 16 +- app/src/main/res/values-sv-rSE/strings.xml | 294 ++++---- app/src/main/res/values-uk-rUA/strings.xml | 30 +- app/src/main/res/values-vi-rVN/strings.xml | 820 ++++++++++----------- 8 files changed, 823 insertions(+), 823 deletions(-) diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 7930866848..bf16e2a9f8 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -382,7 +382,7 @@ El escaneo se realizará automáticamente. ¡Código Enviado! Confirme su identidad para continuar. Ésta exportación contiene sus datos de la caja fuerte en un formato no cifrado. No debería almacenar o enviar el archivo exportado por canales no seguros (como el correo electrónico). Elimínelo inmediatamente cuando termine de utilizarlo. - This file export will be password protected and require the file password to decrypt. + Esta exportación de archivo estará protegida por contraseña, y requerirá la contraseña del archivo para descifrarla. Confirmar exportación de la caja fuerte Advertencia Hubo un problema al exportar su caja fuerte. Si el problema persiste, deberá exportar desde la caja fuerte en la web. @@ -432,7 +432,7 @@ El escaneo se realizará automáticamente. Required to use the Autofill Quick-Action Tile. Una política de organización está afectando sus opciones de propiedad. Send - Send Details + Detalles del Send Todos los Sends Texto Texto a compartir @@ -456,20 +456,20 @@ El escaneo se realizará automáticamente. Opcionalmente requieren una contraseña para que los usuarios accedan al Send. Eliminar contraseña Eliminando contraseña - Password removed + Contraseña eliminada Añadir un Send Copiar enlace Compartir enlace Enlace Send Buscar Sends Editar Send - Edit file Send - Edit text Send - New file Send - New text Send + Editar Send de archivo + Editar Send de texto + Nuevo Send de archivo + Nuevo Send de texto ¿Seguro que quieres eliminar este Send? Send eliminado - Send updated + Send actualizado 1 día 2 días 3 días @@ -631,7 +631,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Aprobar con contraseña maestra Deshabilitar usando un dispositivo público Recordar este dispositivo - Passkey + Clave de acceso La contraseña maestra no será copiada La contraseña maestra no será copiada al elemento clonado. ¿Deseas continuar clonando este elemento? @@ -695,15 +695,15 @@ seleccione Agregar TOTP para almacenar la clave de forma segura La operación de la clave de acceso falló porque la aplicación no pudo ser verificada Confirmar contraseña del archivo Contraseña del archivo - Password Protected + Protegido con Contraseña Esta contraseña se usará para exportar e importar este archivo Sugerencias de autocompletado Continue to complete WebAuthn verification. - Launch WebAuthn - There was an error starting WebAuthn two factor authentication + Iniciar WebAuthn + Hubo un error al iniciar autenticación de doble factor WebAuthn Self-hosted server URL La operación de la clave de acceso falló porque el usuario no pudo ser verificado. - User verification + Verificación de usuario Crea una cuenta en Crea una cuenta en: Hemos enviado un correo electrónico a %1$s. @@ -719,13 +719,13 @@ seleccione Agregar TOTP para almacenar la clave de forma segura 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. + 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. Eliminar clave de acceso Clave de acceso eliminada - What makes a password strong? - A secure, memorable password + ¿Qué hace segura una contraseña? + Una contraseña segura y memorable Configuración de la cuenta Set up unlock Configurar más tarde @@ -767,12 +767,12 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Activar más tarde ¿Activar autocompletado más tarde? 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! + Ahora puedes explorar todo lo que Bitwarden ofrece y empezar a gestionar tus contraseñas de forma segura. + ¡Todo listo! 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 + 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 @@ -794,7 +794,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Export your passwords. This option is usually found in your settings. Select Import data in the web app, then Done below to finish syncing. Paso 1 de 3 - Export your saved logins + Exportar tus inicios de sesión guardados You’ll delete this file after import is complete. On your computer, open a new browser tab and go to %1$s Inicia sesión en la aplicación web de Bitwarden. @@ -821,7 +821,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Entendido No se importaron inicios de sesión Error de importación - Logins imported + Inicios de sesión importados Recuerda eliminar tu archivo de contraseñas importado de tu ordenador Clave SSH Clave pública @@ -849,7 +849,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura CXP Export Elige tres o cuatro palabras aleatorias Elige tres o cuatro palabras aleatorias sin relación que puedas memorizar fácilmente. Piensa en objetos, lugares o cosas que te gusten. - Combine those words together + Combinar estas palabras juntas Put the words together in any order to form your passphrase. Use hyphens, spaces, or leave them as one long word—your choice! Hazlo tuyo Add a number or symbol to make it even stronger. Now you have a unique, secure, and memorable passphrase! @@ -872,7 +872,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura 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. + Saber más acerca de generar credenciales seguras de inicio de sesión con un tour guiado. Importar certificado de cliente Introduce la contraseña del certificado de cliente y el alias deseado para este certificado. Alias @@ -959,14 +959,14 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Ajustes de la aplicación ¿Reemplazar certificado existente? 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. - Replace certificate + Reemplazar certificado No se puede leer el certificado. No se puede eliminar tu cuenta Esta acción no se puede completar porque tu cuenta es de propiedad de una organización. Contacta con el administrador de tu organización para más detalles. This account will soon be deleted. Log in at %1$s to continue using Bitwarden. - View file Send - View text Send - Delete Send + Ver Send de archivo + Ver Send de texto + Eliminar Send Missing Send re-sync your vault Colores dinámicos Aplicar colores dinámicos en base a tu fondo de pantalla @@ -982,12 +982,12 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Confiado por Google To protect users from phishing attempts, by default, Bitwarden only completes passkey operations through applications or web browsers trusted by Google or the Bitwarden community. Acerca de las aplicaciones privilegiadas - Learn more about privileged apps + Saber más acerca de las aplicaciones privilegiadas Aplicaciones privilegiadas Navegador no reconocido - Learn more about using passkeys with Bitwarden. - All trusted apps - Are you sure you want to stop trusting %s? - Installed apps - Delete %s + Saber más acerca del uso de claves de acceso en Bitwarden. + Todas las aplicaciones de confianza + ¿Estás seguro de que quieres dejar de confiar en %s? + Aplicaciones instaladas + Eliminar %s diff --git a/app/src/main/res/values-fa-rIR/strings.xml b/app/src/main/res/values-fa-rIR/strings.xml index 00e88c5e4b..cf9e78740a 100644 --- a/app/src/main/res/values-fa-rIR/strings.xml +++ b/app/src/main/res/values-fa-rIR/strings.xml @@ -296,9 +296,9 @@ پر کردن خودکار و ذخیره سازمان دوباره تلاش کن - Created: %1$s - Password last updated: %1$s - Last edited: %1$s + ساخته شده: %1$s + کلمه عبور آخرین بار به‌روزرسانی شده: %1$s + آخرین ویرایش: %1$s نشانی ایمیل نامعتبر است. کارت‌ها هویت‌ها @@ -425,9 +425,9 @@ سیاست حفظ حریم خصوصی مدیریت کلید عبور سرویس‌های پر کردن خودکار - Display autofill suggestions - Inline (shows in keyboard) - Popup (shows over input field) + نمایش پیشنهادهای پر کردن خودکار + درون‌خطی (روی صفحه‌کلید نمایش داده می‌شود) + پنجره‌ی بازشونده (بالای فیلد ورودی نمایش داده می‌شود) از قابلیت دسترسی استفاده کنید برای استفاده از کاشی اقدام سریع پر کردن خودکار لازم است. سیاست سازمانی بر تنظیمات مالکیت شما تأثیر می‌گذارد. @@ -456,7 +456,7 @@ به صورت اختیاری برای دسترسی کاربران به این ارسال به یک کلمه عبور نیاز دارید. حذف کلمه عبور حذف کلمه عبور - Password removed + کلمه عبور حذف شد افزودن یک ارسال کپی پیوند اشتراک گذاری پیوند @@ -469,7 +469,7 @@ متن جدید ارسال آیا مطمئن هستید که می‌خواهید این ارسال را حذف کنید؟ ارسال حذف شد - Send updated + ارسال به‌روزرسانی شد ۱ روز ۲ روز ۳ روز @@ -551,8 +551,8 @@ نوع دستگاه نشانی IP زمان - Select time - Switch input mode + انتخاب زمان + تغییر حالت ورودی تأیید ورود رد ورود ورود رد شد @@ -677,7 +677,7 @@ سیاست حفظ حریم خصوصی ما را در bitwarden.com بررسی کنید. ویژگی‌های بیشتر حساب کاربری Bitwarden خود را در برنامه وب کاوش کنید. Bitwarden به شما اجازه می‌دهد تا با استفاده از یک سازمان، موارد گاوصندوق خود را با دیگران به اشتراک بگذارید. در وب سایت bitwarden.com بیشتر بیاموزید. - Created %1$s + ساخته شده: %1$s سازمان‌تان از شما می‌خواهد که یک کلمه عبور اصلی تنظیم کنید. یک گزینه باز کردن قفل برای پایان زمان مجاز راه‌اندازی کنید. کلید عبور را به عنوان ورود جدید ذخیره کن @@ -910,10 +910,10 @@ عملیات کلید عبور ناموفق بود زیرا هیچ موردی انتخاب نشده است. عملیات کلید عبور ناموفق بود زیرا درخواست پشتیبانی نمی‌شود. نشانی اینترنتی سرور خود میزبان - Use Brave autofill integration + استفاده از قابلیت پر کردن خودکار Brave استفاده از قابلیت پر کردن خودکار کروم استفاده از قابلیت پرکردن خودکار کروم (نسخه بتا) - Improves login filling for supported websites on selected browsers. Once enabled, you’ll be directed to browser settings to enable third-party autofill. + پر کردن خودکار ورود به حساب برای وب‌سایت‌های پشتیبانی شده در مرورگرهای انتخاب شده را بهبود می‌بخشد. پس از فعال‌سازی، به تنظیمات مرورگر هدایت می‌شوید تا پر کردن خودکار از سوی شخص ثالث را فعال کنید. نمایش بیشتر بدون پوشه نمایش کمتر @@ -973,20 +973,20 @@ عملیات کلید عبور ناموفق بود زیرا مرورگر (%1$s) مورد اعتماد نیست. گزینه \"اعتماد\" را انتخاب کنید تا %1$s به فهرست برنامه‌های مورد اعتماد افزوده شود یا \"لغو\" را برای توقف عملیات انتخاب کنید. عملیات کلید عبور ناموفق بود زیرا مرورگر مورد اعتماد نیست. اعتماد - These are applications or browsers that Bitwarden does not trust by default, but you trust to perform passkey operations. - These are applications not included in the Google Play Store, but Bitwarden trusts to perform passkey operations after community members use and report them as safe. - These are applications Google considers safe and are available in Google\'s Play Store. - Trusted by You - Trusted by the Community - Trusted by Google - To protect users from phishing attempts, by default, Bitwarden only completes passkey operations through applications or web browsers trusted by Google or the Bitwarden community. - About privileged applications - Learn more about privileged apps - Privileged apps - Unrecognized browser - Learn more about using passkeys with Bitwarden. - All trusted apps - Are you sure you want to stop trusting %s? - Installed apps - Delete %s + این‌ها برنامه‌ها یا مرورگرهایی هستند که Bitwarden به طور پیش‌فرض به آن‌ها اعتماد ندارد، اما شما به آن‌ها برای انجام عملیات کلید عبور اعتماد دارید. + این‌ها برنامه‌هایی هستند که در فروشگاه Google Play وجود ندارند، اما پس از استفاده اعضای جامعه و گزارش امن بودن، Bitwarden به آن‌ها برای انجام عملیات کلید عبور اعتماد می‌کند. + این‌ها برنامه‌هایی هستند که گوگل آن‌ها را ایمن می‌داند و در فروشگاه Google Play موجود هستند. + مورد اعتماد شما + مورد اعتماد جامعه + مورد اعتماد گوگل + برای محافظت از کاربران در برابر تلاش‌های فیشینگ، به‌صورت پیش‌فرض، Bitwarden فقط عملیات مربوط به کلیدهای عبور را از طریق برنامه‌ها یا مرورگرهای وبی انجام می‌دهد که مورد اعتماد گوگل یا جامعه‌ی Bitwarden باشند. + درباره‌ی برنامه‌های دارای امتیاز ویژه + اطلاعات بیشتر درباره‌ی برنامه‌های دارای امتیاز ویژه + برنامه‌های دارای امتیاز ویژه + مرورگر شناسایی نشده + اطلاعات بیشتر درباره‌ی استفاده از کلیدهای عبور با Bitwarden. + تمام برنامه‌های مورد اعتماد + آیا مطمئن هستید که می‌خواهید دیگر به %s اعتماد نکنید؟ + برنامه‌های نصب شده + حذف %s diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index babe6a5279..8a0e4f5481 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -11,42 +11,42 @@ Copia la password Copia il nome utente Elimina l\'elemento - Eliminazione in corso... - Vuoi davvero eliminare questo elemento? L\'azione è irreversibile. + Eliminazione in corso + Vuoi davvero eliminare questo elemento? Questa azione è irreversibile. Modifica l\'elemento Modifica la cartella Indirizzo email Indirizzo email - Inserisci il PIN + Inserisci il codice PIN Importanti Cartella - Nuova cartella creata + Cartella creata Cartella eliminata Nessuna cartella Cartelle Cartella salvata Nascondi - Connettiti a internet prima di continuare. + Verifica la connessione a internet prima di continuare Connessione a internet necessaria - Inserisci la password corretta - Inserisci il PIN corretto + Password principale non valida + Codice PIN non valido Avvia Accedi Login Esci - Vuoi davvero disconnetterti da questo account? + Vuoi davvero uscire da questo account? Rimuovi l\'account Vuoi davvero rimuovere questo account? Account già aggiunto Vuoi passare a questo account? Password principale - Password principale (obbligatoria) - Nuova parola d\'accesso principale (obbligatoria) + Password principale (necessaria) + Nuova password principale (necessaria) Altro Cassaforte Nome - Nome dell\'elemento (obbligatorio) - "Nome per l'invio (richiesto)" + Nome dell\'elemento (necessario) + "Nome del Send (necessario)" No Note Note private @@ -54,27 +54,27 @@ Password Salva Sposta - Salvataggio in corso... + Salvataggio in corso Impostazioni Mostra Elemento eliminato Continua Sincronizza URL - Sito web (URI) + Sito web (URL) Nome utente - Compila il campo \"%1$s\" - È necessario allegare un file per salvare questo Send. + Campo \"%1$s\" necessario + Allega un file per salvare questo Send %1$s copiato/a Sblocca la cassaforte - Verifica PIN + Sblocca la cassaforte Versione Visualizza l\'elemento - + Conferma Account Il tuo nuovo account è stato creato! - Imposta Bitwarden come il tuo fornitore delle passkey nelle impostazioni del dispositivo. - Evita i caratteri ambigui + Imposta Bitwarden come fornitore di passkey nelle impostazioni del dispositivo + Nessun carattere ambiguo Servizio di riempimento automatico di Bitwarden Cambio della password principale Chiudi @@ -82,18 +82,18 @@ Crea un account Crea un account Modifica l\'elemento - Modifica login - Modifica carta - Modifica identità - Modifica nota - Modifica passkey - Inserisci l\'indirizzo email dell\'account per ricevere il suggerimento per la password principale. + Modifica il login + Modifica la carta + Modifica l\'identità + Modifica la nota + Modifica la passkey + Inserisci l\'indirizzo email dell\'account per ricevere il suggerimento per la password principale Segna come importante - Non preferito + Segna come non importante Impronta digitale - Genera password + Genera una password Invia il suggerimento per la password principale - Importa elementi + Importa degli elementi Ultima sincronizzazione: Lunghezza Blocca @@ -101,124 +101,124 @@ 1 ora 1 minuto 4 ore - Immediato - La disconnessione dall\'account rimuoverà tutti gli accessi alla tua cassaforte e richiederà l\'accesso online dopo il periodo di timeout. Vuoi davvero procedere? - Accesso in corso... + Immediata + Dopo la scadenza della sessione verrà rimosso l\'accesso alla cassaforte e sarà necessario l\'accesso online. Vuoi davvero impostare questa azione? + Accesso in corso Accedi a Bitwarden - Conferma correttamente la password - La password principale ti serve per accedere alla tua cassaforte. È molto importante non dimenticarla. Non possiamo aiutarti a recuperare questa password se la dimentichi. + Password principale non corrispondente + La password principale è necessaria per accedere alla cassaforte. È molto importante non dimenticarla. Non è possibile recuperare questa password nel caso in cui la dimenticassi. Suggerimento per la password principale (opzionale) - Questo suggerimento può aiutarti a ricordare la password nel caso in cui la dimenticassi. - Inserisci una password lunga almeno %1$s caratteri + Questo suggerimento può aiutarti a ricordare la password principale nel caso in cui la dimenticassi. + Inserisci una password con almeno %1$s caratteri Numero minimo di numeri Numero minimo di caratteri speciali - Nessuno - Elemento aggiunto - Non ci sono carte nella tua cassaforte. - Nuova carta - Non ci sono accessi nella tua cassaforte. - Non ci sono identità nella tua cassaforte. - Nuova identità - Non ci sono note nella tua cassaforte. - Nuova nota - Nuova passkey - Nuovo elemento - Nuova chiave SSH - Non ci sono messaggi inviati nella tua cassaforte. - Non ci sono file Send nella tua cassaforte. - Non ci sono chiavi SSH nella tua cassaforte. - Nuovo testo Send - Nuovo file Send + Mai + Elemento creato + Nessuna carta nella cassaforte + Crea una carta + Nessun login nella cassaforte + Nessuna identità nella cassaforte + Crea un\'identità + Nessuna nota nella cassaforte + Crea una nota + Crea una passkey + Crea un nuovo elemento + Crea una chiave SSH + Nessun testo Send nella cassaforte + Nessun file Send nella cassaforte + Nessuna chiave SSH nella cassaforte + Crea un testo Send + Crea un file Send Nessun nome utente Opzioni Altro Generatore di password Suggerimento per la password - Abbiamo inviato un\'email con il suggerimento per la password principale. - Vuoi davvero sovrascrivere la password? - Conferma la password principale - Ridigita la nuova parola d\'accesso principale (obbligatoria) - Ridigita la password principale (obbligatorio) + Abbiamo inviato un\'email con il suggerimento per la password principale + Vuoi davvero sovrascrivere questa password? + Conferma della password principale + Conferma della nuova password (necessaria) + Conferma della password principale (necessaria) Cerca nella cassaforte Seleziona - Dettagli elemento - Elemento salvato - Invio in corso... - Sincronizzazione in corso... + Dettagli dell\'elemento + Elemento aggiornato + Invio in corso + Sincronizzazione in corso Sincronizzazione completata - Configurazione 2FA (accesso in due passaggi) + Configurazione 2FA (autenticazione a due fattori) Sblocco con %1$s Sblocco con Codice PIN Codice di verifica - Visualizza login - Visualizza carta - Visualizza identità - Visualizza nota - Visualizza passkey + Visualizza il login + Visualizza la carta + Visualizza l\'identità + Visualizza la nota + Visualizza la passkey Cassaforte web di Bitwarden Elementi Elementi per %1$s Nessun elemento per %1$s - Nessun elemento nella cassaforte corrispondente a \"%1$s\" - Cerca un login o aggiungi un nuovo login + Nessun elemento corrispondente a \"%1$s\" + Cerca o crea un login Disabilitato Puoi aggiungere facilmente nuovi login alla cassaforte con il servizio di riempimento automatico di Bitwarden. Scopri di più su come usare il riempimento automatico nelle impostazioni dell\'app. Riempimento automatico - Vuoi riempire automaticamente o vedere questo elemento? + Seleziona l\'azione Cerca Scopri di più sulle organizzazioni App di autenticazione - Inserisci il codice di verifica a 6 cifre dalla tua app di autenticazione. - Inserisci il codice di verifica a 6 cifre inviato all\'indirizzo %1$s. - Non riconosciamo questo dispositivo. Inserisci il codice di verifica a 8 cifre che è stato inviato via e-mail a %1$s. + Inserisci il codice di verifica a 6 cifre dell\'app di autenticazione + Inserisci il codice di verifica a 6 cifre inviato a %1$s + Dispositivo non riconosciuto. Inserisci il codice di verifica a 8 cifre inviato a %1$s. Codice di recupero Ricorda - Ricorda e-mail - Invia email con codice di verifica di nuovo - Impossibile inviare l\'email con il codice di verifica. Riprova. + Ricorda l\'indirizzo email + Invia un nuovo codice di verifica + Invio dell\'email di verifica non riuscito Email di verifica inviata - Per continuare, appoggia la tua YubiKey NEO sul retro del dispositivo o inserisci la tua Yubikey nella porta USB, poi premi il suo pulsante. + Appoggia la YubiKey NEO sul retro del dispositivo o inserisci la Yubikey nella porta USB e premi il pulsante Chiave di sicurezza YubiKey Aggiungi un allegato File allegati - Impossibile scaricare il file. - Download in corso... - La dimensione di questo allegato è %1$s. Vuoi scaricarlo? + Scaricamento del file non riuscito + Scaricamento in corso + La dimensione di questo allegato è %1$s. Vuoi davvero scaricare questo file? Chiave 2FA (TOTP) Codice 2FA (TOTP) Chiave 2FA aggiunta Lettura della chiave 2FA non riuscita - Inquadra il codice QR con la fotocamera. + Posiziona il codice QR all\'interno del quadrato. La scansione è automatica. Copia il codice 2FA - Se un login ha una chiave di autenticazione, copia automaticamente il codice 2FA negli appunti quando riempi automaticamente il login. - Copia codice 2FA automaticamente + Copia automaticamente il codice 2FA negli appunti quando riempi automaticamente un login + Copia automatica del codice 2FA Passa a un abbonamento premium per utilizzare questa funzionalità Allegato eliminato Seleziona il file File Nessun file selezionato Nessun file allegato - Sorgente file - Seleziona un file inferiore o uguale a 100 MB. - Richiesto. La dimensione massima del file è 100 MB. + Origine del file + Seleziona un file inferiore o uguale a 100 MB + Limite di 100 MB superato Scopri di più URL del server API Certificato client (mTLS) - Certificato usato per l\'autenticazione del client. + Certificato usato per l\'autenticazione del client Ambiente personalizzato (opzionale) Per utenti avanzati. Puoi specificare l\'URL di base di ogni servizio indipendentemente. URL dell\'ambiente salvati URL del server di identità Ambiente self-hosted - Inserisci l\'URL principale dell\'installazione Bitwarden self-hosted. + Inserisci l\'URL principale dell\'installazione Bitwarden self-hosted URL del server URL della cassaforte web Campi personalizzati - Copia il numero - Copia il CVC - Numero - Codice di sicurezza + Copia il numero della carta + Copia il codice di sicurezza + Numero della carta + Codice di sicurezza (CVC/CVV) Carta Identità Login @@ -228,12 +228,12 @@ La scansione è automatica. Indirizzo 3 Aprile Agosto - Marca - Dettagli carta + Circuito + Dettagli della carta Titolare della carta - Città / Comune + Città o comune Azienda - Nazione + Paese Dicembre Dott Mese di scadenza @@ -244,8 +244,8 @@ La scansione è automatica. Luglio Giugno Cognome - Nome e cognome - Numero patente + Nome completo + Numero della patente Marzo Maggio Secondo nome @@ -255,17 +255,17 @@ La scansione è automatica. Neutro Novembre Ottobre - Numero passaporto - Telefono + Numero del passaporto + Numero di telefono Settembre - Codice fiscale/Previdenza sociale - Stato / Provincia + Codice fiscale + Stato o regione Titolo CAP Indirizzo Scadenza - Mostra icone dei siti - Mostra un piccolo logo riconoscibile accanto a ogni login. + Visualizza le icone dei siti web + Visualizza un piccolo logo riconoscibile accanto a ogni login URL del server di icone La cassaforte è bloccata Vai alla cassaforte @@ -274,32 +274,32 @@ La scansione è automatica. Nessun elemento in questa cartella Nessun elemento nel cestino Assiste con il riempimento dei campi nome utente e password in altre applicazioni e nei siti web. - Il riempimento automatico di Bitwarden usa il servizio di riempimento di sistema per inserire facilmente le credenziali di accesso nei campi di autenticazione di pagine Web e altre app. + Il riempimento automatico di Bitwarden usa il servizio di riempimento automatico di sistema per compilare i campi con le credenziali salvate Non siamo riusciti ad aprire le impostazioni del riempimento automatico di Android per te. Puoi navigare manualmente nelle impostazioni di riempimento automatico dalle Impostazioni di Android > Cerca Impostazioni > Cerca \"Password e autofill\" Nome del campo - Booleano + On/Off Nascosto Collegato Testo Tipo di campo personalizzato Rimuovi Aggiungi un URL - Aggiungi sito web + Aggiungi un sito web Dominio di base Predefinito Esatto Host - Espressione regolare + Espressione regolare (regex) Inizio Metodo di corrispondenza dell\'URL Metodo di corrispondenza - Riempi automaticamente e salva + Riempimento automatico e associamento Organizzazione Riprova - Creato: %1$s - Ultimo aggiornamento password: %1$s + Creazione: %1$s + Ultimo aggiornamento della password: %1$s Ultima modifica: %1$s - Inserisci un indirizzo email valido + Indirizzo email non valido Carte Identità Identificazione @@ -307,28 +307,28 @@ La scansione è automatica. Note sicure Dettagli personali Informazioni di contatto - Controlla la parola d\'accesso per le violazioni dei dati - Questa password è stata esposta %1$s volta/e nelle violazioni di dati note. Cambiala con una più sicura. + Cerca la password nelle violazioni di dati + Questa password è stata esposta %1$s volta/e nelle violazioni di dati note. Cambiala subito. Questa password non è stata trovata in alcuna violazione di dati nota Nome dell\'identità Valore Cronologia delle password - Cronologia parole d\'accesso: %1$s + Cronologia delle password: %1$s Tipo Nessuna password - Cerca Send di tipo file - Cerca Send di testo + Cerca nei file Send + Cerca nei testi Send Scegli il tipo di elemento Sposta in basso Sposta in alto Propriet. Nessuna raccolta %1$s spostato in %2$s - Devi selezionare almeno una raccolta. + Seleziona almeno una raccolta Condividi Sposta in organizzazione Nessuna organizzazione - Scegli un\'organizzazione in cui vuoi spostare questo elemento. Spostarlo in un\'organizzazione trasferisce la proprietà dell\'elemento all\'organizzazione. Una volta spostato, non sarai più il proprietario diretto di questo elemento. + Scegli l\'organizzazione in cui vuoi spostare questo elemento. Ciò rimuove a te la proprietà dell\'elemento e la trasferisce all\'organizzazione. Numero di parole Passphrase Separatore delle parole @@ -336,14 +336,14 @@ La scansione è automatica. Generatore Nessuna cartella Frase impronta - Frase impronta del tuo account - Esporta cassaforte + Frase impronta dell\'account + Esporta la cassaforte Blocca - PIN + Codice PIN Sblocca 30 minuti - Imposta il codice PIN che sarà richiesto per sbloccare Bitwarden. Lo sblocco con PIN sarà rimosso se ti disconnetti dall\'account. - Accesso effettuato come %1$s su %2$s. + Imposta il codice PIN necessario per sbloccare Bitwarden. Lo sblocco con PIN verrà rimosso se esci dall\'account. + Accesso effettuato come %1$s a %2$s. La cassaforte è bloccata. Inserisci la password principale. La cassaforte è bloccata. Inserisci il codice PIN. Scuro @@ -353,8 +353,8 @@ La scansione è automatica. 30 secondi 20 secondi 2 minuti - Cancella gli appunti - Cancella automaticamente i valori copiati dagli appunti. + Cancellazione automatica degli appunti + Cancella automaticamente i valori copiati negli appunti dopo un determinato periodo di tempo Metodo di corrispondenza degli URL predefinito Scegli il modo predefinito in cui il rilevamento della corrispondenza URI è gestito per i login quando si eseguono azioni come il riempimento automatico. Tema @@ -425,9 +425,9 @@ La scansione è automatica. Informativa sulla Privacy Gestione delle passkey Servizi di riempimento automatico - Display autofill suggestions - Inline (shows in keyboard) - Popup (shows over input field) + Suggerimenti riempimento automatico + In linea (incluso nella tastiera) + Popup (sopra il campo da compilare) Usa il servizio di accessibilità Necessario per usare il riquadro di azione rapida di riempimento automatico. Una politica dell\'organizzazione sta influenzando le tue opzioni di proprietà. @@ -658,7 +658,7 @@ Vuoi passare a questo account? Centro assistenza Bitwarden Sincronizza Opzioni di sblocco - Timeout della sessione + Scadenza della sessione Azione programmata Frase impronta dell\'account Usa Bitwarden per salvare nuove passkey ed accedere con le passkey memorizzate nella tua cassaforte. @@ -984,9 +984,9 @@ Vuoi passare a questo account? Scopri di più sulle app privilegiate App privilegiate Browser non riconosciuto - Learn more about using passkeys with Bitwarden. - All trusted apps - Are you sure you want to stop trusting %s? - Installed apps - Delete %s + Scopri di più sull\'utilizzo delle passkey con Bitwarden + Tutte le app affidabili + Sei sicuro di voler segnare %s come non affidabile? + App installate + Elimina %s diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index e573a9af81..a1d641d6da 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -41,16 +41,16 @@ 今すぐ切り替えますか? マスターパスワード マスターパスワード (必須) - New master password (required) + 新しいマスターパスワード (必須) 詳細 保管庫 名前 - Item name (required) - "Send name (required)" + アイテム名 (必須) + "Send の名前 (必須)" いいえ メモ - Private notes - Okay + プライベートノート + OK パスワード 保存 移動 @@ -61,10 +61,10 @@ 送信 同期 URI - Website (URI) + ウェブサイト (URI) ユーザー名 %1$s は必須です。 - You must attach a file to save this send. + このSendを保存するにはファイルを添付する必要があります。 %1$s をコピーしました。 マスターパスワードの確認 PIN の確認 @@ -80,16 +80,16 @@ 閉じる 続行 アカウントの作成 - Create an account + アカウントを作成 アイテムの編集 - Edit login - Edit card - Edit identity - Edit note - Edit passkey + ログイン情報の編集 + カードの編集 + 身分証の編集 + メモの編集 + パスキーを編集 マスターパスワードのヒントを受信するため、アカウントのメールアドレスを入力してください。 お気に入り - Unfavorite + お気に入り解除 指紋認証 パスワードの自動生成 マスターパスワードのヒントを取得 @@ -104,7 +104,7 @@ 即時 ログアウトすると保管庫へのすべてのアクセスが制限され、タイムアウト期間後にオンライン認証が必要になります。 この設定を使用してもよろしいですか? ログイン中... - Log in to Bitwarden + Bitwarden にログイン パスワードの確認が正しくありません。 マスターパスワードは、パスワード保管庫へのアクセスに使用するパスワードです。マスターパスワードを忘れないように注意してください。忘れた場合、パスワードを回復する方法はありません。 マスターパスワードのヒント (省略可能) @@ -114,21 +114,21 @@ 最低限必要な記号の個数 なし 新しいアイテムを作成しました。 - 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 - There are no notes in your vault. - New note - New passkey - New item - New SSH key - There are no text Sends in your vault. - There are no file Sends in your vault. - There are no SSH keys in your vault. - New text Send - New file Send + 保管庫にカードがありません + 新しいカード + 保管庫にログイン情報がありません + 保管庫に身分証はありません + 新しい身分証 + 保管庫にメモがありません + 新しいメモ + 新しいパスキー + 新しいアイテム + 新しいSSHキー + 保管庫にテキスト入のSendはありません + 保管庫にファイル入のSendはありません + 保管庫に SSH キーがありません + 新しいテキスト入のSend + 新しいファイル入のSend ユーザー名なし オプション その他 @@ -137,11 +137,11 @@ マスターパスワードのヒントを記載したメールを送信しました。 現在のパスワードを上書きしてよろしいですか? マスターパスワードを再入力 - Re-type new master password (required) + 新しいマスターパスワードを再入力 (必須) マスターパスワードを再入力 (必須) 保管庫を検索 選択 - Item details + アイテムの詳細 アイテムを更新しました。 送信中... 同期中... @@ -150,16 +150,16 @@ %1$sでロック解除 PIN コードでロック解除 認証コード - View login - View card - View identity - View note - View passkey + ログイン情報を表示 + カードを表示 + 身分証を表示 + メモを表示 + パスキーを表示 Bitwarden ウェブ保管庫 アイテム %1$s用のアイテム 保管庫に%1$s用のアイテムはありません。 - There are no items in your vault that match “%1$s” + \"%1$s\" に一致するアイテムは保管庫にありません ログイン情報を検索するか、新しいログイン情報を追加します 無効 ログイン情報を保管庫に追加する一番簡単な方法はBitwardenの自動入力機能を使うことです。詳しくは「設定」画面に進んでください。 @@ -170,10 +170,10 @@ 認証アプリ 認証アプリに表示された6桁の認証コードを入力してください。 %1$s に送信された6桁の認証コードを入力してください。 - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + このデバイスは未確認です。本人確認のため、 %1$s に送信されたメールに書かれている 8 桁の認証コードを入力してください。 リカバリーコード - Remember - Remember email + ログイン状態を記憶 + メールアドレスを記録 確認コードをメールで再送 確認メールを送信できませんでした。やり直してください。 確認メールを送信しました。 @@ -201,10 +201,10 @@ 添付ファイルがありません。 ファイルソース 最大ファイルサイズは100MBです。 - Required. Maximum file size is 100 MB. + 最大ファイルサイズは100MBです。 詳細情報 API サーバー URL - Client certificate (mTLS) + クライアント証明書 (mTLS) Certificate used for client authentication. カスタム環境 上級者向けです。各サービスのベース URL を個別に指定できます。 diff --git a/app/src/main/res/values-pl-rPL/strings.xml b/app/src/main/res/values-pl-rPL/strings.xml index c01fbb55a4..d7d2bc6643 100644 --- a/app/src/main/res/values-pl-rPL/strings.xml +++ b/app/src/main/res/values-pl-rPL/strings.xml @@ -177,7 +177,7 @@ Wyślij ponownie kod Nie można wysłać wiadomości weryfikacyjnej. Spróbuj ponownie. Wiadomość weryfikacyjna została wysłana - Aby kontynuować, przytrzymaj klucz YubiKey NEO z tyłu urządzenia lub włóż go do portu USB urządzenia, a następnie dotknij jego przycisku. + Przyłóż klucz YubiKey NEO z tyłu urządzenia lub włóż go do portu USB urządzenia, a następnie dotknij jego przycisku. Klucz bezpieczeństwa YubiKey Dodaj nowy załącznik Załączniki @@ -191,7 +191,7 @@ Skieruj aparat na kod QR. Skanowanie nastąpi automatycznie. Kopiuj kod TOTP - Automatycznie kopiuje kod TOTP do schowka podczas autouzupełniania, jeśli jest dostępny. + Automatycznie kopiuje kod TOTP do schowka podczas autouzupełniania. Kopiuj kod TOTP automatycznie Konto premium jest wymagane, aby skorzystać z tej funkcji. Załącznik został usunięty @@ -529,7 +529,7 @@ Skanowanie nastąpi automatycznie. Wszystko TOTP Kody weryfikacyjne - Wymagana jest subskrypcja premium + Konto premium jest wymagane Nie możesz dodać klucza uwierzytelniającego? Zeskanuj kod QR Zeskanuj kod QR Nie możesz zeskanować kodu QR? Wpisz klucz ręcznie @@ -539,7 +539,7 @@ Skanowanie nastąpi automatycznie. Dodaj TOTP Ustaw klucz uwierzytelniający Po wpisaniu klucza kliknij Dodaj TOTP, aby bezpiecznie zapisać klucz - Ustawienie blokady aplikacji na „Nigdy” sprawi, że sejf będzie dostępny dla każdego użytkownika urządzenia. Upewnij się, że urządzenie jest odpowiednio chronione. + Ustawienie blokady na „Nigdy” sprawi, że sejf będzie dostępny dla każdego użytkownika urządzenia. Upewnij się, że urządzenie jest odpowiednio chronione. Co najmniej jeden z adresów URL jest nieprawidłowy. Popraw je. Nie mogliśmy przetworzyć żądania. Spróbuj ponownie lub skontaktuj się z nami. Wykonywanie zrzutów ekranu @@ -611,7 +611,7 @@ Czy chcesz przełączyć się na to konto? Ważne Zapomniane hasło główne nie może zostać odzyskane! Hasło musi składać się z co najmniej %1$s znaków. Hasło główne jest słabe - Hasło jest słabe. Użyj unikalnego hasła, aby chronić konto. Czy na pewno chcesz użyć słabego hasła? + Hasło jest słabe. Użyj silnego hasła, aby chronić konto. Czy na pewno chcesz użyć słabego hasła? Słabe Dobre Silne @@ -619,8 +619,8 @@ Czy chcesz przełączyć się na to konto? Hasło główne zostało ujawnione Hasło zostało ujawnione w wycieku danych. Użyj unikalnego hasła, aby chronić konto. Czy na pewno chcesz użyć ujawnionego hasła? Hasło główne jest słabe i ujawnione - Hasło jest słabe i zostało ujawnione w wycieku danych. Użyj unikalnego hasła, aby chronić konto. Czy na pewno chcesz użyć tego hasła? - Brak elementów, które pasują do wyszukiwania + Hasło jest słabe i zostało ujawnione w wycieku danych. Użyj mocnego i unikalnego hasła, aby chronić konto. Czy na pewno chcesz użyć tego hasła? + Brak elementów pasujących do wyszukiwania Samodzielnie hostowany Region Hasło główne nie spełnia co najmniej jednej zasady organizacji. Aby uzyskać dostęp do sejfu, zaktualizuj hasło główne. Kontynuowanie spowoduje wylogowanie z obecnej sesji i konieczność ponownego zalogowania się. Aktywne sesje na innych urządzeniach mogą pozostać aktywne przez maksymalnie godzinę. @@ -671,7 +671,7 @@ Czy chcesz przełączyć się na to konto? Przejść do ustawień urządzenia? Zwiększ bezpieczeństwo konta, konfigurując logowanie dwustopniowe w aplikacji internetowej Bitwarden. Możesz zmienić hasło główne w aplikacji internetowej Bitwarden. - Możesz zaimportować dane do swojego sejfu na %1$s. + Zaimportuj dane do sejfu na stronie %1$s. Dowiedz się więcej o tym, jak korzystać z centrum pomocy Bitwarden. Sprawdź naszą politykę prywatności na bitwarden.com. Odkryj więcej funkcji konta Bitwarden w aplikacji internetowej. diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index 28c6e45082..60a72d2132 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -41,16 +41,16 @@ Vill du byta till det nu? Huvudlösenord Huvudlösenord (obligatoriskt) - New master password (required) + Nytt huvudlösenord (krävs) Mer Mitt valv Namn - Item name (required) - "Send name (required)" + Objektnamn (krävs) + "Skicka namn (krävs)" Nej Anteckningar Private notes - Okay + Okej Lösenord Spara Flytta @@ -61,10 +61,10 @@ Skicka Synkronisering URI - Website (URI) + Webbplats (URI) Användarnamn %1$s-fältet krävs. - You must attach a file to save this send. + Du måste bifoga en fil för att spara denna send. %1$s har kopierats Bekräfta huvudlösenord Bekräfta PIN-kod @@ -80,12 +80,12 @@ Stäng Fortsätt Skapa konto - Create an account + Skapa ett konto Redigera objekt - Edit login - Edit card - Edit identity - Edit note + Redigera inloggning + Redigera kort + Redigera identitet + Redigera anteckning Edit passkey Ange ditt kontos e-postadress för att hämta din huvudlösenordsledtråd. Favorit @@ -104,7 +104,7 @@ Omedelbart Genom att logga ut upphör all åtkomst till valvet och onlineautentisering krävs efter att tidsgränsen överskridits. Är du säker på att du vill använda denna inställning? Loggar in... - Log in to Bitwarden + Logga in på Bitwarden Bekräftelsen för huvudlösenordet stämde ej. Huvudlösenordet är det lösenord som du använder för att komma åt ditt valv. Det är väldigt viktigt att du inte glömmer bort ditt huvudlösenord, eftersom det inte går att återställa lösenordet om du skulle glömma bort det. Huvudlösenordsledtråd (valfri) @@ -114,19 +114,19 @@ Minsta antal speciella tecken Aldrig Nytt objekt skapat - 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 - There are no notes in your vault. - New note + Det finns inga kort i ditt valv. + Nytt kort + Det finns inga inloggningar i ditt valv. + Det finns inga identiteter i ditt valv. + Ny identitet + Det finns inga anteckningar i ditt valv. + Ny anteckning New passkey - New item - New SSH key + Nytt objekt + Ny SSH-nyckel There are no text Sends in your vault. There are no file Sends in your vault. - There are no SSH keys in your vault. + Det finns inga SSH-nycklar i ditt valv. New text Send New file Send Inget användarnamn @@ -141,7 +141,7 @@ Re-type master password (required) Sök i valvet Välj - Item details + Objektinformation Objektet uppdaterades Skickar... Synkroniserar... @@ -150,16 +150,16 @@ Lås upp med %1$s Lås upp med PIN-kod Verifieringskod - View login - View card - View identity - View note + Visa inloggning + Visa kort + Visa identitet + Visa anteckning View passkey Bitwarden webbvalv Objekt Objekt för %1$s Det finns inga objekt i ditt valv för %1$s. - There are no items in your vault that match “%1$s” + Det finns inga objekt i ditt valv som matchar “%1$s” Sök efter eller lägg till en ny inloggning Inaktiverad Det lättaste sättet att lägga till nya inloggningar till ditt valv är från Bitwardens hjälpmedelsservice för automatisk ifyllnad. Läs mer om hur man använder Bitwardens hjälpmedelsservice för automatisk ifyllnad genom att navigera till fliken \"Inställningar\". @@ -170,10 +170,10 @@ Autentiseringsapp Ange den 6-siffriga verifieringskoden från din autentiseringsapp. Ange den 6-siffriga verifieringskoden som skickades till %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + Vi känner inte igen den här enheten. Ange den 8-siffriga verifieringskoden som skickades till %1$s. Återställningskod - Remember - Remember email + Kom ihåg + Kom ihåg e-post Skicka verifieringskod-mejlet igen Kunde inte skicka verifierings-mejl. Försök igen. Verifieringsmeddelande har skickats @@ -201,10 +201,10 @@ Skanningen sker automatiskt. Det finns inga bilagor. Filkälla Filen får vara maximalt 100 MB. - Required. Maximum file size is 100 MB. + Krävs. Maximal filstorlek är 100 MB. Läs mer API-server-URL - Client certificate (mTLS) + Klientcertifikat (mTLS) Certificate used for client authentication. Anpassad miljö För avancerade användare. Du kan ange bas-URL:en för varje tjänst oberoende av varandra. @@ -229,7 +229,7 @@ Skanningen sker automatiskt. April Augusti Märke - Card Details + Kortuppgifter Kortinnehavarens namn Ort Företag @@ -284,7 +284,7 @@ Skanningen sker automatiskt. Vilken typ av anpassat fält vill du lägga till? Ta bort Ny URI - Add website + Lägg till webbplats Basdomän Standard Exakt @@ -298,15 +298,15 @@ Skanningen sker automatiskt. Försök igen Created: %1$s Password last updated: %1$s - Last edited: %1$s + Senast redigerad: %1$s Ogiltig e-postadress. Kort Identiteter - Identification + Identifiering Inloggningar Säkra anteckningar - Personal Details - Contact Info + Personlig information + Kontaktuppgifter Check password for data breaches Detta lösenord har avslöjats %1$s gång(er) i dataintrång. Du bör ändra det. Detta lösenord hittades inte i några kända dataintrång. Det bör vara säkert att använda. @@ -321,7 +321,7 @@ Skanningen sker automatiskt. Typ Flytta ner Flytta upp - Owner + Ägare Det finns inga samlingar att visa. %1$s flyttades till %2$s. Du måste markera minst en samling. @@ -362,7 +362,7 @@ Skanningen sker automatiskt. Kopiera anteckning Avsluta Är du säker på att du vill avsluta Bitwarden? - Require master password on app restart? + Kräv huvudlösenord vid omstart av appen? Vill du behöva låsa upp med ditt huvudlösenord när programmet startas om? Be om att lägga till inloggning Be om att lägga till ett objekt om det inte finns i ditt valv. @@ -373,8 +373,8 @@ Skanningen sker automatiskt. Din inloggningssession har upphört. Biometrisk verifiering Biometri - Biometrics Failed - Log in with your Master Password or PIN then re-enable biometric login in Settings. + Biometri misslyckades + Logga in med ditt huvudlösenord eller PIN-kod och aktivera sedan biometriska inloggningar i Inställningar. Använd biometri för att låsa upp Filformat Ange ditt huvudlösenord för att exportera ditt valv. @@ -432,10 +432,10 @@ Skanningen sker automatiskt. Required to use the Autofill Quick-Action Tile. En organisationspolicy påverkar dina ägarskapsalternativ. Send - Send Details + Skicka detaljer Alla Sends Text - Text to share + Text att dela Text Dölj texten som standard när denna Send öppnas Fil @@ -444,9 +444,9 @@ Skanningen sker automatiskt. Denna Send kommer att raderas permanent på angivet datum och klockslag. Väntar på radering Upphört - Expires at %s - Expires tomorrow - Expires on %s + Går ut den %s + Går ut imorgon + Går ut den %s Stops logging on %1$s at %2$s Maximalt antal åtkomster Om angivet kommer användare inte längre kunna komma åt denna Send när det maximala antalet åtkomster har uppnåtts. @@ -456,7 +456,7 @@ Skanningen sker automatiskt. Kräv valfritt ett lösenord för att användare ska komma åt denna Send. Ta bort lösenord Tar bort lösenord - Password removed + Lösenordet togs bort Ny Send Kopiera länk Dela länk @@ -476,7 +476,7 @@ Skanningen sker automatiskt. 7 dagar 30 dagar Anpassad - Add this authenticator key to an existing login, or create a new login. + Lägg till denna authenticator-nyckel till en befintlig inloggning eller skapa en ny inloggning. På grund av en företagspolicy kan du bara radera en befintlig Send. Om Send Dölj min e-postadress för mottagare @@ -530,9 +530,9 @@ Skanningen sker automatiskt. TOTP Verifieringskoder Premium-prenumeration krävs - Cannot add authenticator key? Scan QR Code + Kan inte lägga till authenticator-nyckel? Skanna QR-kod Skanna QR-kod - Cannot scan QR code? Enter key manually + Kan inte skanna QR-koden? Ange nyckeln manuellt Autentiseringsnyckel Authenticator key help Ange nyckel manuellt @@ -551,8 +551,8 @@ välj Lägg till TOTP för att lagra nyckeln på ett säkert sätt Enhetstyp IP-adress Tid - Select time - Switch input mode + Välj tid + Växla inmatningsläge Bekräfta inloggning Neka inloggning Inloggning nekad @@ -565,9 +565,9 @@ välj Lägg till TOTP för att lagra nyckeln på ett säkert sätt Vidarebefordrat e-postalias Slumpmässigt ord E-post (obligatoriskt) - domain name + domännamn Domännamn (obligatoriskt) - API key + API-nyckel API-nyckel (obligatoriskt) Tjänst addy.io @@ -591,7 +591,7 @@ välj Lägg till TOTP för att lagra nyckeln på ett säkert sätt Inloggningsförsök från: %1$s Vill du byta till detta konto? - New to Bitwarden? + Ny i Bitwarden? Hämta huvudlösenordsledtråd Loggar in som %1$s på %2$s Är det inte du? @@ -625,7 +625,7 @@ Vill du byta till detta konto? Lokalt installerad Region Ditt huvudlösenord följer inte ett eller flera av din organisations regler. För att komma åt ditt valv så måste du ändra ditt huvudlösenord nu. Om du gör det kommer du att loggas du ut ur din nuvarande session så du måste logga in på nytt. Aktiva sessioner på andra enheter kommer fortsatt vara aktiva i upp till en timme. - Current master password (required) + Aktuellt huvudlösenord (krävs) Godkänn med min andra enhet Be om godkännande från administratör Godkänn med huvudlösenord @@ -651,7 +651,7 @@ Vill du byta till detta konto? \"Logga in med enhet\" måste ställas in i inställningarna i Bitwardens app. Behöver du ett annat alternativ? Logga in med enhet Logga in på - Logging in on: + Loggar in på: Valv Utseende Kontosäkerhet @@ -677,12 +677,12 @@ Vill du byta till detta konto? Kolla in vår integritetspolicy på bitwarden.com. Utforska fler funktioner i ditt Bitwarden-konto i webbappen. Bitwarden låter dig dela objekt i ditt valv med andra med hjälp av en organisation. Läs mer på webbplatsen bitwarden.com. - Created %1$s + Skapade %1$s Din organisation kräver att du anger ett huvudlösenord. Ställ in ett upplåsningsalternativ för att ändra vad som händer när tidsgränsen uppnås. Spara nyckel som ny inloggning Skriv över passkey? - This item already contains a passkey. Are you sure you want to overwrite the current passkey? + Detta objekt innehåller redan en passnyckel. Är du säker på att du vill skriva över den aktuella passnyckeln? Duo tvåstegsverifiering krävs för ditt konto. Följ stegen från Duo för att slutföra inloggningen. Starta Duo @@ -698,34 +698,34 @@ Vill du byta till detta konto? This password will be used to export and import this file Autofill suggestion Continue to complete WebAuthn verification. - Launch WebAuthn + Starta WebAuthn There was an error starting WebAuthn two factor authentication Self-hosted server URL Passkey operation failed because user could not be verified. - User verification - Create account on - Create account on: + Användarverifiering + Skapa konto på + Skapa konto på: Vi har skickat ett e-postmeddelande till %1$s. - By continuing, you agree to the Terms of Service and Privacy Policy - By activating this switch, you agree to the Terms of Service and Privacy Policy - Unsubscribe + Genom att fortsätta godkänner du användarvillkoren och integritetspolicyn + Genom att aktivera denna knapp godkänner du användarvillkoren och integritetspolicyn + Avsluta prenumeration Kontrollera din e-post - Open email app - Email verified - Get emails from Bitwarden for announcements, advice, and research opportunities. Unsubscribe at any time. + Öppna e-postappen + E-postadress verifierad + Få e-postmeddelanden från Bitwarden med meddelanden, råd och forskningsmöjligheter. Avsluta prenumerationen när som helst. Säkerhet, prioriterat - 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. + Spara inloggningar, kort och identiteter i ditt säkra valv. Bitwarden använder nollkunskaps- och totalsträckskryptering för att skydda det som är viktigt för dig. + Ställ in biometrisk upplåsning och automatisk ifyllning för att logga in på dina konton utan att skriva ett enda bokstav. + Snabb och enkel inloggning + Förbättra dina inloggningar + Använd generatorn för att skapa och spara starka, unika lösenord för alla dina konton. + Dina data, när och var du behöver dem + Spara obegränsat antal lösenord på obegränsat antal enheter med Bitwarden-appar för mobiler, webbläsare och datorer. Ta bort nyckel Passkey removed What makes a password strong? - A secure, memorable password - Account setup + Ett säkert lösenord som är lätt att komma ihåg + Kontoinställningar Ställ in upplåsning Ställ in senare Ställ in upplåsning senare? @@ -739,10 +739,10 @@ Vill du byta till detta konto? Your hint will be sent to you via email when you request it. Skriv ner ditt lösenord Var noga med att förvara ditt skriftliga lösenord på en hemlig och säker plats. - Prevent account lockout + Förhindra kontoutlåsning Generera huvudlösenord Generera - Write this password down and keep it somewhere safe. + Skriv ner detta lösenord och håll det säkert någonstans. Learn about other ways to prevent account lockout Learn about ways to prevent account lockout Help with server geolocations. @@ -751,13 +751,13 @@ Vill du byta till detta konto? Ändra e-postadress Nästa Bitwarden kan inte återställa ett förlorat eller glömt huvudlösenord. - Bitwarden cannot reset a lost or forgotten master password. + Bitwarden kan inte återställa ett förlorat eller glömt huvudlösenord. Välj ditt huvudlösenord - Choose a unique and strong password to keep your information safe. + Välj ett unikt och starkt lösenord för att hålla din information säker. %1$s tecken - Expired link + Utgången länk Please restart registration or try logging in. You may already have an account. - Restart registration + Starta om registrering Authenticator Sync Allow authenticator syncing There was an issue validating the registration token. @@ -767,18 +767,18 @@ Vill du byta till detta konto? Slå på autofyll senare? 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! + Du är klar! Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance. Huvudlösenordsledtråd New master password hint Kom igång Spara och skydda din data - The vault protects more than just passwords. Store secure logins, IDs, cards and notes securely here. + Valvet skyddar mer än bara lösenord. Lagra säkra inloggningar, identiteter, kort och anteckningar säkert här. Ny inloggning - 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 + Dela filer och data säkert med vem som helst, på vilken plattform som helst. Din information förblir krypterad från början till slut vid begränsad exponering. + Skicka känslig information, säkert Importera sparade inloggningar - Use a computer to import logins from an existing password manager + Använd en dator för att importera inloggningar från en befintlig lösenordshanterare You can return to complete this step anytime in Vault Settings. Importera inloggningar senare Importera inloggningar senare? @@ -793,8 +793,8 @@ Vill du byta till detta konto? Export your passwords. This option is usually found in your settings. Select Import data in the web app, then Done below to finish syncing. Steg 1 av 3 - Export your saved logins - You’ll delete this file after import is complete. + Exportera dina sparade inloggningar + Du kan ta bort denna fil efter importen är färdig. Öppna en ny webbläsarflik på din dator och gå till %1$s Logga in på Bitwardens webbapp. Steg 2 av 3 @@ -807,17 +807,17 @@ Vill du byta till detta konto? 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. + Synkroniserar inloggningar... + Hämta ner webbläsartillägget + Gå till bitwarden.com/download för att integrera Bitwarden i din favoritwebbläsare och få en smidig upplevelse. + Använd webbappen + Logga in på bitwarden.com för att enkelt hantera ditt konto och uppdatera inställningarna. Autofyll lösenord Set up autofill on all your devices to login with a single tap anywhere. Import Successful! Manage your logins from anywhere with Bitwarden tools for web and desktop. Bitwarden-verktyg - Got it + Jag fattar Inga inloggningar importerades Import error Logins imported @@ -831,7 +831,7 @@ Vill du byta till detta konto? 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 + Hoppa över nu Klar %1$s av %2$s Copy identity name @@ -856,48 +856,48 @@ Vill du byta till detta konto? "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. Review flow launched! - Copy private key - Login Credentials - Autofill Options - Use this button to generate a new unique password. - 1 OF 3 - 2 OF 3 + Kopiera privat nyckel + Inloggningsuppgifter + Alternativ för autofyll + Använd denna knapp för att generera ett nytt unikt lösenord. + 1 AV 3 + 2 AV 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 + 3 AV 3 You must add a web address to use autofill to access this account. - Mutual TLS + Ömsesidig TLS Single tap passkey creation Single tap passkey sign-on Learn about new logins We\'ll walk you through the key features to add a new login. - Explore the generator + Utforska generatorn Learn more about generating secure login credentials with a guided tour. - Import client certificate + Importera klientcertifikat 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 + 1 AV 6 + 2 AV 6 + 3 AV 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. " - Verify your identity - Error loading certificate + Verifiera din identitet + Fel vid inläsning av certifikat Certificate alias - Import certificate - Choose system certificate - Certificate installed - Certificate installation failed - Unsupported certificate type - Certificate password incorrect - Invalid certificate chain + Importera certifikat + Välj systemcertifikat + Certifikat installerat + Certifikatinstallation misslyckades + Certifikattypen stöds inte + Certifikatets lösenord är felaktigt + Ogiltig certifikatkedja Using a system certificate is less secure than storing the certificate with Bitwarden. Continuing will display a list of available system certificates if one is already installed. - Link + Länk Passkey operation failed because host URL is not present in request. Passkey operation failed because app signature is invalid. Passkey registration failed due to an internal error. @@ -914,7 +914,7 @@ Vill du byta till detta konto? Use Chrome autofill integration Use Chrome autofill integration (Beta) Improves login filling for supported websites on selected browsers. Once enabled, you’ll be directed to browser settings to enable third-party autofill. - Show more + Visa mer No folder Show less Add field @@ -932,33 +932,33 @@ Vill du byta till detta 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 - 8 hours - 24 hours - 1 week - Delete all - Share all - Unable to share + 1 timme + 8 timmar + 24 timmar + 1 vecka + Radera alla + Dela alla + Kunde inte dela Please try again or select a different log. The log file you are trying to share has been removed. - Delete log + Ta bort logg Do you really want to delete this log? - Delete logs + Radera loggar Do you really want to delete all recorded logs? Confirm Key Connector domain Key Connector domain: - Organization: + Organisation: A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator. 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å till inställningar All logs deleted Log deleted - App settings - Replace existing certificate? + Appinställningar + Ersätt befintligt certifikat? 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. - Replace certificate + Ersätt certifikat 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. @@ -967,7 +967,7 @@ Vill du byta till detta konto? View text Send Delete Send Missing Send re-sync your vault - Dynamic colors + Dynamiska färger Apply dynamic colors based on your wallpaper Dynamic colors uses the system colors and may not meet all accessibility guidelines. Passkey operation failed because browser (%1$s) is not recognized. Select \"Trust\" to add %1$s to the list of locally trusted applications. @@ -975,15 +975,15 @@ Vill du byta till detta konto? Trust These are applications or browsers that Bitwarden does not trust by default, but you trust to perform passkey operations. These are applications not included in the Google Play Store, but Bitwarden trusts to perform passkey operations after community members use and report them as safe. - These are applications Google considers safe and are available in Google\'s Play Store. - Trusted by You - Trusted by the Community - Trusted by Google + Det här är program som Google anser vara säkra och finns tillgängliga i Googles Play Store. + Betrodd av dig + Betrodd av gemenskapen + Betrodd av Google To protect users from phishing attempts, by default, Bitwarden only completes passkey operations through applications or web browsers trusted by Google or the Bitwarden community. About privileged applications Learn more about privileged apps Privileged apps - Unrecognized browser + Okänd webbläsare Learn more about using passkeys with Bitwarden. All trusted apps Are you sure you want to stop trusting %s? diff --git a/app/src/main/res/values-uk-rUA/strings.xml b/app/src/main/res/values-uk-rUA/strings.xml index 005480a519..fa146282df 100644 --- a/app/src/main/res/values-uk-rUA/strings.xml +++ b/app/src/main/res/values-uk-rUA/strings.xml @@ -289,7 +289,7 @@ Типово Точно Вузол - Звичайний вираз + Регулярний вираз Починається з Виявлення збігів URI Виявлення збігів @@ -425,9 +425,9 @@ Політика приватності Керування ключами доступу Служби автозаповнення - Display autofill suggestions - Inline (shows in keyboard) - Popup (shows over input field) + Показувати пропозиції автозаповнення + Вбудовано (на клавіатурі) + Спливне (над полем введення) Використовувати спеціальні можливості Необхідно використовувати плитку швидких дій для автозаповнення. Політика організації впливає на ваші параметри власності. @@ -662,8 +662,8 @@ Дія після часу очікування сеансу Фраза відбитка облікового запису Використовуйте Bitwarden для збереження нових ключів доступу та виконуйте вхід за допомогою збережених у сховищі ключів доступу. - Для автозаповнення даних входу в інших програмах на вашому пристрої використовується Android Autofill Framework. - Використовуйте вбудоване автозаповнення, якщо його підтримує ваша клавіатура. Інакше, використовуйте типову функцію накладання. + Дозволити Bitwarden використовувати вашу збережену інформацію для входу в інші програми на вашому пристрої. + Виберіть спосіб відображення пропозицій автозаповнення під час входу в інших програмах на вашому пристрої. Додаткові налаштування Продовжити у вебпрограмі? Продовжити у %1$s? @@ -910,10 +910,10 @@ Не вдалося виконати операцію з ключем доступу, тому що не вибрано жодного елемента. Не вдалося виконати операцію з ключем доступу, оскільки запит не підтримується. URL-адреса власного сервера - Use Brave autofill integration + Використовувати інтеграцію автозаповнення з Brave Використовувати інтеграцію автозаповнення з Chrome Використовувати інтеграцію автозаповнення з Chrome (бета-версія) - Improves login filling for supported websites on selected browsers. Once enabled, you’ll be directed to browser settings to enable third-party autofill. + Покращення заповнення даних входу на підтримуваних вебсайтах у вибраних браузерах. Після увімкнення вас буде спрямовано в налаштування браузера для активації автозаповнення третіх сторін. Розгорнути Без теки Згорнути @@ -975,20 +975,20 @@ Не вдалося виконати операцію з ключем доступу, оскільки браузер (%1$s) не розпізнано. Виберіть \"Довіряти\", щоб додати %1$s до списку локальних довірених програм. Не вдалося виконати операцію з ключем доступу, оскільки браузер не є довіреним. Довіряти - Цим програмам або браузерам Bitwarden не довіряє, але ВИ довіряєте їм виконання операцій з ключами доступу. + Цим програмам або браузерам Bitwarden не довіряє, але ви довіряєте їм виконання операцій з ключами доступу. Цих програм немає в магазині Google Play, але Bitwarden довіряє їм виконання операцій з ключами доступу, оскільки учасники спільноти користуються ними та вважають їх безпечними. Ці програми доступні в магазині Google Play і вважаються безпечними. Довірені вами Довірені спільнотою Довірені Google - Щоб захистити користувачів від шахрайства, Bitwarden виконує операції з ключами доступу лише у веббраузерах, яким довіряє спільнота Google або Bitwarden. + Щоб захистити користувачів від шахрайства, Bitwarden виконує операції з ключами доступу лише у програмах чи веббраузерах, яким довіряє спільнота Google або Bitwarden. Про привілейовані програми Докладніше про привілейовані програми Привілейовані програми Нерозпізнаний браузер - Learn more about using passkeys with Bitwarden. - All trusted apps - Are you sure you want to stop trusting %s? - Installed apps - Delete %s + Докладніше про ключі доступу в Bitwarden. + Усі довірені програми + Ви дійсно хочете скасувати довіру для %s? + Встановлені програми + Видалити %s diff --git a/app/src/main/res/values-vi-rVN/strings.xml b/app/src/main/res/values-vi-rVN/strings.xml index da9f8e0ca9..cb8ea48be9 100644 --- a/app/src/main/res/values-vi-rVN/strings.xml +++ b/app/src/main/res/values-vi-rVN/strings.xml @@ -12,7 +12,7 @@ Sao chép tên đăng nhập Xóa Đang xoá... - Bạn có chắc chắn muốn xóa nó không? Thao tác này không thể được khôi phục. + Bạn có chắc chắn muốn xóa không? Thao tác này không thể hoàn tác. Sửa Sửa thư mục Email @@ -26,8 +26,8 @@ Thư mục Đã lưu thư mục Ẩn - Hãy kết nối internet trước khi tiếp tục. - Yêu cầu kết nối Internet + Hãy kết nối mạng trước khi tiếp tục. + Cần có kết nối mạng Mật khẩu chính không đúng. Thử lại. Mã PIN không đúng. Thử lại. Khởi chạy @@ -36,20 +36,20 @@ Đăng xuất Bạn có chắc chắn muốn đăng xuất không? Xóa tài khoản - Bạn có chắc muốn xóa tài khoản này không? - Tài khoản này đã có rồi + Bạn có chắc chắn muốn xóa tài khoản này không? + Tài khoản đã được thêm Bạn muốn chuyển sang tài khoản này? Mật khẩu chính Mật khẩu chính (bắt buộc) Mật khẩu chính mới (bắt buộc) Thêm - Kho của tôi - Tên mục + Kho lưu trữ + Tên Tên mục (bắt buộc) - "Tên mục Gửi (bắt buộc)" + "Tên Send (bắt buộc)" Không Ghi chú - Ghi chú riêng + Ghi chú riêng tư Đồng ý Mật khẩu Lưu @@ -60,11 +60,11 @@ Đã xóa mục Gửi Đồng bộ - Đường dẫn - Website (URI) + Đường dẫn (URI) + Trang web (URI) Tên người dùng Vui lòng nhập %1$s. - You must attach a file to save this send. + Bạn phải đính kèm một tệp để lưu Send này. Đã sao chép %1$s Nhập lại mật khẩu chính Xác thực mã PIN @@ -73,21 +73,21 @@ Tài khoản Tài khoản của bạn đã được tạo thành công! - Đặt Bitwarden làm nhà cung cấp mã khoá của bạn trong cài đặt thiết bị. - Tránh các ký tự dễ gây nhầm lẫn + Đặt Bitwarden làm nhà cung cấp mã khoá trong cài đặt thiết bị. + Tránh các ký tự dễ nhầm lẫn Dịch vụ tự động điền Bitwarden - Đổi mật khẩu chính + Thay đổi mật khẩu chính Đóng Tiếp tục Tạo tài khoản - Tạo tài khoản - Sửa mục + Tạo một tài khoản + Chỉnh sửa mục Sửa thông tin đăng nhập Sửa thông tin thẻ - Sửa thông tin danh bạ + Sửa danh tính Sửa ghi chú Sửa mã khóa - Nhập địa chỉ email tài khoản của bạn để nhận gợi ý mật khẩu. + Nhập địa chỉ email tài khoản của bạn để nhận gợi ý mật khẩu chính. Yêu thích Bỏ thích Vân tay @@ -102,127 +102,127 @@ 1 phút 4 giờ Tức thì - Đăng xuất sẽ xóa tất cả quyền truy cập vào kho của bạn và yêu cầu xác minh trực tuyến sau khi hết thời gian chờ. Bạn có chắc chắn muốn sử dụng cài đặt này không? + Đăng xuất sẽ xóa toàn bộ quyền truy cập vào kho của bạn và yêu cầu xác minh lại sau khi hết thời gian chờ. Bạn có chắc chắn muốn sử dụng cài đặt này không? Đang đăng nhập... Đăng nhập Bitwarden Mật khẩu nhập lại không trùng khớp. - Mật khẩu chính là mật khẩu bạn sử dụng để truy cập kho mật khẩu của bạn. Nó rất quan trọng vì sẽ không có cách nào để lấy lại mật khẩu nếu bạn quên. + Mật khẩu chính là mật khẩu bạn sử dụng để truy cập vào kho lưu trữ của mình. Điều rất quan trọng là bạn không được quên mật khẩu chính. Không có cách nào để khôi phục mật khẩu nếu bạn quên nó. Gợi ý mật khẩu chính (tùy chọn) - Một gợi ý mật khẩu có thể giúp bạn nhớ lại mật khẩu chính của bạn nếu bạn quên nó. + Một gợi ý mật khẩu có thể giúp bạn nhớ lại mật khẩu chính của bạn nếu bạn chợt quên. Mật khẩu chính phải có tối thiểu %1$s kí tự. - Số chữ số - Số kí tự đặc biệt + Số chữ số tối thiểu + Số kí tự đặc biệt tối thiểu Không bao giờ - Đã thêm mục mới - Không có thẻ nào trong kho của bạn. + Đã thêm mục + Không có thẻ nào trong kho lưu trữ. Thêm thẻ Không có tài khoản đăng nhập nào trong kho của bạn. - Không có danh bạ nào trong kho của bạn. - Thêm danh bạ + Không có danh tính nào trong kho của bạn. + Danh tính mới Không có ghi chú nào trong kho của bạn. - Thêm ghi chú + Ghi chú mới Mã khoá mới - Thêm mục - Mã SSH mới - Không có văn bản Gửi trong kho của bạn. - Không có tập tin Gửi trong kho của bạn. - Không có mã SSH nào trong kho của bạn. - Văn bản Gửi mới - Tập tin Gửi mới - Không có tên đăng nhập + Mục mới + Khóa SSH mới + Không có Send văn bản nào trong kho của bạn. + Không có Send tập tin nào trong kho của bạn. + Không có khóa SSH nào trong kho của bạn. + Send văn bản mới + Send tập tin mới + Không tên người dùng Tùy chọn Khác Trình tạo mật khẩu Gợi ý mật khẩu - Chúng tôi đã gửi cho bạn email có chứa gợi ý mật khẩu chính của bạn. - Bạn có chắc chắn muốn ghi đè mật khẩu hiện tại không? + Chúng tôi đã gửi cho bạn một email chứa gợi ý mật khẩu chính của bạn. + Bạn có chắc chắn muốn ghi đè lên mật khẩu hiện tại không? Nhập lại mật khẩu chính Nhập lại mật khẩu chính mới (bắt buộc) Nhập lại mật khẩu chính (bắt buộc) - Tìm kiếm trong kho + Tìm kiếm trong kho Chọn Chi tiết mục Đã lưu mục Đang gửi... Đang đồng bộ... - Đồng bộ xong - Xác minh 2 bước + Đồng bộ hoàn tất + Đăng nhập hai bước Mở khóa bằng %1$s Mở khóa bằng mã PIN Mã xác minh Xem thông tin đăng nhập Xem thẻ - Xem danh bạ + Xem danh tính Xem ghi chú Xem mã khóa - Trang web Bitwarden + Kho lưu trữ web Bitwarden Mục Mục cho %1$s - Không có mục nào trong kho của bạn thích hợp với %1$s. + Không có mục nào trong kho lưu trữ khớp với %1$s. Không có mục nào trong kho của bạn khớp với “%1$s” - Tìm mật khẩu đăng nhập hoặc thêm mới + Tìm kiếm mục đăng nhập hoặc thêm mục đăng nhập mới Vô hiệu hóa - Cách dễ nhất để thêm một thông tin đăng nhập mới vào kho của bạn là bằng dịch vụ Điền tự động điền của Bitwarden. Xem cách sử dụng Điền tự động của Bitwarden trong \"Cài đặt\"\'. + Cách dễ nhất để thêm một đăng nhập mới vào kho của bạn là bằng dịch vụ Tự động điền của Bitwarden. Tìm hiểu thêm về cách sử dụng dịch vụ Tự động điền của Bitwarden trong phần \'Cài đặt\'. Tự động điền - Bạn có muốn tự động điền hoặc xem đăng nhập này? + Bạn muốn tự động điền hay xem mục này? Tìm kiếm Tìm hiểu về tổ chức - Ứng dụng Authenticator - Nhập mã xác minh 6 chữ số từ ứng dụng xác thực của bạn. + Ứng dụng xác thực + Nhập mã xác nhận 6 chữ số từ ứng dụng xác thực của bạn. Nhập mã xác nhận 6 chữ số đã được gửi tới email %1$s. - Không nhận ra thiết bị này. Nhập mã xác thực 8 số đã được gửi tới email %1$s. - Mã khôi phục - Lưu - Lưu email + Chúng tôi không nhận diện được thiết bị này. Vui lòng nhập mã xác minh 8 chữ số đã được gửi đến email %1$s. + Mã phục hồi + Ghi nhớ + Ghi nhớ email Gửi lại mã Không thể gửi email xác minh. Thử lại. Đã gửi email xác minh - Giữ YubiKey NEO lên phía sau của thiết bị để tiếp tục. + Để tiếp tục, hãy đặt YubiKey NEO của bạn vào mặt sau của thiết bị hoặc cắm YubiKey vào cổng sạc của thiết bị, sau đó nhấn nút trên YubiKey. Khóa bảo mật YubiKey - Đính kèm tệp tin + Thêm tệp đính kèm mới Tệp đính kèm Không thể tải về tệp tin. Đang tải xuống... Tệp tin đính kèm này có kích thước %1$s. Bạn có chắc muốn tải nó xuống thiết bị của mình? - Khóa xác thực (TOTP) + Khóa xác thực Mã xác thực (TOTP) Đã thêm khóa xác thực. Không thể đọc khóa xác thực. - Đưa máy ảnh vào Mã QR. + Hướng máy ảnh của bạn vào mã QR. Quá trình quét sẽ diễn ra tự động. Sao chép TOTP - Nếu thông tin đăng nhập có khóa xác thực, hãy sao chép mã xác minh TOTP khi bạn tự động điền thông tin đăng nhập. + Nếu tài khoản đăng nhập có khóa xác thực, mã xác minh TOTP sẽ được sao chép vào bộ nhớ tạm khi bạn tự động điền thông tin đăng nhập. Tự động sao chép mã TOTP - Cần là thành viên cao cấp để sử dụng tính năng này. + Cần là thành viên Cao cấp để sử dụng tính năng này. Đã xóa tệp đính kèm Chọn tệp - Tệp tin - Chưa chọn tệp tin + Tập tin + Chưa chọn tập tin Không có tệp đính kèm. Tệp nguồn Kích thước tối đa của tệp tin là 100MB. - Required. Maximum file size is 100 MB. + Bắt buộc. Kích thước tệp tối đa là 100 MB. Tìm hiểu thêm - Địa chỉ API máy chủ - Xác thực client (mTLS) - Chứng chỉ được sử dụng để xác thực client. + Địa chỉ máy chủ API + Chứng chỉ khách hàng (mTLS) + Chứng chỉ được sử dụng để xác thực khách hàng. Môi trường tùy chỉnh - Đối với người dùng nâng cao. Bạn có thể chỉ định liên kết cơ bản của mỗi dịch vụ một cách độc lập. + Dành cho người dùng nâng cao. Bạn có thể thiết lập URL gốc của từng dịch vụ một cách độc lập. Địa chỉ môi trường đã được lưu. - Địa chỉ nhận dạng máy chủ + URL máy chủ định danh Môi trường tự lưu trữ - Chỉ định URL cơ sở on-premise của bạn để cài đặt máy chủ Bitwarden. + Nhập URL cơ sở của cài đặt Bitwarden được lưu trữ trên máy chủ nội bộ của bạn. Địa chỉ máy chủ Địa chỉ máy chủ lưu trữ web Trường tùy chỉnh - Chép số + Sao chép số Sao chép mã bảo mật Số thẻ Mã bảo mật Thẻ - Danh bạ + Danh tính Đăng nhập - Ghi chú + Ghi chú bảo mật Địa chỉ 1 Địa chỉ 2 Địa chỉ 3 @@ -231,7 +231,7 @@ Quá trình quét sẽ diễn ra tự động. Thương hiệu Thông tin Thẻ Tên chủ thẻ - Quận/Huyện/Thị trấn + Xã / Phường Công ty Quốc gia Tháng 12 @@ -244,11 +244,11 @@ Quá trình quét sẽ diễn ra tự động. Tháng 7 Tháng 6 Họ - Họ tên đầy đủ - Biển số xe + Họ và tên + Số giấy phép lái xe Tháng 3 Tháng 5 - Tên lót + Tên đệm Ông Chị @@ -259,65 +259,65 @@ Quá trình quét sẽ diễn ra tự động. Số điện thoại Tháng 9 Số bảo hiểm xã hội - Tỉnh/Thành + Tỉnh/Thành Phố Danh xưng Mã bưu chính Địa chỉ Hết hạn Hiện biểu tượng trang web - Bên cạnh mỗi tài khoản. - Địa chỉ biểu tượng máy chủ + Hiện logo trang web bên cạnh mỗi đăng nhập. + URL máy chủ biểu tượng Kho đã khóa Đến kho của tôi - Các Bộ Sưu Tập + Các bộ sưu tập Không có mục nào trong bộ sưu tập này. Không có mục nào trong thư mục này. Không có gì trong thùng rác - Hỗ trợ điền tên người dùng và mật khẩu vào các ứng dụng khác và web. - Điền tự động của Bitwarden sử dụng Android Autofill Framework để điền thông tin đăng nhập vào các ứng dụng trên thiết bị của bạn. + Hỗ trợ điền tên người dùng và mật khẩu vào các trường tương ứng trong các ứng dụng khác và trên trang web. + Dịch vụ tự động điền của Bitwarden sử dụng Khung Tự động điền của Android để hỗ trợ điền thông tin đăng nhập, thẻ tín dụng và thông tin danh tính vào các ứng dụng khác trên thiết bị của bạn. Chúng tôi không thể mở cài đặt tự động điền cho bạn. Bạn có thể đi đến cài đặt tự động điền theo cách thủ công bằng cách vào Cài đặt > Hệ thống > Ngôn ngữ và nhập liệu > Nâng cao > Dịch vụ tự động điền. Tên trường tùy chỉnh - Có/Không + Đúng/Sai Ẩn Đã liên kết Văn bản Bạn muốn thêm loại trường tùy chỉnh nào? Xoá - URL Mới - Thêm website + Đường dẫn mới + Thêm trang web Tên miền cơ sở Mặc định Chính xác Máy chủ Biểu thức chính quy Bắt đầu với - Phát hiện khớp URL - Phát hiện khớp + Cách nhận diện đường dẫn + Độ phù hợp Tự động điền và lưu Tổ chức Thử lại - Created: %1$s - Password last updated: %1$s - Last edited: %1$s + Tạo bởi: %1$s + Mật khẩu được cập nhật lần cuối: %1$s + Lần sửa đổi cuối cùng: %1$s Địa chỉ email không hợp lệ. Thẻ - Danh bạ - ID + Danh tính + Định danh Đăng nhập - Ghi chú + Ghi chú bảo mật Thông tin Cá nhân Thông tin liên hệ - Kiểm tra mật khẩu có bị lộ - Mật khẩu này đã bị lộ %1$s lần trong các vụ rò rỉ dữ liệu. Bạn nên đổi nó. - Mật khẩu này không được tìm thấy trong lần rò rỉ dữ liệu nào trước đây. Nó an toàn để sử dụng. - Tên danh bạ + Kiểm tra xem mật khẩu có bị lộ + Mật khẩu này đã bị lộ %1$s lần trong các vụ rò rỉ dữ liệu. Bạn nên thay đổi nó. + Mật khẩu này không được tìm thấy trong các vụ rò rỉ dữ liệu nào trước đây. Nó an toàn để sử dụng. + Tên định danh Giá trị Lịch sử mật khẩu Lịch sử mật khẩu: %1$s Loại Không có mật khẩu nào. - Tìm tệp tin trong Gửi - Tìm văn bản trong Gửi + Tìm tệp trong Send + Tìm văn bản trong Send Loại Chuyển xuống Chuyển lên @@ -328,24 +328,24 @@ Quá trình quét sẽ diễn ra tự động. Chia sẻ Chuyển tới Tổ chức Không có tổ chức. - Chọn một tổ chức mà bạn muốn chuyển mục này đến. Việc chuyển đến một tổ chức sẽ chuyển quyền sở hữu mục này cho tổ chức đó. Bạn sẽ không còn là chủ sở hữu trực tiếp của mục này khi đã chuyển. - Số lượng chữ - Cụm từ mật khẩu - Dấu phân tách + Chọn một tổ chức mà bạn muốn chuyển mục này tới. Việc di chuyển đến một tổ chức sẽ chuyển quyền sở hữu của mục sang tổ chức mà bạn chọn. Bạn sẽ không còn là chủ sở hữu trực tiếp của mục này một khi nó đã được chuyển. + Số lượng từ + Cụm mật khẩu + Dấu phân cách từ Xóa Trình tạo Không có thư mục nào. - Cụm vân tay - Cụm vân tay tài khoản của bạn + Cụm từ xác thực + Cụm từ xác thực tài khoản của bạn Xuất kho - Khóa lập tức + Khóa ngay Mã PIN Mở khóa 30 phút - Đặt mã PIN để mở khóa Bitwarden. Cài đặt mã PIN của bạn sẽ bị xóa nếu bạn đăng xuất hoàn toàn khỏi ứng dụng. - Đã đăng nhập %1$s trên %2$s. - Dùng mật khẩu chính của bạn để mở khóa kho. - Đã khóa kho của bạn. Nhập mã PIN để mở. + Mã PIN của bạn phải có ít nhất 4 ký tự. Cài đặt mã PIN sẽ được đặt lại nếu bạn đăng xuất hoàn toàn khỏi ứng dụng. + Đã đăng nhập như %1$s trên %2$s. + Kho lưu trữ đã bị khóa. Nhập mật khẩu chính của bạn để mở. + Kho lưu trữ đã bị khóa. Nhập mã PIN của bạn để mở. Tối Sáng 5 phút @@ -355,26 +355,26 @@ Quá trình quét sẽ diễn ra tự động. 2 phút Xóa bộ nhớ tạm Tự động xóa mọi thứ đã sao chép khỏi bộ nhớ tạm. - Phương thức kiểm tra đường dẫn - Chọn phương thức kiểm tra đường dẫn để xử lý cho các hành động như là tự động điền thông tin đăng nhập. + Cách nhận diện đường dẫn (URI) + Chọn cách thức mặc định hệ thống so khớp đường dẫn (URI) để xử lý đăng nhập khi thực hiện các thao tác như tự động điền. Chủ đề - Chọn chủ đề ứng dụng. + Thay đổi màu sắc chủ đề của ứng dụng Sao chép ghi chú Thoát - Bạn có chắc muốn thoát Bitwarden? - Yêu cầu mật khẩu chính khi khởi động lại app? - Bạn có muốn yêu cầu mở khóa bằng mật khẩu chính khi khởi động lại ứng dụng? - Hỏi khi thêm thông tin đăng nhập - Gợi ý thêm mục nếu trong kho của bạn chưa có nó. + Bạn có chắc chắn muốn thoát Bitwarden? + Yêu cầu nhập mật khẩu chính khi khởi động lại ứng dụng? + Bạn có chắc chắn muốn nhập mật khẩu chính để mở khóa mỗi khi mở lại ứng dụng không? + Yêu cầu thêm thông tin đăng nhập + Nếu không tìm thấy mục nào trong kho của bạn, hãy yêu cầu thêm mục đó. Khi khởi động lại ứng dụng Viết hoa - Bao gồm số + Bao gồm cả số Tải xuống Phiên đăng nhập của bạn đã hết hạn. Xác minh sinh trắc học Sinh trắc học - Sinh trắc học thất bại - Đăng nhập bằng Mật Khẩu Chính hoặc mã PIN, sau đó bật lại Sinh trắc học trong Cài đặt. + Xác thực sinh trắc học thất bại + Đăng nhập bằng Mật khẩu chính hoặc Mã PIN của bạn, sau đó bật lại tính năng đăng nhập bằng sinh trắc học trong Cài đặt. Dùng sinh trắc học để mở khóa Định dạng tệp tin Nhập mật khẩu chính để xuất kho của bạn. @@ -382,16 +382,16 @@ Quá trình quét sẽ diễn ra tự động. Đã gửi mã! Xác minh danh tính để tiếp tục. Tệp trích xuất này chứa dữ liệu kho của bạn dưới một định dạng không được mã hóa. Bạn không nên lưu trữ hay gửi tệp này thông qua phương thức không an toàn (như email). Xóa nó ngay lập tức khi bạn đã dùng xong. - Tệp tin xuất này sẽ được bảo vệ bằng mật khẩu và yêu cầu mật khẩu để giải mã. + Tệp tin này sẽ được bảo vệ bằng mật khẩu và yêu cầu mật khẩu tệp tin để giải mã. Xác nhận xuất kho Cảnh báo - Xảy ra lỗi khi xuất kho của bạn. Nếu vấn đề vẫn tiếp diễn, hãy xuất trên bản web. + Có vấn đề khi xuất kho lưu trữ của bạn. Nếu vấn đề vẫn tiếp diễn, bạn sẽ cần xuất từ kho lưu trữ trực tuyến. Xuất kho hoàn tất Tạo bản sao - Các chính sách của tổ chức đang ảnh hưởng đến cài đặt tạo mật khẩu của bạn - Xảy ra lỗi khi lưu tệp đính kèm này. Nếu vấn đề vẫn tiếp diễn, hãy lưu nó trên bản web. + Các chính sách của tổ chức đang ảnh hưởng đến cài đặt của trình tạo + Có vấn đề khi lưu tệp đính kèm này. Nếu vấn đề vẫn tiếp diễn, bạn có thể lưu nó từ kho lưu trữ trực tuyến. Đã lưu tệp tin đính kèm thành công - Hãy bật \"Điền tự động bằng trợ năng\" từ Cài đặt của Bitwarden để sử dụng tính năng tự động điền. + Vui lòng bật \"Tự động điền bằng trợ năng\" từ Cài đặt Bitwarden để sử dụng ô Tự động điền. Không tìm thấy trường mật khẩu nào Đang cho vào thùng rác... Đã cho mục vào thùng rác. @@ -399,49 +399,49 @@ Quá trình quét sẽ diễn ra tự động. Đang khôi phục... Đã khôi phục mục Thùng rác - Bạn có chắc muốn xóa vĩnh viễn? Không thể hoàn tác. - Bạn có chắc muốn khôi phục mục này? - Bạn có chắc muốn cho vào thùng rác? - Mở khóa bằng sinh trắc học cho tài khoản này bị vô hiệu hóa trong khi chờ xác minh mật khẩu chính. + Bạn có chắc chắn muốn xóa vĩnh viễn không? Thao tác này không thể hoàn tác. + Bạn có chắc chắn muốn khôi phục mục này? + Bạn có chắc chắn muốn cho vào thùng rác? + Chức năng mở khóa bằng sinh trắc học cho tài khoản này đã bị vô hiệu hóa cho đến khi xác minh mật khẩu chính. Đồng bộ khi làm mới Đồng bộ kho bằng cách vuốt xuống. - Đăng nhập doanh nghiệp - Đăng nhập nhanh bằng cách sử dụng cổng đăng nhập một lần của tổ chức. Vui lòng nhập thông tin nhận dạng tổ chức để bắt đầu. - Nhận dạng tổ chức - Phương thức đăng nhập SSO hiện không khả dụng + Đăng nhập một lần cho doanh nghiệp + Đăng nhập nhanh chóng thông qua cổng đăng nhập một lần của tổ chức của bạn. Vui lòng nhập mã định danh của tổ chức để bắt đầu. + Mã định danh tổ chức + Hiện tại không thể đăng nhập bằng SSO Tạo mật khẩu chính - Một hay nhiều chính sách của tổ chức yêu cầu mật khẩu chính của bạn phải: + Các chính sách của tổ chức yêu cầu mật khẩu chính của bạn phải đáp ứng các yêu cầu sau: Độ mạnh tối thiểu %1$s Độ dài tối thiểu %1$s Có chứa một hay nhiều ký tự viết hoa - Có chứa một hay nhiều ký tự thường - Có chứa một hay nhiều số + Có chứa một hay nhiều ký tự viết thường + Có chứa một hay nhiều chữ số Có chứa một hay nhiều ký tự đặc biệt sau: %1$s Mật khẩu không đúng Mật khẩu không đáp ứng yêu cầu của tổ chức. Vui lòng kiểm tra chính sách mật khẩu và thử lại. Đang tải - Chính sách Bảo mật và Điều khoản Dịch vụ chưa có. + Điều khoản Dịch vụ và Chính sách Bảo mật chưa được xác nhận. Điều khoản Dịch vụ Chính sách Bảo mật Quản lý mã khoá - Tự động điền mật khẩu - Display autofill suggestions - Inline (shows in keyboard) - Popup (shows over input field) - Dùng trợ năng - Yêu cầu sử dụng Ô Quick-Action Tự động điền. + Dịch vụ tự động điền + Hiển thị đề xuất tự động điền + Hiển thị trực tiếp (hiển thị trên bàn phím) + Cửa sổ popup (hiển thị trên trường nhập liệu) + Sử dụng trợ năng + Cần kích hoạt ô Tự động điền trong bảng Cài đặt nhanh. Chính sách của tổ chức đang ảnh hưởng đến các tùy chọn quyền sở hữu của bạn. - Gửi - Chi tiết Gửi - Tất cả mục Gửi + Send + Chi tiết Send + Tất cả Send Văn bản - Nội dung muốn chia sẻ + Nội dung chia sẻ Văn bản - Khi truy cập vào mục Gửi, văn bản sẽ được ẩn theo mặc định - Tệp tin - Xóa sau + Khi truy cập vào Send, văn bản sẽ được ẩn theo mặc định + Tập tin + Ngày xóa Thời gian xóa - Mục Gửi sẽ được xóa vĩnh viễn vào ngày và giờ chỉ định. + Send sẽ được xóa vĩnh viễn vào ngày và giờ chỉ định. Đang chờ xóa Đã hết hạn Hết hạn vào %s @@ -449,27 +449,27 @@ Quá trình quét sẽ diễn ra tự động. Hết hạn vào %s Ngừng đăng nhập %1$s vào %2$s Số lần truy cập tối đa - Nếu được thiết lập, người dùng sẽ không thể truy cập mục Gửi này khi đã đạt tới số lần truy cập tối đa. + Nếu được thiết lập, người dùng sẽ không thể truy cập Send này khi đã đạt tới số lần truy cập tối đa. Đã vượt số lần truy cập tối đa - Số lần truy cập hiện tại + Số lần truy cập hiện tại: %s Mật khẩu mới Yêu cầu nhập mật khẩu này để truy cập mục Gửi. Xóa mật khẩu Đang xóa mật khẩu - Password removed - Mục Gửi mới + Đã xóa mật khẩu + Send mới Sao chép liên kết Chia sẻ liên kết - Liên kết Gửi - Tìm kiếm mục Gửi - Sửa mục Gửi - Chỉnh sửa tập tin Gửi - Chỉnh sửa văn bản Gửi - Tập tin Gửi mới - Văn bản Gửi mới - Bạn có chắc muốn mục Gửi này? - Đã xóa mục Gửi - Send updated + Liên kết Send + Tìm kiếm Send + Chỉnh sửa Send + Chỉnh sửa tệp Send + Chỉnh sửa văn bản Send + Send tập tin mới + Send văn bản mới + Bạn có chắc chắn muốn xóa Send này? + Đã xóa Send + Đã cập nhật Send 1 ngày 2 ngày 3 ngày @@ -477,14 +477,14 @@ Quá trình quét sẽ diễn ra tự động. 30 ngày Tùy chỉnh Thêm khóa xác thực này vào thông tin đăng nhập hiện có hoặc tạo thông tin đăng nhập mới. - Do chính sách doanh nghiệp, bạn chỉ có thể xóa những mục Gửi hiện có. - Về Gửi - Ẩn địa chỉ email của tôi - Các chính sách của tổ chức đang ảnh hưởng đến tùy chọn Gửi của bạn. - Tài khoản miễn phí chỉ được gửi văn bản. Nâng cấp lên gói Cao Cấp để gửi các tệp. + Do chính sách doanh nghiệp, bạn chỉ có thể xóa những Send hiện có. + Về Send + Ẩn địa chỉ email của tôi với người nhận + Các chính sách của tổ chức đang ảnh hưởng đến tùy chọn Send của bạn. + Tài khoản miễn phí chỉ được gửi văn bản. Nâng cấp lên gói Cao Cấp để gửi các tập tin. Nhập lại mật khẩu chính Xác nhận mật khẩu chính - Để tiếp tục, vui lòng nhập lại mật khẩu chính của bạn. + Hành động này được bảo vệ. Để tiếp tục, hãy nhập lại mật khẩu chính của bạn để xác minh danh tính. Mã Captcha không đúng. Vui lòng thử lại. Cập nhật mật khẩu chính Mật khẩu chính của bạn gần đây đã được thay đổi bởi người quản trị trong tổ chức của bạn. Để truy cập kho, bạn phải cập nhật mật khẩu chính của mình ngay bây giờ. Việc tiếp tục sẽ đăng xuất khỏi kho và bạn sẽ cần đăng nhập lại. Ứng dụng Bitwaden trên các thiết bị khác có thể tiếp tục hoạt động trong tối đa một giờ sau đó sẽ bị đăng xuất. @@ -497,7 +497,7 @@ Quá trình quét sẽ diễn ra tự động. Quay lại ứng dụng Tổ chức này có chính sách doanh nghiệp sẽ tự động đặt lại mật khẩu chính cho bạn. Đăng ký sẽ cho phép quản trị viên tổ chức thay đổi mật khẩu chính của bạn. Tổ chức của bạn đã đặt thời gian mở kho tối đa là %1$s giờ và %2$s phút. - Tổ chức của bạn đang ảnh hưởng đến thời gian mở kho. Thời gian mở kho tối đa là %1$s giờ và %2$s phút. Kho sẽ %3$s sau khi hết thời gian mở kho. + Chính sách tổ chức của bạn đang ảnh hưởng đến thời gian mở kho. Thời gian mở kho tối đa là %1$s giờ và %2$s phút. Kho sẽ %3$s sau khi hết thời gian mở kho. Tổ chức của bạn sẽ %1$s sau khi hết thời gian mở kho. Thời gian mở kho vượt quá giới hạn do tổ chức của bạn đặt ra. Các chính sách của tổ chức ngăn cản bạn xuất kho lưu trữ cá nhân của mình. @@ -505,7 +505,7 @@ Quá trình quét sẽ diễn ra tự động. Đã mở khóa Đã khóa Đã đăng xuất - Đã đổi sang tài khoản có sẵn kế tiếp + Đã chuyển sang tài khoản kế tiếp có sẵn Xóa tài khoản Xóa vĩnh viễn tài khoản của bạn Tài khoản của bạn và tất cả dữ liệu trong kho sẽ bị xóa và không thể khôi phục được. Bạn có chắc chắn muốn tiếp tục không? @@ -522,14 +522,14 @@ Quá trình quét sẽ diễn ra tự động. Chữ thường (a-z) Số (0-9) Ký tự đặc biệt (!@#$%^&*) - Lọc mục theo kho - Tất cả kho + Lọc các mục theo kho + Tất cả các kho Kho Kho: %1$s Tất cả TOTP Mã xác minh - Yêu cầu đăng ký gói Premium + Yêu cầu đăng ký gói Cao cấp Không thể thêm khóa xác thực? Quét mã QR Quét mã QR Không thể quét mã QR? Nhập khóa thủ công @@ -538,21 +538,21 @@ Quá trình quét sẽ diễn ra tự động. Nhập khóa thủ công Thêm TOTP Thiết lập khóa xác thực - Khi nhập khóa thành công, + Sau khi nhập khóa thành công, chọn Thêm TOTP để lưu khóa an toàn Đặt tùy chọn khóa của bạn thành “Không bao giờ” sẽ khiến bất kỳ ai có quyền truy cập vào thiết bị của bạn cũng có thể mở kho. Hãy đảm bảo rằng bạn luôn bảo vệ thiết bị của mình đúng cách. - Một hoặc nhiều URL đã nhập không hợp lệ. Vui lòng sửa và thử lại. + Một hoặc nhiều URL đã nhập không hợp lệ. Vui lòng kiểm tra lại và thử lưu lại. Chúng tôi không thể xử lý yêu cầu của bạn. Vui lòng thử lại hoặc liên hệ hỗ trợ. Cho phép chụp màn hình - Bạn có chắc muốn cho phép chụp màn hình? + Bạn có chắc chắn muốn cho phép chụp màn hình? Yêu cầu đăng nhập - Bạn đang cố đăng nhập? - Lần đăng nhập của %1$s trên %2$s + Bạn đang cố gắng đăng nhập? + Thao tác đăng nhập của %1$s vào %2$s Loại thiết bị Địa chỉ IP - Thời Gian - Select time - Switch input mode + Thời gian + Chọn thời gian + Chuyển đổi chế độ nhập liệu Xác nhận đăng nhập Từ chối đăng nhập Đăng nhập bị từ chối @@ -561,8 +561,8 @@ chọn Thêm TOTP để lưu khóa an toàn Phê duyệt đăng nhập cho %1$s Loại tên người dùng Địa chỉ email có hậu tố - Email thông thường - Email bí danh chuyển tiếp + Catch-all email + Địa chỉ email thay thế Từ ngẫu nhiên Email (bắt buộc) tên miền @@ -576,269 +576,269 @@ chọn Thêm TOTP để lưu khóa an toàn DuckDuckGo Fastmail ForwardEmail - Mã truy cập API (bắt buộc) - Khoá truy cập API - Bạn có chắc muốn ghi đè lên tên người dùng hiện tại không? + Token truy cập API (bắt buộc) + Token truy cập API + Bạn có chắc chắn muốn ghi đè lên tên người dùng hiện tại không? Tạo tên người dùng - Sử dụng khả năng địa chỉ phụ của nhà cung cấp dịch vụ mail của bạn + Sử dụng tính năng địa chỉ phụ của nhà cung cấp dịch vụ email của bạn Sử dụng hộp thư bạn đã thiết lập để nhận tất cả email gửi đến tên miền của bạn. - Tạo bí danh email với dịch vụ chuyển tiếp bên ngoài. - Tiết lộ Dịch vụ trợ năng - Bitwarden sử dụng Dịch vụ trợ năng để tìm kiếm các trường đăng nhập trong ứng dụng và trang web, sau đó thiết lập ID trường thích hợp để nhập tên người dùng và mật khẩu khi tìm thấy kết quả trùng khớp với ứng dụng hoặc trang web đã lưu. Chúng tôi không lưu trữ bất kỳ thông tin nào được dịch vụ cung cấp cho chúng tôi và chúng tôi cũng không thực hiện bất kỳ nỗ lực nào để kiểm soát bất kỳ thành phần nào trên màn hình ngoài việc nhập văn bản cần điền. + Tạo một địa chỉ email ảo bằng dịch vụ chuyển tiếp email bên ngoài. + Thông báo về Dịch vụ Trợ năng + Bitwarden sử dụng Dịch vụ trợ năng để tìm kiếm các trường đăng nhập trong ứng dụng và trang web, sau đó thiết lập ID trường thích hợp để nhập tên người dùng & mật khẩu khi tìm thấy ứng dụng hoặc trang web tương ứng. Chúng tôi không lưu trữ bất kỳ thông tin nào được dịch vụ cung cấp, cũng như không cố gắng kiểm soát bất kỳ yếu tố nào trên màn hình ngoài việc nhập thông tin đăng nhập. Đồng ý Từ chối Yêu cầu đăng nhập đã hết hạn. Nỗ lực đăng nhập từ: %1$s Bạn có muốn chuyển sang tài khoản này không? - Mới dùng Bitwarden? + Bạn mới sử dụng Bitwarden? Nhận gợi ý mật khẩu chính Đăng nhập như %1$s trên %2$s Không phải bạn? Đăng nhập bằng mật khẩu chính Bắt đầu đăng nhập Một thông báo đã được gửi đến thiết bị của bạn. - Vui lòng đảm bảo rằng bạn đã mở khoá kho và cụm vân tay khớp trên thiết bị khác. + Vui lòng đảm bảo rằng bạn đã mở khoá kho và cụm từ xác thực khớp với thiết bị khác. Gửi lại thông báo - Xem tất cả các tùy chọn đăng nhập + Xem tất cả tùy chọn đăng nhập Yêu cầu đăng nhập chờ xử lý Từ chối tất cả yêu cầu Bạn có chắc muốn từ chối tất cả các yêu cầu đăng nhập đang chờ? Không có yêu cầu đang chờ phê duyệt - Bật quyền của máy ảnh để sử dụng trình quét + Cấp quyền máy ảnh để sử dụng trình quét Ngôn ngữ - Đã đổi ngôn ngữ thành %1$s. Khởi động lại ứng dụng để áp dụng + Ngôn ngữ đã được đổi thành %1$s. Khởi động lại ứng dụng để áp dụng Giống như hệ thống Quan trọng - Mật khẩu chính của bạn không thể phục hồi nếu bạn quên nó! Tối thiểu %1$s ký tự. + Không thể lấy lại mật khẩu chính nếu bạn quên nó! Tối thiểu %1$s ký tự. Mật khẩu chính Yếu - Mật khẩu yếu. Bạn có chắc muốn sử dụng mật khẩu yếu không? + Mật khẩu này khá yếu. Hãy sử dụng mật khẩu mạnh để bảo vệ tài khoản của bạn. Bạn có chắc chắn muốn sử dụng mật khẩu yếu này không? Yếu Tốt Mạnh - Kiểm tra mật khẩu có lộ trong các vụ rò rỉ dữ liệu hay không - Mật khẩu chính bị lộ - Mật khẩu này đã bị rò rỉ trong một vụ tấn công dữ liệu. Bạn có chắc muốn sử dụng mật khẩu đã bị rò rỉ? - Mật khẩu chính yếu và bị lộ - Mật khẩu này yếu và đã bị rò rỉ trong một vụ tấn công dữ liệu. Bạn có chắc muốn sử dụng mật khẩu này? + Kiểm tra mật khẩu có bị lộ trong các vụ rò rỉ dữ liệu hay không + Mật khẩu chính đã bị lộ + Mật khẩu này đã bị lộ trong một vụ rò rỉ dữ liệu. Hãy sử dụng mật khẩu mạnh và duy nhất để bảo vệ tài khoản của bạn. Bạn có chắc chắn muốn sử dụng mật khẩu đã bị lộ này không? + Mật khẩu chính yếu và đã bị lộ + Mật khẩu yếu này đã bị rò rỉ trong một vụ tấn công dữ liệu. Hãy dùng mật khẩu mạnh và duy nhất để bảo vệ tài khoản của bạn. Bạn có chắc muốn sử dụng mật khẩu đã bị rò rỉ? Không tìm thấy Tự lưu trữ Khu vực - Mật khẩu chính của bạn không đáp ứng chính sách tổ chức của bạn. Để truy cập kho, bạn phải cập nhật mật khẩu chính của mình ngay bây giờ. Việc tiếp tục sẽ đăng xuất bạn khỏi phiên hiện tại và bắt buộc đăng nhập lại. Các phiên hoạt động trên các thiết bị khác có thể tiếp tục duy trì hoạt động trong tối đa một giờ. + Mật khẩu chính của bạn không đáp ứng chính sách của tổ chức của bạn. Để truy cập kho, bạn phải cập nhật mật khẩu chính của mình ngay bây giờ. Việc tiếp tục sẽ đăng xuất bạn khỏi phiên hiện tại và bắt buộc đăng nhập lại. Các phiên hoạt động trên các thiết bị khác có thể tiếp tục duy trì hoạt động trong tối đa một giờ. Mật khẩu chính hiện tại (bắt buộc) Phê duyệt bằng thiết bị khác Yêu cầu quản trị viên phê duyệt Phê duyệt bằng mật khẩu chính - Tắt bằng một thiết bị công khai + Tắt khi sử dụng thiết bị công cộng Lưu thiết bị này Mã khoá - Không thể sao chép mã khoá - Bản sao sẽ không bao gồm mã khoá. Bạn có muốn tiếp tục tạo bản sao mục này? - Gợi ý mật khẩu chính + Mã khóa sẽ không được sao chép + Bản sao sẽ không bao gồm mã khoá. Bạn có muốn tiếp tục tạo bản sao cho mục này? + Hướng dẫn nhập lại mật khẩu chính Yêu cầu quản trị viên phê duyệt Yêu cầu của bạn đã được gửi đến quản trị viên. - Bạn sẽ có thông báo nếu được phê duyệt. - Không thể đăng nhập? + Bạn sẽ nhận thông báo sau khi được phê duyệt. + Gặp vấn đề khi đăng nhập? Chặn tự động điền - Không tự động điền với các URL này. - Thêm URL mới + Tính năng tự động điền sẽ không hoạt động với các đường dẫn này. + Chặn đường dẫn mới Định dạng không hợp lệ. Dùng https://, http://, hoặc androidapp:// - Nhập URL - Định dạng: %1$s. Dùng dấu phẩy để phân tách URL. - URI không hợp lệ - URI %1$s đã bị chặn + Nhập đường dẫn + Định dạng: %1$s. Phân tách các đường dẫn bằng dấu phẩy. + Đường dẫn không hợp lệ + Đường dẫn %1$s đã bị chặn Lượt đăng nhập đã duyệt - Đăng nhập bằng thiết bị phải được thiết lập trong cài đặt của ứng dụng Bitwarden. Dùng cách khác? + Đăng nhập bằng thiết bị phải được thiết lập trong phần cài đặt của ứng dụng Bitwarden. Dùng cách khác? Đăng nhập bằng thiết bị - Đăng nhập máy chủ - Đang đăng nhập: - Kho mật khẩu + Đang đăng nhập vào + Đang đăng nhập vào: + Kho lưu trữ Giao diện Bảo mật tài khoản Trung tâm hỗ trợ Bitwarden Đồng bộ ngay - Mở khóa kho + Tùy chọn mở khóa Thời gian hết phiên Hành động sau khi hết phiên - Cụm vân tay tài khoản - Dùng Bitwarden để lưu các mã khoá mới và đăng nhập bằng các mã khoá được lưu trong kho của bạn. - Dùng Android Autofill Framework để điền thông tin đăng nhập vào các ứng dụng trên điện thoại. - Dùng tính năng tự động điền nội tuyến nếu bàn phím hỗ trợ. Nếu không, sẽ dùng lớp phủ mặc định. + Cụm từ xác thực tài khoản + Sử dụng Bitwarden để lưu các mã khoá mới và đăng nhập bằng các mã khoá đã lưu trong kho của bạn. + Cho phép Bitwarden sử dụng thông tin đăng nhập đã lưu của bạn để đăng nhập vào các ứng dụng khác trên thiết bị của bạn. + Chọn cách hiển thị các đề xuất tự động điền khi bạn đăng nhập vào các ứng dụng khác trên thiết bị của mình. Tùy chọn bổ sung - Tiếp tục tới ứng dụng web? + Tiếp tục tới bản web? Đi đến %1$s? Tiếp tục tới Trung tâm trợ giúp? Đồng ý với chính sách bảo mật? Tiếp tục tới Cài đặt thiết bị? - Bảo vệ tài khoản của bạn an toàn hơn bằng cách thiết lập đăng nhập hai bước trên Bitwarden bản web. - Bạn có thể thay đổi mật khẩu chính của mình trên Bitwarden bản web. - Bạn có thể nhập dữ liệu vào kho mật khẩu trên %1$s. + Tăng cường bảo mật tài khoản của bạn bằng cách thiết lập đăng nhập hai bước trên trang web Bitwarden. + Bạn có thể thay đổi mật khẩu chính của mình trên trang web Bitwarden. + Bạn có thể nhập dữ liệu vào kho lưu trữ trên %1$s. Tìm hiểu thêm về cách sử dụng Bitwarden trong Trung tâm trợ giúp. Đọc chính sách bảo mật trên bitwarden.com. - Khám phá thêm các tính năng của tài khoản Bitwarden của bạn trên bản web. - Bitwarden cho phép bạn chia sẻ các mục trong kho mật khẩu với người khác bằng cách tạo một tổ chức. Tìm hiểu thêm trên bitwarden.com. - Created %1$s - Tổ chức của bạn yêu cầu bạn đặt mật khẩu chính. - Thiết lập khóa khi hết thời gian chờ kho. + Khám phá thêm các tính năng tài khoản Bitwarden của bạn trên bản web. + Bitwarden cho phép bạn chia sẻ các mục trong kho lưu trữ với người khác bằng cách tạo một tổ chức. Tìm hiểu thêm trên bitwarden.com. + Tạo bởi %1$s + Tổ chức của bạn yêu cầu bạn thiết lập mật khẩu chính. + Thiết lập phương thức mở khóa để thay đổi hành động hết thời gian mở kho. Lưu mã khoá như đăng nhập mới Ghi đè mã khoá? Mục này đã chứa mã khoá. Bạn có chắc muốn ghi đè mã khoá hiện tại không? - Tài khoản của bạn bắt buộc đăng nhập 2 bước Dou. + Tài khoản của bạn bắt buộc đăng nhập hai bước bằng Duo. Làm theo các bước từ Dou để hoàn tất đăng nhập. Khởi chạy Dou - Mã khoá sẽ được lưu vào kho Bitwarden của bạn cho %1$s + Mã khoá sẽ được lưu vào kho Bitwarden của bạn trong %1$s Ứng dụng này không hỗ trợ mã khoá - Thao tác mã khóa không thành công vì trình duyệt không có quyền - Thao tác mã khóa không thành công vì chữ ký trình duyệt không khớp - Thao tác mã khóa không thành công vì liên kết tài sản bị thiếu - Thao tác mã khóa không thành công vì không thể xác minh ứng dụng + Vận hành mã khóa thất bại vì trình duyệt không có quyền + Vận hành mã khóa không thành công vì chữ ký trình duyệt không khớp + Vận hành mã khóa không thành công do thiếu liên kết tài sản + Vận hành mã khóa thất bại vì không thể xác minh ứng dụng Nhập lại mật khẩu tệp tin Mật khẩu tệp tin - Được bảo vệ bởi mật khẩu + Được bảo vệ bằng mật khẩu Mật khẩu này sẽ được sử dụng để xuất và nhập tệp tin này - Gợi ý điền tự động + Gợi ý tự động điền Tiếp tục xác thực với WebAuthn. Khởi chạy WebAuthn Xảy ra lỗi khi khởi động xác thực hai bước với WebAuthn URL máy chủ tự lưu trữ - Thao tác mã khóa không thành công vì không thể xác minh người dùng. + Vận hành mã khóa thất bại vì không thể xác minh người dùng. Xác minh người dùng - Tạo tài khoản - Đang tạo tài khoản: - Chúng tôi đã gửi một email tới %1$s. - Nếu tiếp tục, bạn đồng ý Điều khoản dịch vụ và Chính sách bảo mật - Kích hoạt nghĩa là bạn đồng ý Điều khoản Dịch vụChính sách Bảo mật + Tạo tài khoản trên + Tạo tài khoản trên: + Chúng tôi đã gửi một email tới %1$s. + Bằng cách tiếp tục, bạn đồng ý với Điều khoản Dịch vụChính sách Bảo mật + Bằng cách kích hoạt công tắc này, bạn đồng ý với Điều khoản Dịch vụChính sách Bảo mật Hủy đăng ký Kiểm tra email của bạn Mở ứng dụng email - Email đã xác minh - Nhận email từ Bitwarden để nhận thông báo, đề xuất và cơ hội nghiên cứu. Hủy đăng ký bất cứ lúc nào. - Ưu tiên bảo mật - Lưu thông tin đăng nhập, thẻ tín dụng và danh bạ vào kho lưu trữ an toàn của bạn. Bitwarden sử dụng mã hóa đầu cuối không cần kiến ​​thức để bảo vệ những gì quan trọng với bạn. - Thiết lập mở khóa sinh trắc học và tự động điền để đăng nhập vào tài khoản của bạn mà không cần nhập tay. - Đăng nhập nhanh và dễ dàng - Nâng cấp thông tin đăng nhập của bạn - Sử dụng trình tạo mật khẩu để tạo và lưu trữ các mật khẩu mạnh, duy nhất cho mọi tài khoản của bạn. - Dữ liệu của bạn, có mọi lúc mọi nơi bạn cần - Lưu trữ mật khẩu vô hạn trên nhiều thiết bị với ứng dụng Bitwarden di động, trình duyệt và máy tính để bàn. + Đã xác minh email + Nhận email từ Bitwarden để cập nhật thông tin, lời khuyên và cơ hội nghiên cứu. Hủy đăng ký bất cứ lúc nào. + Bảo mật, ưu tiên hàng đầu + Lưu trữ thông tin đăng nhập, thẻ tín dụng và thông tin cá nhân vào kho lưu trữ an toàn của bạn. Bitwarden sử dụng mã hóa đầu cuối không tiết lộ thông tin (zero-knowledge) để bảo vệ những gì quan trọng đối với bạn. + Cài đặt tính năng mở khóa bằng sinh trắc học và tự động điền thông tin để đăng nhập vào các tài khoản của bạn mà không cần nhập bất kỳ ký tự nào. + Đăng nhập nhanh chóng và dễ dàng + Nâng cấp đăng nhập của bạn + Sử dụng trình tạo mật khẩu để tạo và lưu trữ các mật khẩu mạnh, duy nhất cho tất cả các tài khoản của bạn. + Dữ liệu của bạn, mọi lúc, mọi nơi bạn cần + Lưu trữ mật khẩu không giới hạn trên tất cả các thiết bị với ứng dụng di động, trình duyệt và máy tính của Bitwarden. Xóa mã khoá Đã xóa mã khoá - Làm sao để mật khẩu mạnh? + Điều gì giúp một mật khẩu mạnh? Một mật khẩu an toàn và dễ nhớ Thiết lập tài khoản Thiết lập mở khóa Thiết lập sau Thiết lập mở khóa sau? - Bạn có thể hoàn tất bước này sau trong mục Bảo mật tài khoản trong Cài đặt. + Bạn có thể hoàn tất bước này sau ở phần Bảo mật tài khoản trong Cài đặt. Xác nhận - Thiết lập sinh trắc học hoặc mã PIN để truy cập nhanh vào kho và Tự động điền thông tin đăng nhập của bạn. + Thiết lập sinh trắc học hoặc mã PIN để mở kho nhanh chóng và Tự động điền thông tin đăng nhập của bạn. Không lo mất quyền truy cập kho - Cách tốt nhất để đảm bảo bạn luôn có thể truy cập vào kho mật khẩu của mình là thiết lập biện pháp bảo vệ ngay từ đầu. + Cách tốt nhất để đảm bảo bạn luôn có thể truy cập vào kho lưu trữ của mình là thiết lập biện pháp bảo vệ ngay từ đầu. Một trong những cách tốt nhất để tạo mật khẩu an toàn và dễ nhớ là sử dụng cụm mật khẩu. \nĐây là cách: - Tạo gợi ý + Tạo một gợi ý Gợi ý của bạn sẽ được gửi qua email khi bạn yêu cầu. - Viết mật khẩu ra - Hãy giữ mật khẩu đã viết ở nơi bí mật và an toàn. + Ghi lại mật khẩu của bạn + Hãy cẩn thận giữ mật khẩu đã viết ở nơi bí mật và an toàn. Ngăn ngừa việc tài khoản bị khóa Tạo mật khẩu chính Tạo Hãy ghi lại mật khẩu này và giữ ở nơi an toàn. - Tìm hiểu thêm các cách khác để ngăn chặn việc tài khoản bị khoá + Tìm hiểu thêm các cách khác để ngăn ngừa việc tài khoản bị khoá Tìm hiểu cách tránh bị khóa tài khoản Trợ giúp về vị trí địa lý của máy chủ. Địa chỉ email (bắt buộc) "Nhấn vào liên kết trong email để xác minh địa chỉ email của bạn và tiếp tục tạo tài khoản. " Thay đổi địa chỉ email Tiếp theo - Bitwarden không thể khôi phục mật khẩu chính bị mất hoặc bị quên. - Bitwarden không thể khôi phục mật khẩu chính bị mất hoặc bị quên. + Bitwarden không thể khôi phục mật khẩu chính bị mất hoặc quên. + Bitwarden không thể đặt lại mật khẩu chính đã bị mất hoặc quên. Chọn mật khẩu chính của bạn - Chọn mật khẩu mạnh và duy nhất để giữ thông tin của bạn an toàn. + Chọn mật khẩu mạnh và duy nhất để bảo vệ thông tin của bạn an toàn. %1$s ký tự Liên kết đã hết hạn Vui lòng tiến hành đăng ký lại hoặc thử đăng nhập. Bạn có thể đã có tài khoản. Đăng ký lại - Đồng bộ Xác minh - Cho phép Đồng bộ Xác minh Bitwarden - Đã xảy ra sự cố khi xác thực token đăng ký. - Bật Tự động điền mật khẩu + Đồng bộ hóa trình xác thực + Cho phép đồng bộ hóa trình xác thực + Có vấn đề trong quá trình xác thực token đăng ký. + Bật tự động điền Dùng tính năng tự động điền để đăng nhập vào tài khoản của bạn chỉ bằng một lần chạm. Bật sau Bật tự động điền sau? - Bạn có thể hoàn tất bước này sau trong mục Cài đặt. - Bây giờ bạn có thể sử dụng tính năng tự động điền để đăng nhập vào các ứng dụng và trang web bằng mật khẩu đã lưu. Bây giờ, bạn có thể khám phá mọi thứ khác mà Bitwarden cung cấp. + Bạn có thể hoàn tất bước này sau trong Phần Cài đặt. + Bạn có thể khám phá tất cả các tính năng mà Bitwarden cung cấp và bắt đầu quản lý mật khẩu của mình một cách an toàn. Bạn đã hoàn tất! Lỗi kết nối với dịch vụ Duo. Sử dụng phương thức đăng nhập hai bước khác hoặc liên hệ với Duo để được hỗ trợ. Gợi ý mật khẩu chính Gợi ý mật khẩu chính mới Bắt đầu Lưu và bảo vệ dữ liệu của bạn - Kho lưu trữ không chỉ bảo vệ mật khẩu. Lưu trữ thông tin đăng nhập, ID, thẻ và ghi chú an toàn tại đây. + Kho lưu trữ không chỉ bảo vệ mật khẩu. Bạn có thể lưu trữ an toàn các thông tin đăng nhập, ID, thẻ và ghi chú tại đây. Đăng nhập mới - Chia sẻ file và dữ liệu an toàn với bất kỳ ai, trên bất kỳ nền tảng nào. Thông tin của bạn sẽ được mã hóa đầu cuối để hạn chế khả năng bị lộ. - Gửi thông tin nhạy cảm an toàn - Nhập lượt đăng nhập đã lưu + Chia sẻ tệp tin và dữ liệu một cách an toàn với bất kỳ ai, trên bất kỳ nền tảng nào. Thông tin của bạn sẽ được mã hóa đầu cuối để hạn chế rủi ro bị lộ. + Gửi thông tin nhạy cảm một cách an toàn + Nhập các thông tin đăng nhập đã lưu Sử dụng máy tính để nhập thông tin đăng nhập từ trình quản lý mật khẩu hiện có - Bạn có thể hoàn tất bước này sau trong mục Cài đặt. - Nhập sau - Nhập đăng nhập sau? + Bạn có thể hoàn tất bước này sau trong mục Cài đặt kho. + Nhập thông tin đăng nhập sau + Nhập thông tin đăng nhập sau? Bạn có máy tính? - Đây là cách bạn nhập thông tin đăng nhập từ máy tính để bàn hoặc máy tính xách tay - Nhập đăng nhập - Từ máy tính của bạn, hãy làm theo các hướng dẫn sau để xuất mật khẩu đã lưu từ trình duyệt hoặc trình quản lý mật khẩu khác. Sau đó, nhập chúng một cách an toàn vào Bitwarden. - Tạo khởi đầu cho kho - Mở khóa bằng xác thực sinh trắc học có thể không tương thích với các tùy chọn sinh trắc học trên thiết bị này. - Mở khóa bằng xác thực sinh trắc học có thể không tương thích với các tùy chọn sinh trắc học trên thiết bị này. - Trên máy tính, đăng nhập vào trình duyệt hoặc trình quản lý mật khẩu. - Xuất mật khẩu. Tùy chọn này thường có trong cài đặt. - Chọn nhập dữ liệu trong web app, sau đó Xong để hoàn tất đồng bộ. + Các hướng dẫn sau đây sẽ chỉ bạn cách nhập thông tin đăng nhập từ máy tính để bàn hoặc laptop của bạn + Nhập thông tin đăng nhập + Trên máy tính của bạn, hãy làm theo các bước sau để xuất các mật khẩu đã lưu từ trình duyệt hoặc trình quản lý mật khẩu khác. Sau đó, nhập chúng vào Bitwarden một cách an toàn. + Khởi động nhanh kho lưu trữ của bạn + Mở khóa bằng sinh trắc học yêu cầu xác thực sinh trắc học mạnh mẽ và có thể không tương thích với tất cả các tùy chọn sinh trắc học trên thiết bị này. + Mở khóa bằng sinh trắc học yêu cầu xác thực sinh trắc học mạnh mẽ và không tương thích với các tùy chọn sinh trắc học có sẵn trên thiết bị này. + Trên máy tính của bạn, đăng nhập vào trình duyệt hiện tại hoặc trình quản lý mật khẩu của bạn. + Xuất khẩu mật khẩu của bạn. Tùy chọn này thường được tìm thấy trong phần cài đặt. + Chọn \"Nhập dữ liệu\" trong bản web, sau đó nhấn \"Xong\" bên dưới để hoàn tất quá trình đồng bộ hóa. Bước 1 trong 3 - Xuất lượt đăng nhập đã lưu - Bạn sẽ xóa file này sau khi nhập xong. - Trên máy tính, mở một tab trình duyệt mới và đến vault.bitwarden.com + Xuất các thông tin đăng nhập đã lưu + Bạn sẽ xóa tệp này sau khi quá trình nhập dữ liệu hoàn tất. + Trên máy tính của bạn, mở một tab trình duyệt mới và truy cập vào %1$s Đăng nhập Bitwarden bản web. Bước 2 trong 3 Đăng nhập Bitwarden Bước 3 trong 3 - Nhập đăng nhập vào Bitwarden - Trên Bitwarden, tìm tùy chọn Công cụ và chọn Nhập dữ liệu. - Điền biểu mẫu và nhập file mật khẩu đã lưu. - Để bảo mật, hãy xóa file mật khẩu đã lưu. - Cần trợ giúp? Xem trợ giúp nhập. - Lưu file đã xuất trên máy tính để tìm dễ hơn. - Đây là một máy chủ Bitwarden chưa rõ. Bạn có thể cần kiểm tra với nhà cung cấp hoặc cập nhật máy chủ của mình. + Nhập thông tin đăng nhập vào Bitwarden + Trong giao diện điều hướng của Bitwarden, tìm tùy chọn Công cụ chọn Nhập dữ liệu. + Điền vào biểu mẫu và nhập tệp mật khẩu đã lưu của bạn. + Để đảm bảo an toàn cho bạn, hãy chắc chắn rằng bạn đã xóa tệp mật khẩu đã lưu của mình. + Cần trợ giúp? Hãy xem hướng dẫn nhập dữ liệu. + Lưu tệp đã xuất ở một vị trí trên máy tính của bạn mà bạn có thể dễ dàng tìm thấy. + Đây không phải là máy chủ Bitwarden được công nhận. Bạn có thể cần liên hệ với nhà cung cấp dịch vụ hoặc cập nhật máy chủ của mình. Đang đồng bộ... - Tải tiện ích trình duyệt - Truy cập bitwarden.com/download để tích hợp Bitwarden vào trình duyệt yêu thích của bạn. + Tải xuống tiện ích mở rộng trình duyệt + Truy cập bitwarden.com/download và tích hợp Bitwarden vào trình duyệt yêu thích của bạn để có trải nghiệm liền mạch. Dùng bản web - Đăng nhập bitwarden.com để quản lý tài khoản và cập nhật thiết lập dễ dàng. + Đăng nhập vào bitwarden.com để dễ dàng quản lý tài khoản và cập nhật cài đặt. Tự động điền mật khẩu Thiết lập tính năng tự động điền trên mọi thiết bị của bạn để đăng nhập chỉ bằng một lần chạm ở bất kỳ đâu. Nhập thành công! - Quản lý thông tin đăng nhập của bạn từ mọi nơi bằng công cụ Bitwarden dành cho web và máy tính để bàn. + Quản lý thông tin đăng nhập của bạn từ mọi nơi với các công cụ Bitwarden cho web và máy tính. Công cụ Bitwarden Đã hiểu - Chưa nhập lượt đăng nhập nào - Lỗi nhập - Đã nhập lượt đăng nhập - Nhớ xóa file mật khẩu đã nhập khỏi máy tính + Không có tài khoản nào được nhập + Lỗi khi nhập + Đã nhập các thông tin đăng nhập + Hãy nhớ xóa tệp mật khẩu đã nhập khỏi máy tính của bạn Khóa SSH Khóa công khai Khóa riêng tư Khóa SSH - Chép khóa công khai - Chép vân tay + Sao chép khóa công khai + Sao chép vân tay Bật thông báo - Đăng nhập nhanh và dễ dàng giữa các thiết bị - Bitwarden có thể thông báo cho bạn mỗi khi bạn nhận được yêu cầu đăng nhập mới từ thiết bị khác. - Bỏ qua + Đăng nhập nhanh và dễ dàng trên mọi thiết bị + Bitwarden có thể thông báo cho bạn mỗi khi nhận được yêu cầu đăng nhập mới từ một thiết bị khác. + Bỏ qua bây giờ Xong %1$s trên %2$s - Sao chép tên danh bạ + Sao chép tên định danh Sao chép công ty - Sao chép số an sinh xã hội + Sao chép số bảo hiểm xã hội Sao chép số hộ chiếu - Sao chép biển số xe + Sao chép số giấy phép Sao chép email Sao chép số điện thoại Sao chép địa chỉ @@ -847,48 +847,48 @@ Bạn có muốn chuyển sang tài khoản này không? Nhập CXP Xuất CXP Chọn ba hoặc bốn từ ngẫu nhiên - Chọn ba hoặc bốn từ ngẫu nhiên, không liên quan mà bạn có thể dễ dàng nhớ được. Nghĩ về các đồ vật, địa điểm hoặc những thứ bạn thích. - Gom những từ này lại cùng nhau - Ghép từ lại với nhau theo bất kỳ thứ tự nào để tạo thành cụm mật khẩu của bạn. Sử dụng dấu gạch nối, khoảng trắng hoặc để chúng thành một từ dài—tùy bạn chọn! - Tùy bạn thích - Thêm số hoặc ký hiệu để làm cho mật khẩu mạnh hơn. Bây giờ bạn có một mật khẩu độc đáo, an toàn và dễ nhớ! - "Cần cảm hứng?" + Chọn ba hoặc bốn từ ngẫu nhiên, không liên quan đến nhau mà bạn có thể dễ dàng nhớ. Hãy nghĩ đến đồ vật, địa điểm hoặc thứ gì đó mà bạn thích. + Kết hợp các từ đó lại với nhau + Ghép các từ lại với nhau theo bất kỳ thứ tự nào để tạo thành cụm mật khẩu của bạn. Sử dụng dấu gạch ngang, khoảng trắng hoặc để nguyên thành một từ dài—tuỳ bạn chọn! + Tùy theo ý bạn + Thêm số hoặc ký tự đặc biệt để làm cho nó mạnh mẽ hơn nữa. Bây giờ bạn đã có một cụm mật khẩu duy nhất, an toàn và dễ nhớ! + "Cần một chút cảm hứng?" "Tham khảo trình tạo cụm mật khẩu" - Chúng tôi không thể xác minh chứng chỉ của máy chủ. Chuỗi chứng chỉ hoặc cài đặt proxy trên thiết bị hoặc máy chủ Bitwarden của bạn có thể không được thiết lập đúng. - Đã khởi động xem trước luồng thao tác! - Chép khóa riêng tư + Chúng tôi không thể xác minh chứng chỉ của máy chủ. Chuỗi chứng chỉ hoặc cài đặt proxy trên thiết bị hoặc máy chủ Bitwarden của bạn có thể chưa được cấu hình đúng cách. + Quy trình đánh giá đã được khởi động! + Sao chép khóa riêng tư Thông tin đăng nhập - Tự động điền + Tùy chọn tự động điền Sử dụng nút này để tạo mật khẩu mới duy nhất. - 1 trong 3 - 2 trong 3 - Bạn chỉ cần thiết lập Mã Xác Thực cho các lần đăng nhập yêu cầu xác thực hai bước bằng mã. Sáu chữ số sẽ liên tục được tạo để bạn có thể dùng đăng nhập. - 3 trong 3 + 1 TRONG 3 + 2 TRONG 3 + Bạn chỉ cần thiết lập Khóa xác thực cho những tài khoản cần xác minh 2 bước bằng mã. Khóa này sẽ liên tục tạo ra các mã sáu chữ số để bạn dùng khi đăng nhập. + 3 TRONG 3 Bạn phải thêm địa chỉ web để sử dụng tính năng tự động điền khi truy cập tài khoản này. - TLS Chung - Tạo mật khẩu một lần chạm - Đăng nhập bằng mật khẩu một lần chạm - Tìm hiểu lần đăng nhập mới - Chúng tôi sẽ hướng dẫn bạn các tính năng chính để thêm thông tin đăng nhập mới. - Khám phá trình tạo mật khẩu + TLS hai chiều + Tạo mã khóa bằng một lần chạm + Đăng nhập bằng mã khóa chỉ với một lần chạm + Tìm hiểu về cách đăng nhập mới + Chúng tôi sẽ hướng dẫn bạn các tính năng chính để thêm một thông tin đăng nhập mới. + Khám phá trình tạo Tìm hiểu thêm về cách tạo thông tin đăng nhập an toàn thông qua hướng dẫn. Nhập chứng chỉ máy khách - Nhập mật khẩu chứng chỉ máy khách và bí danh mong muốn cho chứng chỉ này. - Bí danh + Nhập mật khẩu chứng chỉ máy khách và tên gọi mong muốn cho chứng chỉ này. + Tên gọi "Sử dụng trình tạo để tạo mật khẩu, cụm mật khẩu và tên người dùng an toàn. " Cụm mật khẩu là mật khẩu mạnh, thường dễ nhớ và dễ nhập hơn mật khẩu ngẫu nhiên. Chúng hữu ích khi đăng nhập vào các tài khoản không có tính năng Tự động điền, như dịch vụ phát trực tuyến trên TV của bạn. - Tên người dùng độc nhất sẽ tăng thêm một lớp bảo mật và có thể giúp ngăn chặn tin tặc tìm thấy tài khoản của bạn. + Tên người dùng duy nhất giúp tăng cường bảo mật và có thể ngăn chặn tin tặc tìm ra tài khoản của bạn. 1 TRONG 6 2 TRONG 6 3 TRONG 6 4 TRONG 6 5 TRONG 6 6 TRONG 6 - Sử dụng các tùy chọn này để điều chỉnh mật khẩu theo yêu cầu của tài khoản. - "Sau khi lưu mật khẩu mới vào Bitwarden, đừng quên cập nhật mật khẩu trên trang web tài khoản của bạn. " + Sử dụng các tùy chọn này để điều chỉnh mật khẩu của bạn sao cho phù hợp với yêu cầu của trang web. + "Sau khi lưu mật khẩu mới của bạn vào Bitwarden, đừng quên cập nhật nó trên trang web tài khoản của bạn. " Xác minh danh tính của bạn Lỗi khi tải chứng chỉ - Bí danh chứng chỉ + Tên gọi chứng chỉ Nhập chứng chỉ Chọn chứng chỉ hệ thống Đã cài đặt chứng chỉ @@ -896,44 +896,44 @@ Bạn có muốn chuyển sang tài khoản này không? Không hỗ trợ loại chứng chỉ này Sai mật khẩu chứng chỉ Chuỗi chứng chỉ vô hiệu lực - Sử dụng chứng chỉ hệ thống kém an toàn hơn so với lưu trữ chứng chỉ bằng Bitwarden. Tiếp tục sẽ hiển thị danh sách các chứng chỉ hệ thống khả dụng nếu đã cài đặt một chứng chỉ. + Sử dụng chứng chỉ hệ thống không an toàn bằng việc lưu trữ chứng chỉ trong Bitwarden. Tiếp tục sẽ hiển thị danh sách các chứng chỉ hệ thống có sẵn nếu đã có chứng chỉ được cài đặt. Liên kết - Hoạt động mã khóa không thành công vì URL máy chủ không có trong yêu cầu. - Hoạt động mã khóa không thành công vì chữ ký ứng dụng không hợp lệ. + Vận hành mã khóa không thành công vì URL máy chủ không có trong yêu cầu. + Vận hành mã khóa không thành công vì chữ ký ứng dụng không hợp lệ. Đăng ký mã khóa không thành công do lỗi nội bộ. - Hoạt động mã khóa không thành công vì không xác định được bên tin cậy. - Hoạt động mã khóa không thành công vì mục đã chọn không tồn tại. - Hoạt động mã khóa không thành công vì người dùng bị khóa. - Hoạt động mã khóa không thành công vì xác minh người dùng đã bị hủy. - Hoạt động mã khóa không thành công vì yêu cầu không hợp lệ. - Hoạt động mã khóa không thành công vì vượt quá số lần xác minh người dùng. - Hoạt động mã khóa không thành công vì không có mục nào được chọn. - Hoạt động mã khóa không thành công vì yêu cầu không hỗ trợ. + Vận hành mã khóa không thành công vì không xác định được bên tin cậy. + Vận hành mã khóa không thành công vì mục đã chọn không tồn tại. + Vận hành mã khóa không thành công vì người dùng bị khóa. + Vận hành mã khóa không thành công vì xác minh người dùng đã bị hủy. + Vận hành mã khóa không thành công vì yêu cầu không hợp lệ. + Vận hành mã khóa không thành công vì vượt quá số lần xác minh người dùng. + Vận hành mã khóa không thành công vì không có mục nào được chọn. + Vận hành mã khóa không thành công vì yêu cầu không được hỗ trợ. URL máy chủ tự lưu trữ - Use Brave autofill integration - Dùng tích hợp điền tự động Chrome - Dùng tích hợp điền tự động Chrome (Thử nghiệm) - Improves login filling for supported websites on selected browsers. Once enabled, you’ll be directed to browser settings to enable third-party autofill. + Tích hợp với tính năng tự động điền của Brave + Tích hợp với tính năng tự động điền của Chrome + Tích hợp với tính năng tự động điền của Chrome (Thử nghiệm) + Cải thiện tính năng tự động điền thông tin đăng nhập cho các trang web được hỗ trợ trên trình duyệt đã chọn. Sau khi kích hoạt, bạn sẽ được chuyển đến cài đặt trình duyệt để bật tính năng tự động điền của bên thứ ba. Xem thêm Chưa phân loại Thu gọn Thêm trường %s... Chia sẻ chi tiết lỗi - Bộ lưu chuyến bay - Trợ giúp bộ lưu chuyến bay + Bản ghi nhật ký + Trợ giúp bản ghi nhật ký Xem nhật ký đã lưu - Bật bộ lưu chuyến bay + Bật bản ghi nhật ký Nhật ký đã lưu - Chưa có nhật ký - Gặp vấn đề? - Bật ghi nhật ký tạm thời để thu thập và kiểm tra nhật ký cục bộ. Khi được bật, trạng thái ứng dụng và cuộc gọi mạng có thể được ghi lại—không bao giờ là thông tin kho lưu trữ nhạy cảm. - Để bắt đầu, hãy đặt thời lượng ghi nhật ký. Ghi nhật ký -sẽ tự động tắt sau khoảng thời gian này, cho bạn thời gian để ghi lại hoạt động trong khi tái tạo -bất kỳ sự cố nào. - Nhật ký sẽ tự động bị xóa sau 30 ngày. Bitwarden chỉ có thể truy cập dữ liệu nhật ký của bạn khi bạn chia sẻ nó. + Chưa ghi nhật ký nào + Bạn đang gặp vấn đề? + Bật tính năng ghi nhật ký tạm thời để thu thập và kiểm tra nhật cục bộ. Khi tính năng này được bật, trạng thái ứng dụng và các yêu cầu mạng có thể được ghi lại—không bao giờ gồm thông tin nhạy cảm trong kho lưu trữ. + Để bắt đầu, hãy thiết lập thời gian ghi nhật ký. Ghi nhật ký +sẽ tự động tắt sau khoảng thời gian này, cho phép bạn ghi lại hoạt động trong quá trình tái hiện +các vấn đề. + Nhật ký sẽ được tự động xóa sau 30 ngày. Bitwarden chỉ có thể truy cập dữ liệu nhật ký của bạn khi bạn chia sẻ nó. Để biết chi tiết về những gì được và không được ghi lại, hãy truy cập\nTrung tâm hỗ trợ Bitwarden. - Thời lượng ghi + Thời gian ghi nhật ký 1 giờ 8 giờ 24 giờ @@ -942,53 +942,53 @@ bất kỳ sự cố nào. Chia sẻ tất cả Không thể chia sẻ Vui lòng thử lại hoặc chọn một nhật ký khác. - File nhật ký bạn chia sẻ đã bị di chuyển. + Tệp nhật ký mà bạn đang cố gắng chia sẻ đã bị xóa. Xóa nhật ký - Bạn muốn xoá nhật ký này? - Xóa nhật ký - Bạn muốn xoá tất cả nhật ký? - Xác nhận tên miền kết nối khóa - Tên miền kết nối khóa: + Bạn thực sự muốn xóa nhật ký này không? + Xóa các nhật ký + Bạn thực sự muốn xóa tất cả các bản ghi đã ghi lại? + Xác nhận tên miền Key Connector + Tên miền Key Connector: Tổ chức: - Mật khẩu chính không còn cần thiết đối với các thành viên của tổ chức. Vui lòng xác nhận tên miền bên dưới với quản trị viên tổ chức của bạn. - Vui lòng xác nhận tên miền bên dưới với quản trị viên tổ chức của bạn.\n\nTên miền kết nối khóa:\n%1$s - Bộ lưu chuyến bay - Bộ lưu chuyến bay sẽ kích hoạt cho tới %1$s vào %2$s. Đến Cài đặt để hủy kích hoạt ngay. - Chuyển đến Cài đặt + Mật khẩu chính không còn được yêu cầu đối với các thành viên của tổ chức sau đây. Vui lòng xác nhận tên miền bên dưới với quản trị viên của tổ chức. + Vui lòng xác nhận tên miền bên dưới với quản trị viên tổ chức của bạn.\n\nTên miền kết Key Connector:\n%1$s + Bản ghi nhật ký bật + Bản ghi nhật ký sẽ kích hoạt cho tới %1$s vào %2$s. Đến Cài đặt để hủy kích hoạt ngay. + Đi đến cài đặt Đã xóa tất cả nhật ký Đã xóa nhật ký Cài đặt ứng dụng - Thay thế chứng chỉ tồn tại? - Một chứng chỉ tên \"%s\" đã tồn tại. Bạn có muốn thay thế?\nViệc thay thế chứng chỉ có thể ảnh hưởng đến kết nối của bạn với bất kỳ môi trường nào hiện đang sử dụng chứng chỉ đó. + Thay thế chứng chỉ đã tồn tại? + Một chứng chỉ có tên gọi \"%s\" đã tồn tại. Bạn có muốn thay thế nó không?\nViệc thay thế chứng chỉ có thể ảnh hưởng đến kết nối của bạn với các môi trường hiện đang sử dụng nó. Thay thế chứng chỉ Không thể đọc chứng chỉ. - Không thể xóa tài khoản + Không thể xóa tài khoản của bạn Không thể thực hiện hành động này vì tài khoản của bạn thuộc sở hữu của một tổ chức. Liên hệ với quản trị viên tổ chức của bạn để biết thêm thông tin chi tiết. Tài khoản này sẽ sớm bị xóa. Đăng nhập %1$s để tiếp tục sử dụng Bitwarden. - Xem tập tin Gửi - Xem văn bản Gửi - Xóa Gửi - Thiếu Gửi, đồng bộ lại kho của bạn + Xem tệp Send + Xem văn bản Send + Xóa Send + Thiếu Send, đồng bộ lại kho của bạn Màu động Dựa theo hình nền của bạn - Màu động sử dụng màu hệ thống và có thể khó nhìn. - Passkey operation failed because browser (%1$s) is not recognized. Select \"Trust\" to add %1$s to the list of locally trusted applications. - Passkey operation failed because the browser is not trusted. - Trust - These are applications or browsers that Bitwarden does not trust by default, but you trust to perform passkey operations. - These are applications not included in the Google Play Store, but Bitwarden trusts to perform passkey operations after community members use and report them as safe. - These are applications Google considers safe and are available in Google\'s Play Store. - Trusted by You - Trusted by the Community - Trusted by Google - To protect users from phishing attempts, by default, Bitwarden only completes passkey operations through applications or web browsers trusted by Google or the Bitwarden community. - About privileged applications - Learn more about privileged apps - Privileged apps - Unrecognized browser - Learn more about using passkeys with Bitwarden. - All trusted apps - Are you sure you want to stop trusting %s? - Installed apps - Delete %s + Màu sắc động sử dụng các màu hệ thống và có thể khó nhìn. + Vận hành mã khóa thất bại vì trình duyệt (%1$s) không được nhận diện. Chọn \"Tin tưởng\" để thêm %1$s vào danh sách các ứng dụng được tin cậy cục bộ. + Vận hành mã khóa thất bại vì trình duyệt không được tin tưởng. + Tin tưởng + Đây là các ứng dụng hoặc trình duyệt mà Bitwarden không tin cậy theo mặc định, nhưng bạn tin tưởng để thực hiện các thao tác liên quan đến mã khóa. + Đây là các ứng dụng không có trong Google Play Store, nhưng Bitwarden tin tưởng có thể thực hiện các thao tác liên quan tới mã khóa sau khi các thành viên cộng đồng đã sử dụng và báo cáo rằng chúng an toàn. + Đây là các ứng dụng mà Google đánh giá là an toàn và có sẵn trên Cửa hàng Google Play. + Được bạn tin tưởng + Được cộng đồng tin tưởng + Được tin tưởng bởi Google + Để bảo vệ người dùng khỏi các cuộc tấn công lừa đảo (phishing), theo mặc định, Bitwarden chỉ thực hiện các thao tác liên quan đến mã khóa (passkey) thông qua các ứng dụng hoặc trình duyệt web được Google hoặc cộng đồng Bitwarden tin tưởng. + Về các ứng dụng có đặc quyền + Tìm hiểu thêm về các ứng dụng có đặc quyền + Ứng dụng có đặc quyền + Trình duyệt không được nhận diện + Tìm hiểu thêm về cách sử dụng mã khóa với Bitwarden. + Tất cả các ứng dụng đáng tin cậy + Bạn có chắc chắn muốn ngừng tin tưởng %s không? + Ứng dụng đã cài đặt + Xóa %s From 37af6a1773e28dacaa11cdcf17785fe1015e4e22 Mon Sep 17 00:00:00 2001 From: aj-rosado <109146700+aj-rosado@users.noreply.github.com> Date: Fri, 11 Jul 2025 15:03:48 +0100 Subject: [PATCH 5/6] [PM-23710] Fixed logic to getServerConfig and added new test on Authenticator (#5518) --- .../repository/ServerConfigRepositoryImpl.kt | 10 ++++---- .../repository/ServerConfigRepositoryTest.kt | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/data/src/main/kotlin/com/bitwarden/data/repository/ServerConfigRepositoryImpl.kt b/data/src/main/kotlin/com/bitwarden/data/repository/ServerConfigRepositoryImpl.kt index 20e0b689a0..535134c314 100644 --- a/data/src/main/kotlin/com/bitwarden/data/repository/ServerConfigRepositoryImpl.kt +++ b/data/src/main/kotlin/com/bitwarden/data/repository/ServerConfigRepositoryImpl.kt @@ -35,11 +35,11 @@ internal class ServerConfigRepositoryImpl( override suspend fun getServerConfig(forceRefresh: Boolean): ServerConfig? { val localConfig = configDiskSource.serverConfig val needsRefresh = localConfig == null || - Instant - .ofEpochMilli(localConfig.lastSync) - .isAfter( - clock.instant().plusSeconds(MINIMUM_CONFIG_SYNC_INTERVAL_SEC), - ) + clock.instant().isAfter( + Instant + .ofEpochMilli(localConfig.lastSync) + .plusSeconds(MINIMUM_CONFIG_SYNC_INTERVAL_SEC), + ) if (needsRefresh || forceRefresh) { configService diff --git a/data/src/test/kotlin/com/bitwarden/data/repository/ServerConfigRepositoryTest.kt b/data/src/test/kotlin/com/bitwarden/data/repository/ServerConfigRepositoryTest.kt index 8fb6e6306f..8b5252741e 100644 --- a/data/src/test/kotlin/com/bitwarden/data/repository/ServerConfigRepositoryTest.kt +++ b/data/src/test/kotlin/com/bitwarden/data/repository/ServerConfigRepositoryTest.kt @@ -119,6 +119,30 @@ class ServerConfigRepositoryTest { assertEquals(fakeConfigDiskSource.serverConfig, awaitItem()) } } + + @Suppress("MaxLineLength") + @Test + fun `serverConfigStateFlow should fetch new server configurations when minimum config sync interval is reached `() = + runTest { + + val testConfig = SERVER_CONFIG.copy( + lastSync = fixedClock.instant().minusSeconds(60 * 60 + 1).toEpochMilli(), + serverData = CONFIG_RESPONSE_JSON.copy( + version = "old version!!", + ), + ) + fakeConfigDiskSource.serverConfig = testConfig + + coEvery { + configService.getConfig() + } returns CONFIG_RESPONSE_JSON.asSuccess() + + repository.getServerConfig(forceRefresh = false) + + repository.serverConfigStateFlow.test { + assertNotEquals(testConfig, awaitItem()) + } + } } private val SERVER_CONFIG = ServerConfig( From 929233081c4cbbebd58200be41ebf6a80c81f2b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Gon=C3=A7alves?= Date: Mon, 14 Jul 2025 15:34:26 +0100 Subject: [PATCH 6/6] [PM- 22735] Unsafe deserialization parcel data intent (#5419) Co-authored-by: David Perez --- .../x8bit/bitwarden/AccessibilityActivity.kt | 12 ++++ .../x8bit/bitwarden/AuthCallbackActivity.kt | 11 +++ .../bitwarden/AutofillTotpCopyActivity.kt | 12 ++++ .../com/x8bit/bitwarden/MainActivity.kt | 14 +++- .../auth/util/PasswordlessRequestDataUtils.kt | 2 +- .../data/autofill/util/AutofillIntentUtils.kt | 2 +- .../bitwarden/authenticator/MainActivity.kt | 24 +++---- .../data/platform/util/IntentExtensions.kt | 19 ------ .../platform/util/IntentExtensionsTest.kt | 64 ----------------- .../ui}/platform/util/IntentExtensions.kt | 21 +++++- .../ui/platform/util/IntentExtensionsTest.kt | 68 +++++++++++++++++++ 11 files changed, 147 insertions(+), 102 deletions(-) delete mode 100644 authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/util/IntentExtensions.kt delete mode 100644 authenticator/src/test/kotlin/com/bitwarden/authenticator/data/platform/util/IntentExtensionsTest.kt rename {app/src/main/kotlin/com/x8bit/bitwarden/data => ui/src/main/kotlin/com/bitwarden/ui}/platform/util/IntentExtensions.kt (50%) create mode 100644 ui/src/test/kotlin/com/bitwarden/ui/platform/util/IntentExtensionsTest.kt diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/AccessibilityActivity.kt b/app/src/main/kotlin/com/x8bit/bitwarden/AccessibilityActivity.kt index d4a8ec79f2..c0dc427beb 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/AccessibilityActivity.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/AccessibilityActivity.kt @@ -1,8 +1,11 @@ package com.x8bit.bitwarden +import android.app.ComponentCaller +import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.bitwarden.annotation.OmitFromCoverage +import com.bitwarden.ui.platform.util.validate /** * An activity to be launched and then immediately closed so that the OS Shade can be collapsed @@ -11,7 +14,16 @@ import com.bitwarden.annotation.OmitFromCoverage @OmitFromCoverage class AccessibilityActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { + intent = intent.validate() super.onCreate(savedInstanceState) finish() } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent.validate()) + } + + override fun onNewIntent(intent: Intent, caller: ComponentCaller) { + super.onNewIntent(intent.validate(), caller) + } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/AuthCallbackActivity.kt b/app/src/main/kotlin/com/x8bit/bitwarden/AuthCallbackActivity.kt index 330ff15737..e86fd51d65 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/AuthCallbackActivity.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/AuthCallbackActivity.kt @@ -1,10 +1,12 @@ package com.x8bit.bitwarden +import android.app.ComponentCaller import android.content.Intent import android.os.Bundle import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import com.bitwarden.annotation.OmitFromCoverage +import com.bitwarden.ui.platform.util.validate import dagger.hilt.android.AndroidEntryPoint /** @@ -21,6 +23,7 @@ class AuthCallbackActivity : AppCompatActivity() { private val viewModel: AuthCallbackViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { + intent = intent.validate() super.onCreate(savedInstanceState) viewModel.trySendAction(AuthCallbackAction.IntentReceive(intent = intent)) @@ -35,4 +38,12 @@ class AuthCallbackActivity : AppCompatActivity() { startActivity(intent) finish() } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent.validate()) + } + + override fun onNewIntent(intent: Intent, caller: ComponentCaller) { + super.onNewIntent(intent.validate(), caller) + } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/AutofillTotpCopyActivity.kt b/app/src/main/kotlin/com/x8bit/bitwarden/AutofillTotpCopyActivity.kt index e1693a5aff..299bb911fd 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/AutofillTotpCopyActivity.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/AutofillTotpCopyActivity.kt @@ -1,10 +1,13 @@ package com.x8bit.bitwarden +import android.app.ComponentCaller +import android.content.Intent import android.os.Bundle import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import com.bitwarden.annotation.OmitFromCoverage +import com.bitwarden.ui.platform.util.validate import com.x8bit.bitwarden.data.autofill.manager.AutofillCompletionManager import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.launchIn @@ -26,6 +29,7 @@ class AutofillTotpCopyActivity : AppCompatActivity() { private val autofillTotpCopyViewModel: AutofillTotpCopyViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { + intent = intent.validate() super.onCreate(savedInstanceState) observeViewModelEvents() @@ -37,6 +41,14 @@ class AutofillTotpCopyActivity : AppCompatActivity() { ) } + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent.validate()) + } + + override fun onNewIntent(intent: Intent, caller: ComponentCaller) { + super.onNewIntent(intent.validate(), caller) + } + private fun observeViewModelEvents() { autofillTotpCopyViewModel .eventFlow diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/MainActivity.kt b/app/src/main/kotlin/com/x8bit/bitwarden/MainActivity.kt index a616cbaa7c..a804e5750e 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/MainActivity.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/MainActivity.kt @@ -1,5 +1,6 @@ package com.x8bit.bitwarden +import android.app.ComponentCaller import android.content.Intent import android.os.Build import android.os.Bundle @@ -23,6 +24,7 @@ import com.bitwarden.annotation.OmitFromCoverage import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.theme.BitwardenTheme import com.bitwarden.ui.platform.util.setupEdgeToEdge +import com.bitwarden.ui.platform.util.validate import com.x8bit.bitwarden.data.autofill.accessibility.manager.AccessibilityCompletionManager import com.x8bit.bitwarden.data.autofill.manager.AutofillActivityManager import com.x8bit.bitwarden.data.autofill.manager.AutofillCompletionManager @@ -67,6 +69,7 @@ class MainActivity : AppCompatActivity() { lateinit var debugLaunchManager: DebugMenuLaunchManager override fun onCreate(savedInstanceState: Bundle?) { + intent = intent.validate() var shouldShowSplashScreen = true installSplashScreen().setKeepOnScreenCondition { shouldShowSplashScreen } super.onCreate(savedInstanceState) @@ -114,8 +117,15 @@ class MainActivity : AppCompatActivity() { } override fun onNewIntent(intent: Intent) { - super.onNewIntent(intent) - mainViewModel.trySendAction(action = MainAction.ReceiveNewIntent(intent = intent)) + val newIntent = intent.validate() + super.onNewIntent(newIntent) + mainViewModel.trySendAction(action = MainAction.ReceiveNewIntent(intent = newIntent)) + } + + override fun onNewIntent(intent: Intent, caller: ComponentCaller) { + val newIntent = intent.validate() + super.onNewIntent(newIntent, caller) + mainViewModel.trySendAction(action = MainAction.ReceiveNewIntent(intent = newIntent)) } override fun onResume() { diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/util/PasswordlessRequestDataUtils.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/util/PasswordlessRequestDataUtils.kt index 3b8b4957ea..6ca544b39f 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/util/PasswordlessRequestDataUtils.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/util/PasswordlessRequestDataUtils.kt @@ -4,7 +4,7 @@ import android.content.Context import android.content.Intent import com.x8bit.bitwarden.MainActivity import com.x8bit.bitwarden.data.platform.manager.model.PasswordlessRequestData -import com.x8bit.bitwarden.data.platform.util.getSafeParcelableExtra +import com.bitwarden.ui.platform.util.getSafeParcelableExtra private const val NOTIFICATION_DATA: String = "notificationData" diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/util/AutofillIntentUtils.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/util/AutofillIntentUtils.kt index 898c7fd668..b587e440e2 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/util/AutofillIntentUtils.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/util/AutofillIntentUtils.kt @@ -18,7 +18,7 @@ import com.x8bit.bitwarden.data.autofill.model.AutofillAppInfo import com.x8bit.bitwarden.data.autofill.model.AutofillSaveItem import com.x8bit.bitwarden.data.autofill.model.AutofillSelectionData import com.x8bit.bitwarden.data.autofill.model.AutofillTotpCopyData -import com.x8bit.bitwarden.data.platform.util.getSafeParcelableExtra +import com.bitwarden.ui.platform.util.getSafeParcelableExtra import kotlin.random.Random private const val AUTOFILL_SAVE_ITEM_DATA_KEY = "autofill-save-item-data" diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/MainActivity.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/MainActivity.kt index 0613802fec..47a14e13d1 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/MainActivity.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/MainActivity.kt @@ -1,5 +1,6 @@ package com.bitwarden.authenticator +import android.app.ComponentCaller import android.content.Intent import android.os.Bundle import android.view.KeyEvent @@ -14,13 +15,13 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.lifecycleScope import androidx.navigation.NavHostController import androidx.navigation.compose.rememberNavController -import com.bitwarden.authenticator.data.platform.util.isSuspicious import com.bitwarden.authenticator.ui.platform.composition.LocalManagerProvider import com.bitwarden.authenticator.ui.platform.feature.debugmenu.manager.DebugMenuLaunchManager import com.bitwarden.authenticator.ui.platform.feature.debugmenu.navigateToDebugMenuScreen import com.bitwarden.authenticator.ui.platform.feature.rootnav.RootNavScreen import com.bitwarden.authenticator.ui.platform.theme.AuthenticatorTheme import com.bitwarden.ui.platform.util.setupEdgeToEdge +import com.bitwarden.ui.platform.util.validate import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map @@ -39,7 +40,7 @@ class MainActivity : AppCompatActivity() { lateinit var debugLaunchManager: DebugMenuLaunchManager override fun onCreate(savedInstanceState: Bundle?) { - sanitizeIntent() + intent = intent.validate() var shouldShowSplashScreen = true installSplashScreen().setKeepOnScreenCondition { shouldShowSplashScreen } super.onCreate(savedInstanceState) @@ -72,20 +73,15 @@ class MainActivity : AppCompatActivity() { } override fun onNewIntent(intent: Intent) { - super.onNewIntent(intent) - sanitizeIntent() - mainViewModel.trySendAction( - MainAction.ReceiveNewIntent(intent = intent), - ) + val newIntent = intent.validate() + super.onNewIntent(newIntent) + mainViewModel.trySendAction(MainAction.ReceiveNewIntent(intent = newIntent)) } - private fun sanitizeIntent() { - if (intent.isSuspicious) { - intent = Intent( - /* packageContext = */ this, - /* cls = */ MainActivity::class.java, - ) - } + override fun onNewIntent(intent: Intent, caller: ComponentCaller) { + val newIntent = intent.validate() + super.onNewIntent(newIntent, caller) + mainViewModel.trySendAction(MainAction.ReceiveNewIntent(intent = newIntent)) } private fun observeViewModelEvents(navController: NavHostController) { diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/util/IntentExtensions.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/util/IntentExtensions.kt deleted file mode 100644 index 5a8ac5ae8a..0000000000 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/util/IntentExtensions.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.bitwarden.authenticator.data.platform.util - -import android.content.Intent - -/** - * Returns true if this intent contains unexpected or suspicious data. - */ -val Intent.isSuspicious: Boolean - get() { - return try { - val containsSuspiciousExtras = extras?.isEmpty() == false - val containsSuspiciousData = data != null - containsSuspiciousData || containsSuspiciousExtras - } catch (_: Exception) { - // `unparcel()` throws an exception on Android 12 and below if the bundle contains - // suspicious data, so we catch the exception and return true. - true - } - } diff --git a/authenticator/src/test/kotlin/com/bitwarden/authenticator/data/platform/util/IntentExtensionsTest.kt b/authenticator/src/test/kotlin/com/bitwarden/authenticator/data/platform/util/IntentExtensionsTest.kt deleted file mode 100644 index a158eb8ff8..0000000000 --- a/authenticator/src/test/kotlin/com/bitwarden/authenticator/data/platform/util/IntentExtensionsTest.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.bitwarden.authenticator.data.platform.util - -import android.content.Intent -import io.mockk.every -import io.mockk.mockk -import org.junit.jupiter.api.Assertions.assertFalse -import org.junit.jupiter.api.Assertions.assertTrue -import org.junit.jupiter.api.Test - -class IntentExtensionsTest { - @Test - fun `isSuspicious should return true when extras are not empty`() { - val intent = mockk { - every { data } returns mockk() - every { extras } returns mockk { - every { isEmpty } returns false - } - } - - assertTrue(intent.isSuspicious) - } - - @Test - fun `isSuspicious should return true when extras are null`() { - val intent = mockk { - every { data } returns mockk() - every { extras } returns null - } - - assertTrue(intent.isSuspicious) - } - - @Test - fun `isSuspicious should return true when data is not null`() { - val intent = mockk { - every { data } returns mockk() - every { extras } returns null - } - - assertTrue(intent.isSuspicious) - } - - @Test - fun `isSuspicious should return false when data and extras are null`() { - val intent = mockk { - every { data } returns null - every { extras } returns null - } - - assertFalse(intent.isSuspicious) - } - - @Test - fun `isSuspicious should return false when data is null and extras are empty`() { - val intent = mockk { - every { data } returns null - every { extras } returns mockk { - every { isEmpty } returns true - } - } - - assertFalse(intent.isSuspicious) - } -} diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/util/IntentExtensions.kt b/ui/src/main/kotlin/com/bitwarden/ui/platform/util/IntentExtensions.kt similarity index 50% rename from app/src/main/kotlin/com/x8bit/bitwarden/data/platform/util/IntentExtensions.kt rename to ui/src/main/kotlin/com/bitwarden/ui/platform/util/IntentExtensions.kt index 8f20b46f94..bec1c9dc4f 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/util/IntentExtensions.kt +++ b/ui/src/main/kotlin/com/bitwarden/ui/platform/util/IntentExtensions.kt @@ -1,8 +1,9 @@ @file:OmitFromCoverage -package com.x8bit.bitwarden.data.platform.util +package com.bitwarden.ui.platform.util import android.content.Intent +import android.os.BadParcelableException import android.os.Bundle import android.os.Parcelable import androidx.core.content.IntentCompat @@ -24,3 +25,21 @@ inline fun Intent.getSafeParcelableExtra( inline fun Bundle.getSafeParcelableExtra( name: String, ): T? = BundleCompat.getParcelable(this, name, T::class.java) + +/** + * Validate if there's anything suspicious with the intent received and returns a new valid intent. + */ +fun Intent.validate(): Intent = + try { + // This will force Android to attempt to fetch each item and verify it is valid + this.extras?.let { bundle -> + bundle.keySet().forEach { @Suppress("DEPRECATION") bundle.get(it) } + } + this + } catch (_: BadParcelableException) { + this.replaceExtras(null as Bundle?) + } catch (_: ClassNotFoundException) { + this.replaceExtras(null as Bundle?) + } catch (@Suppress("TooGenericExceptionCaught") _: RuntimeException) { + this.replaceExtras(null as Bundle?) + } diff --git a/ui/src/test/kotlin/com/bitwarden/ui/platform/util/IntentExtensionsTest.kt b/ui/src/test/kotlin/com/bitwarden/ui/platform/util/IntentExtensionsTest.kt new file mode 100644 index 0000000000..761de65c00 --- /dev/null +++ b/ui/src/test/kotlin/com/bitwarden/ui/platform/util/IntentExtensionsTest.kt @@ -0,0 +1,68 @@ +package com.bitwarden.ui.platform.util + +import android.content.Intent +import android.os.BadParcelableException +import android.os.Bundle +import io.mockk.every +import io.mockk.mockk +import io.mockk.mockkStatic +import io.mockk.unmockkStatic +import io.mockk.verify +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test + +class IntentExtensionsTest { + + @BeforeEach + fun setUp() { + mockkStatic(Intent::class) + } + + @AfterEach + fun tearDown() { + unmockkStatic(Intent::class) + } + + @Test + fun `validate should not modify the current intent`() { + val intent = mockk(relaxed = true) { + every { getStringExtra("token") } returns "myToken" + } + + intent.validate() + + assertEquals("myToken", intent.getStringExtra("token")) + } + + @Test + fun `validate should remove extras if BadParcelableException is thrown`() { + val mockIntent = mockk(relaxed = true) + + every { mockIntent.extras } throws BadParcelableException("Bad parcel") + + mockIntent.validate() + verify { mockIntent.replaceExtras(null as Bundle?) } + } + + @Test + fun `validate should remove extras if ClassNotFoundException is thrown`() { + val mockIntent = mockk(relaxed = true) + + every { mockIntent.extras } throws ClassNotFoundException("Bad parcel") + + mockIntent.validate() + verify { mockIntent.replaceExtras(null as Bundle?) } + } + + @Test + fun `validate should remove extras if RuntimeException is thrown`() { + val mockIntent = mockk(relaxed = true) + + every { mockIntent.extras } throws RuntimeException("Bad parcel") + + mockIntent.validate() + verify { mockIntent.replaceExtras(null as Bundle?) } + } +}