From f26d54a2e2f656a8b31ecc70f243603819565b94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Bispo?= Date: Tue, 15 Jul 2025 16:21:39 +0100 Subject: [PATCH 01/12] [PM-23696] Hide cards from export when policy is enabled. (#5520) --- .../data/vault/repository/VaultRepository.kt | 9 +- .../vault/repository/VaultRepositoryImpl.kt | 11 ++- .../exportvault/ExportVaultViewModel.kt | 25 +++++- .../vault/repository/VaultRepositoryTest.kt | 65 +++++++++++++- .../exportvault/ExportVaultViewModelTest.kt | 88 ++++++++++++++++++- 5 files changed, 187 insertions(+), 11 deletions(-) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepository.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepository.kt index 26a5157e55..77afe195cc 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepository.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepository.kt @@ -9,6 +9,7 @@ import com.bitwarden.sdk.Fido2CredentialStore import com.bitwarden.send.SendType import com.bitwarden.send.SendView import com.bitwarden.vault.CipherListView +import com.bitwarden.vault.CipherType import com.bitwarden.vault.CipherView import com.bitwarden.vault.CollectionView import com.bitwarden.vault.FolderView @@ -262,6 +263,12 @@ interface VaultRepository : CipherManager, VaultLockManager { /** * Attempt to get the user's vault data for export. + * + * @param format The export format to use. + * @param restrictedTypes A list of restricted types to export. */ - suspend fun exportVaultDataToString(format: ExportFormat): ExportVaultDataResult + suspend fun exportVaultDataToString( + format: ExportFormat, + restrictedTypes: List, + ): ExportVaultDataResult } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt index ffcd8dd2de..3e5bd673ac 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt @@ -931,7 +931,10 @@ class VaultRepositoryImpl( } } - override suspend fun exportVaultDataToString(format: ExportFormat): ExportVaultDataResult { + override suspend fun exportVaultDataToString( + format: ExportFormat, + restrictedTypes: List, + ): ExportVaultDataResult { val userId = activeUserId ?: return ExportVaultDataResult.Error(error = NoActiveUserException()) val folders = vaultDiskSource @@ -945,7 +948,11 @@ class VaultRepositoryImpl( .firstOrNull() .orEmpty() .map { it.toEncryptedSdkCipher() } - .filter { it.collectionIds.isEmpty() && it.deletedDate == null } + .filter { + it.collectionIds.isEmpty() && + it.deletedDate == null && + !restrictedTypes.contains(it.type) + } return vaultSdkSource .exportVaultDataToString( diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModel.kt index 3420d5fc26..b5c192eedc 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModel.kt @@ -9,6 +9,7 @@ import com.bitwarden.network.model.PolicyTypeJson import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText +import com.bitwarden.vault.CipherType import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.sdk.model.PasswordStrength import com.x8bit.bitwarden.data.auth.repository.AuthRepository @@ -16,7 +17,9 @@ import com.x8bit.bitwarden.data.auth.repository.model.PasswordStrengthResult import com.x8bit.bitwarden.data.auth.repository.model.RequestOtpResult import com.x8bit.bitwarden.data.auth.repository.model.ValidatePasswordResult import com.x8bit.bitwarden.data.auth.repository.model.VerifyOtpResult +import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager import com.x8bit.bitwarden.data.platform.manager.PolicyManager +import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import com.x8bit.bitwarden.data.vault.manager.FileManager import com.x8bit.bitwarden.data.vault.repository.VaultRepository import com.x8bit.bitwarden.data.vault.repository.model.ExportVaultDataResult @@ -41,15 +44,16 @@ private const val KEY_STATE = "state" /** * Manages application state for the Export Vault screen. */ -@Suppress("TooManyFunctions") +@Suppress("TooManyFunctions", "LongParameterList") @HiltViewModel class ExportVaultViewModel @Inject constructor( private val authRepository: AuthRepository, - policyManager: PolicyManager, + private val policyManager: PolicyManager, savedStateHandle: SavedStateHandle, private val vaultRepository: VaultRepository, private val fileManager: FileManager, private val clock: Clock, + private val featureFlagManager: FeatureFlagManager, ) : BaseViewModel( initialState = savedStateHandle[KEY_STATE] ?: ExportVaultState( @@ -433,6 +437,7 @@ class ExportVaultViewModel @Inject constructor( state.passwordInput }, ), + restrictedTypes = getRestrictedItemTypes(), ) sendAction( @@ -454,6 +459,22 @@ class ExportVaultViewModel @Inject constructor( ) } } + + private fun getRestrictedItemTypes(): List { + val isRemoveCardPolicyFeatureEnabled = + featureFlagManager.getFeatureFlag(FlagKey.RemoveCardPolicy) + if (!isRemoveCardPolicyFeatureEnabled) { + return emptyList() + } + + val hasActiveRestrictItemTypesPolicy = + policyManager.getActivePolicies(type = PolicyTypeJson.RESTRICT_ITEM_TYPES).isNotEmpty() + if (!hasActiveRestrictItemTypesPolicy) { + return emptyList() + } + + return listOf(CipherType.CARD) + } } /** diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt index bf83c055dc..9fafd4a20a 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt @@ -15,6 +15,7 @@ import com.bitwarden.data.datasource.disk.base.FakeDispatcherManager import com.bitwarden.data.manager.DispatcherManager import com.bitwarden.exporters.ExportFormat import com.bitwarden.fido.Fido2CredentialAutofillView +import com.bitwarden.network.model.CipherTypeJson import com.bitwarden.network.model.CreateFileSendResponse import com.bitwarden.network.model.CreateSendJsonResponse import com.bitwarden.network.model.FolderJsonRequest @@ -41,6 +42,7 @@ import com.bitwarden.network.service.SyncService import com.bitwarden.sdk.Fido2CredentialStore import com.bitwarden.send.SendType import com.bitwarden.send.SendView +import com.bitwarden.vault.CipherType import com.bitwarden.vault.CipherView import com.bitwarden.vault.CollectionView import com.bitwarden.vault.Folder @@ -4405,7 +4407,63 @@ class VaultRepositoryTest { } returns "TestResult".asSuccess() val expected = ExportVaultDataResult.Success(vaultData = "TestResult") - val result = vaultRepository.exportVaultDataToString(format = format) + val result = vaultRepository.exportVaultDataToString( + format = format, + restrictedTypes = emptyList(), + ) + + coVerify { + vaultSdkSource.exportVaultDataToString( + userId = userId, + ciphers = listOf(userCipher.toEncryptedSdkCipher()), + folders = listOf(createMockSdkFolder(1)), + format = ExportFormat.Json, + ) + } + + assertEquals( + expected, + result, + ) + } + + @Test + fun `exportVaultDataToString with restrictedTypes should filter out restricted cipher types`() = + runTest { + val format = ExportFormat.Json + fakeAuthDiskSource.userState = MOCK_USER_STATE + val userId = "mockId-1" + + val userCipher = createMockCipher(1).copy( + type = CipherTypeJson.LOGIN, + collectionIds = null, + deletedDate = null, + ) + val userCipherCard = createMockCipher(2).copy( + type = CipherTypeJson.CARD, + collectionIds = null, + deletedDate = null, + ) + val deletedCipher = createMockCipher(2).copy(collectionIds = null) + val orgCipher = createMockCipher(3).copy(deletedDate = null) + + coEvery { + vaultDiskSource.getCiphersFlow(userId) + } returns flowOf(listOf(userCipher, userCipherCard, deletedCipher, orgCipher)) + + coEvery { + vaultDiskSource.getFolders(userId) + } returns flowOf(listOf(createMockFolder(1))) + + coEvery { + vaultSdkSource.exportVaultDataToString(userId, any(), any(), format) + } returns "TestResult".asSuccess() + + val expected = ExportVaultDataResult.Success(vaultData = "TestResult") + val result = vaultRepository.exportVaultDataToString( + format = format, + restrictedTypes = listOf(CipherType.CARD), + ) coVerify { vaultSdkSource.exportVaultDataToString( @@ -4442,7 +4500,10 @@ class VaultRepositoryTest { } returns error.asFailure() val expected = ExportVaultDataResult.Error(error = error) - val result = vaultRepository.exportVaultDataToString(format = format) + val result = vaultRepository.exportVaultDataToString( + format = format, + restrictedTypes = emptyList(), + ) assertEquals( expected, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModelTest.kt index 4511cd36da..4ddb129e24 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModelTest.kt @@ -9,6 +9,7 @@ import com.bitwarden.network.model.PolicyTypeJson import com.bitwarden.network.model.createMockPolicy import com.bitwarden.ui.platform.base.BaseViewModelTest import com.bitwarden.ui.util.asText +import com.bitwarden.vault.CipherType import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.datasource.sdk.model.PasswordStrength @@ -18,8 +19,10 @@ import com.x8bit.bitwarden.data.auth.repository.model.RequestOtpResult import com.x8bit.bitwarden.data.auth.repository.model.UserState import com.x8bit.bitwarden.data.auth.repository.model.ValidatePasswordResult import com.x8bit.bitwarden.data.auth.repository.model.VerifyOtpResult +import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager 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.vault.manager.FileManager import com.x8bit.bitwarden.data.vault.repository.VaultRepository import com.x8bit.bitwarden.data.vault.repository.model.ExportVaultDataResult @@ -49,6 +52,9 @@ class ExportVaultViewModelTest : BaseViewModelTest() { every { getActivePolicies(type = PolicyTypeJson.DISABLE_PERSONAL_VAULT_EXPORT) } returns emptyList() + every { + getActivePolicies(type = PolicyTypeJson.RESTRICT_ITEM_TYPES) + } returns emptyList() } private val clock: Clock = Clock.fixed( @@ -57,10 +63,27 @@ class ExportVaultViewModelTest : BaseViewModelTest() { ) private val vaultRepository: VaultRepository = mockk { - coEvery { exportVaultDataToString(any()) } returns ExportVaultDataResult.Success("data") + coEvery { + exportVaultDataToString( + format = any(), + restrictedTypes = emptyList(), + ) + } returns ExportVaultDataResult.Success("data") + coEvery { + exportVaultDataToString( + format = any(), + restrictedTypes = listOf(CipherType.CARD), + ) + } returns ExportVaultDataResult.Success("data") } private val fileManager: FileManager = mockk() + private val featureFlagManager: FeatureFlagManager = mockk { + every { + getFeatureFlag(FlagKey.RemoveCardPolicy) + } returns false + } + @Test fun `initial state should be correct`() = runTest { every { @@ -106,7 +129,62 @@ class ExportVaultViewModelTest : BaseViewModelTest() { viewModel.trySendAction(ExportVaultAction.ConfirmExportVaultClicked) coVerify { - vaultRepository.exportVaultDataToString(any()) + vaultRepository.exportVaultDataToString(any(), emptyList()) + } + } + + @Suppress("MaxLineLength") + @Test + fun `ConfirmExportVaultClicked correct password should call exportVaultDataToString with restricted item types when policy and feature flags enabled`() { + val password = "password" + coEvery { + authRepository.validatePassword( + password = password, + ) + } returns ValidatePasswordResult.Success(isValid = true) + every { + policyManager.getActivePolicies(type = PolicyTypeJson.RESTRICT_ITEM_TYPES) + } returns listOf(createMockPolicy()) + every { + featureFlagManager.getFeatureFlag(FlagKey.RemoveCardPolicy) + } returns true + + val viewModel = createViewModel() + viewModel.trySendAction(ExportVaultAction.PasswordInputChanged(password)) + + viewModel.trySendAction(ExportVaultAction.ConfirmExportVaultClicked) + + coVerify { + vaultRepository.exportVaultDataToString( + format = any(), + restrictedTypes = listOf(CipherType.CARD), + ) + } + } + + @Suppress("MaxLineLength") + @Test + fun `ConfirmExportVaultClicked correct password should call exportVaultDataToString without restricted item types when policy is disabled and feature flag is enabled`() { + val password = "password" + coEvery { + authRepository.validatePassword( + password = password, + ) + } returns ValidatePasswordResult.Success(isValid = true) + every { + featureFlagManager.getFeatureFlag(FlagKey.RemoveCardPolicy) + } returns true + + val viewModel = createViewModel() + viewModel.trySendAction(ExportVaultAction.PasswordInputChanged(password)) + + viewModel.trySendAction(ExportVaultAction.ConfirmExportVaultClicked) + + coVerify { + vaultRepository.exportVaultDataToString( + format = any(), + restrictedTypes = listOf(), + ) } } @@ -135,7 +213,7 @@ class ExportVaultViewModelTest : BaseViewModelTest() { viewModel.stateFlow.value, ) coVerify { - vaultRepository.exportVaultDataToString(any()) + vaultRepository.exportVaultDataToString(any(), emptyList()) } } @@ -168,7 +246,7 @@ class ExportVaultViewModelTest : BaseViewModelTest() { viewModel.stateFlow.value, ) coVerify(exactly = 0) { - vaultRepository.exportVaultDataToString(any()) + vaultRepository.exportVaultDataToString(any(), emptyList()) } } @@ -214,6 +292,7 @@ class ExportVaultViewModelTest : BaseViewModelTest() { authRepository.validatePassword(password) vaultRepository.exportVaultDataToString( format = ExportFormat.EncryptedJson(filePassword), + restrictedTypes = emptyList(), ) } } @@ -746,6 +825,7 @@ class ExportVaultViewModelTest : BaseViewModelTest() { fileManager = fileManager, vaultRepository = vaultRepository, clock = clock, + featureFlagManager = featureFlagManager, ) } From 39b1409cbd3f98e239c6582ea48e5456c531ff79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Bispo?= Date: Tue, 15 Jul 2025 17:31:37 +0100 Subject: [PATCH 02/12] [PM-22399] Send 2FA email when view appears (#5498) Co-authored-by: Patrick Honkonen <1883101+SaintPatrck@users.noreply.github.com> --- .../twofactorlogin/TwoFactorLoginViewModel.kt | 32 +++++++- .../TwoFactorLoginViewModelTest.kt | 79 +++++++++++++++++++ 2 files changed, 110 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginViewModel.kt index 83f157c018..2a9139ea8b 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginViewModel.kt @@ -122,6 +122,13 @@ class TwoFactorLoginViewModel @Inject constructor( .map { TwoFactorLoginAction.Internal.ReceiveWebAuthResult(webAuthResult = it) } .onEach(::sendAction) .launchIn(viewModelScope) + + viewModelScope.launch { + // If the auth method is email and it is not to verify the device, call resendEmail. + if (state.authMethod == TwoFactorAuthMethod.EMAIL && !state.isNewDeviceVerification) { + sendAction(TwoFactorLoginAction.Internal.SendVerificationCodeEmail) + } + } } override fun handleAction(action: TwoFactorLoginAction) { @@ -159,6 +166,10 @@ class TwoFactorLoginViewModel @Inject constructor( is TwoFactorLoginAction.Internal.ReceiveResendEmailResult -> { handleReceiveResendEmailResult(action) } + + TwoFactorLoginAction.Internal.SendVerificationCodeEmail -> { + handleSendVerificationCodeEmail() + } } } @@ -476,6 +487,20 @@ class TwoFactorLoginViewModel @Inject constructor( * Resend the verification code email. */ private fun handleResendEmailClick() { + sendVerificationCodeEmail(isUserInitiated = true) + } + + /** + * send the verification code email without user interaction. + */ + private fun handleSendVerificationCodeEmail() { + sendVerificationCodeEmail(isUserInitiated = false) + } + + /** + * Send the verification code email. + */ + private fun sendVerificationCodeEmail(isUserInitiated: Boolean) { // Ensure that the user is in fact verifying with email. if (state.authMethod != TwoFactorAuthMethod.EMAIL) { return @@ -500,7 +525,7 @@ class TwoFactorLoginViewModel @Inject constructor( sendAction( TwoFactorLoginAction.Internal.ReceiveResendEmailResult( resendEmailResult = result, - isUserInitiated = true, + isUserInitiated = isUserInitiated, ), ) } @@ -821,5 +846,10 @@ sealed class TwoFactorLoginAction { data class ReceiveWebAuthResult( val webAuthResult: WebAuthResult, ) : Internal() + + /** + * Indicates that the verification code email should be sent. + */ + data object SendVerificationCodeEmail : Internal() } } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginViewModelTest.kt index 36b3490fd4..185a35a7b1 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginViewModelTest.kt @@ -97,6 +97,64 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { } } + @Test + fun `init with email auth method and not new device verification should call resendEmail`() { + val initialState = DEFAULT_STATE.copy( + authMethod = TwoFactorAuthMethod.EMAIL, + isNewDeviceVerification = false, + ) + coEvery { authRepository.resendVerificationCodeEmail() } returns ResendEmailResult.Success + + createViewModel(state = initialState) + + coVerify(exactly = 1) { + authRepository.resendVerificationCodeEmail() + } + } + + @Test + fun `init with email auth method and new device verification should not call resendEmail`() { + val initialState = DEFAULT_STATE.copy( + authMethod = TwoFactorAuthMethod.EMAIL, + isNewDeviceVerification = true, + ) + coEvery { authRepository.resendVerificationCodeEmail() } returns ResendEmailResult.Success + + createViewModel(state = initialState) + + coVerify(exactly = 0) { + authRepository.resendVerificationCodeEmail() + } + } + + @Test + @Suppress("MaxLineLength") + fun `init with non-email auth method and not new device verification should not call resendEmail`() { + val initialState = DEFAULT_STATE.copy( + authMethod = TwoFactorAuthMethod.AUTHENTICATOR_APP, + isNewDeviceVerification = false, + ) + coEvery { authRepository.resendVerificationCodeEmail() } returns ResendEmailResult.Success + + createViewModel(state = initialState) + + coVerify(exactly = 0) { + authRepository.resendVerificationCodeEmail() + } + } + + @Test + @Suppress("MaxLineLength") + fun `init with non-email auth method and new device verification should not call resendEmail`() { + val initialState = DEFAULT_STATE.copy( + authMethod = TwoFactorAuthMethod.AUTHENTICATOR_APP, + isNewDeviceVerification = true, + ) + createViewModel(state = initialState) + + coVerify(exactly = 0) { authRepository.resendVerificationCodeEmail() } + } + @Test fun `yubiKeyResultFlow update should populate the input field and attempt login`() { val initialState = DEFAULT_STATE.copy(authMethod = TwoFactorAuthMethod.YUBI_KEY) @@ -899,6 +957,27 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { ) } + @Test + @Suppress("MaxLineLength") + fun `sendVerificationCodeEmail with isUserInitiated false should not show loading and snackbar on success`() = + runTest { + coEvery { authRepository.resendVerificationCodeEmail() } returns ResendEmailResult.Success + val viewModel = createViewModel() + // Simulate initial email send (not user initiated) + viewModel.trySendAction( + TwoFactorLoginAction.Internal.ReceiveResendEmailResult( + ResendEmailResult.Success, + isUserInitiated = false, + ), + ) + viewModel.stateEventFlow(backgroundScope) { stateFlow, eventFlow -> + // No loading dialog + assertEquals(DEFAULT_STATE, stateFlow.awaitItem()) + // No snackbar + eventFlow.expectNoEvents() + } + } + @Test fun `ResendEmailClick returns success should emit ShowSnackbar`() = runTest { coEvery { From 145c19da22607a4870560e39fdd71ca10bf022b9 Mon Sep 17 00:00:00 2001 From: Andy Pixley <3723676+pixman20@users.noreply.github.com> Date: Tue, 15 Jul 2025 16:05:10 -0400 Subject: [PATCH 03/12] [BRE-831] migrate secrets akv (#5347) --- .github/workflows/build-authenticator.yml | 25 ++++++-- .github/workflows/build.yml | 71 +++++++++++++++-------- .github/workflows/crowdin-pull.yml | 23 ++++++-- .github/workflows/crowdin-push.yml | 10 +++- .github/workflows/github-release.yml | 22 ++++++- .github/workflows/scan-ci.yml | 45 ++++++++++++-- .github/workflows/scan.yml | 44 ++++++++++++-- 7 files changed, 194 insertions(+), 46 deletions(-) diff --git a/.github/workflows/build-authenticator.yml b/.github/workflows/build-authenticator.yml index 6d55e6d0b1..fdc8861846 100644 --- a/.github/workflows/build-authenticator.yml +++ b/.github/workflows/build-authenticator.yml @@ -32,6 +32,7 @@ env: permissions: contents: read packages: read + id-token: write jobs: build: @@ -122,9 +123,18 @@ jobs: bundle install --jobs 4 --retry 3 - name: Log in to Azure - uses: Azure/login@a457da9ea143d694b1b9c7c869ebb04ebe844ef5 # v2.3.0 + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-android + secrets: "BWA-AAB-KEYSTORE-STORE-PASSWORD,BWA-AAB-KEYSTORE-KEY-PASSWORD,BWA-APK-KEYSTORE-STORE-PASSWORD,BWA-APK-KEYSTORE-KEY-PASSWORD" - name: Retrieve secrets env: @@ -168,6 +178,9 @@ jobs: az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \ --name authenticator_play_store-creds.json --file ${{ github.workspace }}/secrets/authenticator_play_store-creds.json --output none + - name: AZ Logout + uses: bitwarden/gh-actions/azure-logout@main + - name: Verify Play Store credentials if: ${{ inputs.publish-to-play-store }} run: | @@ -222,18 +235,18 @@ jobs: run: | bundle exec fastlane bundleAuthenticatorRelease \ storeFile:${{ github.workspace }}/keystores/authenticator_aab-keystore.jks \ - storePassword:'${{ secrets.BWA_AAB_KEYSTORE_STORE_PASSWORD }}' \ + storePassword:'${{ steps.get-kv-secrets.outputs.BWA-AAB-KEYSTORE-STORE-PASSWORD }}' \ keyAlias:authenticatorupload \ - keyPassword:'${{ secrets.BWA_AAB_KEYSTORE_KEY_PASSWORD }}' + keyPassword:'${{ steps.get-kv-secrets.outputs.BWA-AAB-KEYSTORE-KEY-PASSWORD }}' - name: Generate release Play Store APK if: ${{ matrix.variant == 'apk' }} run: | bundle exec fastlane buildAuthenticatorRelease \ storeFile:${{ github.workspace }}/keystores/authenticator_apk-keystore.jks \ - storePassword:'${{ secrets.BWA_APK_KEYSTORE_STORE_PASSWORD }}' \ + storePassword:'${{ steps.get-kv-secrets.outputs.BWA-APK-KEYSTORE-STORE-PASSWORD }}' \ keyAlias:bitwardenauthenticator \ - keyPassword:'${{ secrets.BWA_APK_KEYSTORE_KEY_PASSWORD }}' + keyPassword:'${{ steps.get-kv-secrets.outputs.BWA-APK-KEYSTORE-KEY-PASSWORD }}' - name: Upload release Play Store .aab artifact if: ${{ matrix.variant == 'aab' }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 432b965be6..8e1a5d0829 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,6 +33,7 @@ env: permissions: contents: read packages: read + id-token: write jobs: build: @@ -130,9 +131,18 @@ jobs: bundle install --jobs 4 --retry 3 - name: Log in to Azure - uses: Azure/login@a457da9ea143d694b1b9c7c869ebb04ebe844ef5 # v2.3.0 + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-android + secrets: "UPLOAD-KEYSTORE-PASSWORD,UPLOAD-BETA-KEYSTORE-PASSWORD,UPLOAD-BETA-KEY-PASSWORD,PLAY-KEYSTORE-PASSWORD,PLAY-BETA-KEYSTORE-PASSWORD,PLAY-BETA-KEY-PASSWORD" - name: Retrieve secrets env: @@ -169,6 +179,9 @@ jobs: az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \ --name app_play_prod_firebase-creds.json --file ${{ github.workspace }}/secrets/app_play_prod_firebase-creds.json --output none + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Validate Gradle wrapper uses: gradle/actions/wrapper-validation@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 @@ -216,48 +229,48 @@ jobs: - name: Generate release Play Store bundle if: ${{ matrix.variant == 'prod' && matrix.artifact == 'aab' }} env: - UPLOAD_KEYSTORE_PASSWORD: ${{ secrets.UPLOAD_KEYSTORE_PASSWORD }} + UPLOAD-KEYSTORE-PASSWORD: ${{ steps.get-kv-secrets.outputs.UPLOAD-KEYSTORE-PASSWORD }} run: | bundle exec fastlane bundlePlayStoreRelease \ storeFile:app_upload-keystore.jks \ - storePassword:${{ env.UPLOAD_KEYSTORE_PASSWORD }} \ + storePassword:${{ env.UPLOAD-KEYSTORE-PASSWORD }} \ keyAlias:upload \ - keyPassword:${{ env.UPLOAD_KEYSTORE_PASSWORD }} + keyPassword:${{ env.UPLOAD-KEYSTORE-PASSWORD }} - name: Generate beta Play Store bundle if: ${{ (matrix.variant == 'prod') && (matrix.artifact == 'aab') }} env: - UPLOAD_BETA_KEYSTORE_PASSWORD: ${{ secrets.UPLOAD_BETA_KEYSTORE_PASSWORD }} - UPLOAD_BETA_KEY_PASSWORD: ${{ secrets.UPLOAD_BETA_KEY_PASSWORD }} + UPLOAD-BETA-KEYSTORE-PASSWORD: ${{ steps.get-kv-secrets.outputs.UPLOAD-BETA-KEYSTORE-PASSWORD }} + UPLOAD-BETA-KEY-PASSWORD: ${{ steps.get-kv-secrets.outputs.UPLOAD-BETA-KEY-PASSWORD }} run: | bundle exec fastlane bundlePlayStoreBeta \ storeFile:app_beta_upload-keystore.jks \ - storePassword:${{ env.UPLOAD_BETA_KEYSTORE_PASSWORD }} \ + storePassword:${{ env.UPLOAD-BETA-KEYSTORE-PASSWORD }} \ keyAlias:bitwarden-beta-upload \ - keyPassword:${{ env.UPLOAD_BETA_KEY_PASSWORD }} + keyPassword:${{ env.UPLOAD-BETA-KEY-PASSWORD }} - name: Generate release Play Store APK if: ${{ (matrix.variant == 'prod') && (matrix.artifact == 'apk') }} env: - PLAY_KEYSTORE_PASSWORD: ${{ secrets.PLAY_KEYSTORE_PASSWORD }} + PLAY-KEYSTORE-PASSWORD: ${{ steps.get-kv-secrets.outputs.PLAY-KEYSTORE-PASSWORD }} run: | bundle exec fastlane assemblePlayStoreReleaseApk \ storeFile:app_play-keystore.jks \ - storePassword:${{ env.PLAY_KEYSTORE_PASSWORD }} \ + storePassword:${{ env.PLAY-KEYSTORE-PASSWORD }} \ keyAlias:bitwarden \ - keyPassword:${{ env.PLAY_KEYSTORE_PASSWORD }} + keyPassword:${{ env.PLAY-KEYSTORE-PASSWORD }} - name: Generate beta Play Store APK if: ${{ (matrix.variant == 'prod') && (matrix.artifact == 'apk') }} env: - PLAY_BETA_KEYSTORE_PASSWORD: ${{ secrets.PLAY_BETA_KEYSTORE_PASSWORD }} - PLAY_BETA_KEY_PASSWORD: ${{ secrets.PLAY_BETA_KEY_PASSWORD }} + PLAY-BETA-KEYSTORE-PASSWORD: ${{ steps.get-kv-secrets.outputs.PLAY-BETA-KEYSTORE-PASSWORD }} + PLAY-BETA-KEY-PASSWORD: ${{ steps.get-kv-secrets.outputs.PLAY-BETA-KEY-PASSWORD }} run: | bundle exec fastlane assemblePlayStoreBetaApk \ storeFile:app_beta_play-keystore.jks \ - storePassword:${{ env.PLAY_BETA_KEYSTORE_PASSWORD }} \ + storePassword:${{ env.PLAY-BETA-KEYSTORE-PASSWORD }} \ keyAlias:bitwarden-beta \ - keyPassword:${{ env.PLAY_BETA_KEY_PASSWORD }} + keyPassword:${{ env.PLAY-BETA-KEY-PASSWORD }} - name: Generate debug Play Store APKs if: ${{ (matrix.variant != 'prod') && (matrix.artifact == 'apk') }} @@ -429,9 +442,18 @@ jobs: bundle install --jobs 4 --retry 3 - name: Log in to Azure - uses: Azure/login@a457da9ea143d694b1b9c7c869ebb04ebe844ef5 # v2.3.0 + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-android + secrets: "FDROID-KEYSTORE-PASSWORD,FDROID-BETA-KEYSTORE-PASSWORD,FDROID-BETA-KEY-PASSWORD" - name: Retrieve secrets env: @@ -454,6 +476,9 @@ jobs: az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \ --name app_fdroid_firebase-creds.json --file ${{ github.workspace }}/secrets/app_fdroid_firebase-creds.json --output none + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Validate Gradle wrapper uses: gradle/actions/wrapper-validation@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 @@ -508,7 +533,7 @@ jobs: echo "Version Number: $VERSION_CODE" >> $GITHUB_STEP_SUMMARY - name: Generate F-Droid artifacts env: - FDROID_STORE_PASSWORD: ${{ secrets.FDROID_KEYSTORE_PASSWORD }} + FDROID_STORE_PASSWORD: ${{ steps.get-kv-secrets.outputs.FDROID-KEYSTORE-PASSWORD }} run: | bundle exec fastlane assembleFDroidReleaseApk \ storeFile:app_fdroid-keystore.jks \ @@ -518,14 +543,14 @@ jobs: - name: Generate F-Droid Beta Artifacts env: - FDROID_BETA_KEYSTORE_PASSWORD: ${{ secrets.FDROID_BETA_KEYSTORE_PASSWORD }} - FDROID_BETA_KEY_PASSWORD: ${{ secrets.FDROID_BETA_KEY_PASSWORD }} + FDROID-BETA-KEYSTORE-PASSWORD: ${{ steps.get-kv-secrets.outputs.FDROID-BETA-KEYSTORE-PASSWORD }} + FDROID-BETA-KEY-PASSWORD: ${{ steps.get-kv-secrets.outputs.FDROID-BETA-KEY-PASSWORD }} run: | bundle exec fastlane assembleFDroidBetaApk \ storeFile:app_beta_fdroid-keystore.jks \ - storePassword:"${{ env.FDROID_BETA_KEYSTORE_PASSWORD }}" \ + storePassword:"${{ env.FDROID-BETA-KEYSTORE-PASSWORD }}" \ keyAlias:bitwarden-beta \ - keyPassword:"${{ env.FDROID_BETA_KEY_PASSWORD }}" + keyPassword:"${{ env.FDROID-BETA-KEY-PASSWORD }}" - name: Upload F-Droid .apk artifact uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 diff --git a/.github/workflows/crowdin-pull.yml b/.github/workflows/crowdin-pull.yml index 59d5f81009..5f42757cb4 100644 --- a/.github/workflows/crowdin-pull.yml +++ b/.github/workflows/crowdin-pull.yml @@ -13,6 +13,7 @@ jobs: permissions: contents: write pull-requests: write + id-token: write strategy: matrix: include: @@ -28,10 +29,19 @@ jobs: - name: Checkout repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - name: Login to Azure - CI Subscription - uses: Azure/login@a457da9ea143d694b1b9c7c869ebb04ebe844ef5 # v2.3.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-org-bitwarden + secrets: "BW-GHAPP-ID,BW-GHAPP-KEY" - name: Retrieve secrets id: retrieve-secrets @@ -40,12 +50,15 @@ jobs: keyvault: "bitwarden-ci" secrets: "crowdin-api-token, github-gpg-private-key, github-gpg-private-key-passphrase" + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Generate GH App token uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 id: app-token with: - app-id: ${{ secrets.BW_GHAPP_ID }} - private-key: ${{ secrets.BW_GHAPP_KEY }} + app-id: ${{ steps.get-kv-secrets.outputs.BW-GHAPP-ID }} + private-key: ${{ steps.get-kv-secrets.outputs.BW-GHAPP-KEY }} - name: Download translations for ${{ matrix.name }} uses: crowdin/github-action@b8012bd5491b8aa8578b73ab5b5f5e7c94aaa6e2 # v2.7.0 diff --git a/.github/workflows/crowdin-push.yml b/.github/workflows/crowdin-push.yml index e9ac7a2d8f..3a9c59ac0e 100644 --- a/.github/workflows/crowdin-push.yml +++ b/.github/workflows/crowdin-push.yml @@ -13,14 +13,17 @@ jobs: runs-on: ubuntu-24.04 permissions: contents: read + id-token: write steps: - name: Check out repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Log in to Azure - uses: Azure/login@a457da9ea143d694b1b9c7c869ebb04ebe844ef5 # v2.3.0 + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve secrets id: retrieve-secrets @@ -40,6 +43,9 @@ jobs: upload_sources: true upload_translations: false + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Upload sources for Authenticator uses: crowdin/github-action@b8012bd5491b8aa8578b73ab5b5f5e7c94aaa6e2 # v2.7.0 env: diff --git a/.github/workflows/github-release.yml b/.github/workflows/github-release.yml index 345b7416a2..8d11eaf831 100644 --- a/.github/workflows/github-release.yml +++ b/.github/workflows/github-release.yml @@ -21,6 +21,7 @@ jobs: runs-on: ubuntu-24.04 permissions: contents: write + id-token: write steps: - name: Check out repository @@ -115,6 +116,23 @@ jobs: find $ARTIFACTS_PATH -type f fi + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main + with: + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-android + secrets: "JIRA-API-EMAIL,JIRA-API-TOKEN" + + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Get product release notes id: get_release_notes env: @@ -122,8 +140,8 @@ jobs: ARTIFACT_RUN_ID: ${{ inputs.artifact-run-id }} _VERSION_NAME: ${{ steps.get_release_info.outputs.version_name }} _RELEASE_TICKET_ID: ${{ inputs.release-ticket-id }} - _JIRA_API_EMAIL: ${{ secrets.JIRA_API_EMAIL }} - _JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }} + _JIRA_API_EMAIL: ${{ steps.get-kv-secrets.outputs.JIRA-API-EMAIL }} + _JIRA_API_TOKEN: ${{ steps.get-kv-secrets.outputs.JIRA-API-TOKEN }} run: | echo "Getting product release notes" product_release_notes=$(python3 .github/scripts/jira-get-release-notes/jira_release_notes.py $_RELEASE_TICKET_ID $_JIRA_API_EMAIL $_JIRA_API_TOKEN) diff --git a/.github/workflows/scan-ci.yml b/.github/workflows/scan-ci.yml index 0091ece10f..8a4246426f 100644 --- a/.github/workflows/scan-ci.yml +++ b/.github/workflows/scan-ci.yml @@ -13,6 +13,7 @@ jobs: permissions: contents: read security-events: write + id-token: write steps: - name: Check out repo @@ -20,14 +21,31 @@ jobs: with: fetch-depth: 0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main + with: + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-org-bitwarden + secrets: "CHECKMARX-TENANT,CHECKMARX-CLIENT-ID,CHECKMARX-SECRET" + + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Scan with Checkmarx uses: checkmarx/ast-github-action@ef93013c95adc60160bc22060875e90800d3ecfc # 2.3.19 with: project_name: ${{ github.repository }} - cx_tenant: ${{ secrets.CHECKMARX_TENANT }} + cx_tenant: ${{ steps.get-kv-secrets.outputs.CHECKMARX-TENANT }} base_uri: https://ast.checkmarx.net/ - cx_client_id: ${{ secrets.CHECKMARX_CLIENT_ID }} - cx_client_secret: ${{ secrets.CHECKMARX_SECRET }} + cx_client_id: ${{ steps.get-kv-secrets.outputs.CHECKMARX-CLIENT-ID }} + cx_client_secret: ${{ steps.get-kv-secrets.outputs.CHECKMARX-SECRET }} additional_params: | --report-format sarif \ --filter "state=TO_VERIFY;PROPOSED_NOT_EXPLOITABLE;CONFIRMED;URGENT" \ @@ -43,17 +61,36 @@ jobs: runs-on: ubuntu-24.04 permissions: contents: read + id-token: write steps: + - name: Check out repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main + with: + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-org-bitwarden + secrets: "SONAR-TOKEN" + + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Scan with SonarCloud uses: sonarsource/sonarqube-scan-action@aa494459d7c39c106cc77b166de8b4250a32bb97 # v5.1.0 env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + SONAR_TOKEN: ${{ steps.get-kv-secrets.outputs.SONAR-TOKEN }} with: args: > -Dsonar.organization=${{ github.repository_owner }} diff --git a/.github/workflows/scan.yml b/.github/workflows/scan.yml index f72bc72c7f..9fe35a9af5 100644 --- a/.github/workflows/scan.yml +++ b/.github/workflows/scan.yml @@ -28,6 +28,7 @@ jobs: contents: read pull-requests: write security-events: write + id-token: write steps: - name: Check out repo @@ -35,16 +36,33 @@ jobs: with: ref: ${{ github.event.pull_request.head.sha }} + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main + with: + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-org-bitwarden + secrets: "CHECKMARX-TENANT,CHECKMARX-CLIENT-ID,CHECKMARX-SECRET" + + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Scan with Checkmarx uses: checkmarx/ast-github-action@ef93013c95adc60160bc22060875e90800d3ecfc # 2.3.19 env: INCREMENTAL: "${{ contains(github.event_name, 'pull_request') && '--sast-incremental' || '' }}" with: project_name: ${{ github.repository }} - cx_tenant: ${{ secrets.CHECKMARX_TENANT }} + cx_tenant: ${{ steps.get-kv-secrets.outputs.CHECKMARX-TENANT }} base_uri: https://ast.checkmarx.net/ - cx_client_id: ${{ secrets.CHECKMARX_CLIENT_ID }} - cx_client_secret: ${{ secrets.CHECKMARX_SECRET }} + cx_client_id: ${{ steps.get-kv-secrets.outputs.CHECKMARX-CLIENT-ID }} + cx_client_secret: ${{ steps.get-kv-secrets.outputs.CHECKMARX-SECRET }} additional_params: | --report-format sarif \ --filter "state=TO_VERIFY;PROPOSED_NOT_EXPLOITABLE;CONFIRMED;URGENT" \ @@ -64,6 +82,7 @@ jobs: permissions: contents: read pull-requests: write + id-token: write steps: - name: Check out repo @@ -72,10 +91,27 @@ jobs: fetch-depth: 0 ref: ${{ github.event.pull_request.head.sha }} + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main + with: + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-org-bitwarden + secrets: "SONAR-TOKEN" + + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Scan with SonarCloud uses: sonarsource/sonarqube-scan-action@aa494459d7c39c106cc77b166de8b4250a32bb97 # v5.1.0 env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + SONAR_TOKEN: ${{ steps.get-kv-secrets.outputs.SONAR-TOKEN }} with: args: > -Dsonar.organization=${{ github.repository_owner }} From f0bdc8ede3853b80216abf086afac46d9e411fe7 Mon Sep 17 00:00:00 2001 From: Patrick Honkonen <1883101+SaintPatrck@users.noreply.github.com> Date: Wed, 16 Jul 2025 09:53:17 -0400 Subject: [PATCH 04/12] Update authenticatorbridge README (#5423) --- authenticatorbridge/README.md | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/authenticatorbridge/README.md b/authenticatorbridge/README.md index 6c57e6283c..fd9fa6012a 100644 --- a/authenticatorbridge/README.md +++ b/authenticatorbridge/README.md @@ -47,13 +47,27 @@ Some things to note: ## Dependencies +> [!IMPORTANT] +> The SDK does not come packaged with these dependencies, so consumers of the SDK must provide them. + +### Module Dependencies + +The following is a list of project modules required by the SDK. + +- **bitwarden-core** + - [Core](../core) + - Purpose: Internal platform tools and extensions + - License: [LICENSE](../LICENSE.txt) + +- **bitwarden-annotations** + - [Annotations](../annotation) + - Purpose: Internal annotations used by the SDK. + - License: [LICENSE](../LICENSE.txt) + ### Application Dependencies The following is a list of all third-party dependencies required by the SDK. -> [!IMPORTANT] -> The SDK does not come packaged with these dependencies, so consumers of the SDK must provide them. - - **AndroidX Appcompat** - https://developer.android.com/jetpack/androidx/releases/appcompat - Purpose: Allows access to new APIs on older API versions. From 8178a61dba167c427a8fe50fd7111eb7af516e53 Mon Sep 17 00:00:00 2001 From: mpbw2 <59324545+mpbw2@users.noreply.github.com> Date: Wed, 16 Jul 2025 10:13:21 -0400 Subject: [PATCH 05/12] [PM-22335] Support fastlane dev via rbenv (#5390) --- .ruby-version | 2 +- Gemfile | 9 +++++++++ Gemfile.lock | 12 ++++++++++-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/.ruby-version b/.ruby-version index bea438e9ad..4d9d11cf50 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.3.1 +3.4.2 diff --git a/Gemfile b/Gemfile index 32ff931186..89fcb9af06 100644 --- a/Gemfile +++ b/Gemfile @@ -7,3 +7,12 @@ gem 'time' plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') eval_gemfile(plugins_path) if File.exist?(plugins_path) + +# Since ruby 3.4.0 these are not included in the standard library +gem 'abbrev' +gem 'logger' +gem 'mutex_m' +gem 'csv' + +# Starting with Ruby 3.5.0, these are not included in the standard library +gem 'ostruct' diff --git a/Gemfile.lock b/Gemfile.lock index ff6bf0e437..799609e1fa 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -5,6 +5,7 @@ GEM base64 nkf rexml + abbrev (0.1.2) addressable (2.8.7) public_suffix (>= 2.0.2, < 7.0) artifactory (3.0.17) @@ -34,6 +35,7 @@ GEM colored2 (3.1.2) commander (4.6.0) highline (~> 2.0.0) + csv (3.3.5) date (3.4.1) declarative (0.0.20) digest-crc (0.7.0) @@ -179,6 +181,7 @@ GEM nkf (0.2.0) optparse (0.6.0) os (1.1.4) + ostruct (0.6.1) plist (3.7.2) public_suffix (6.0.2) rake (13.3.0) @@ -230,12 +233,17 @@ PLATFORMS ruby DEPENDENCIES + abbrev + csv fastlane fastlane-plugin-firebase_app_distribution + logger + mutex_m + ostruct time RUBY VERSION - ruby 3.3.1p55 + ruby 3.4.2p28 BUNDLED WITH - 2.6.6 + 2.6.9 From b53ca30974971673cb62cdb84a3686cd0c683327 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ch=C4=99ci=C5=84ski?= Date: Wed, 16 Jul 2025 17:32:21 +0200 Subject: [PATCH 06/12] [BRE-769] Use Fastlane to keep github releases in sync with mobile deploy versions (#5219) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Patrick Honkonen <1883101+SaintPatrck@users.noreply.github.com> Co-authored-by: Álison Fernandes --- .github/workflows/publish-github-release.yml | 38 +++++++++++++++----- fastlane/Fastfile | 34 ++++++++++++++++++ 2 files changed, 64 insertions(+), 8 deletions(-) diff --git a/.github/workflows/publish-github-release.yml b/.github/workflows/publish-github-release.yml index e752d4921a..e6192e60e4 100644 --- a/.github/workflows/publish-github-release.yml +++ b/.github/workflows/publish-github-release.yml @@ -1,14 +1,36 @@ -name: Publish GitHub Release as newest +name: Publish Password Manager and Authenticator GitHub Release as newest on: workflow_dispatch: + schedule: + - cron: '0 3 * * 1-5' -permissions: {} +permissions: + contents: write + id-token: write + actions: read jobs: - stub: - runs-on: ubuntu-24.04 - name: Stub - steps: - - name: Stub - run: echo "This is a stub job to trigger the workflow." + publish-release-password-manager: + name: Publish Password Manager Release + uses: bitwarden/gh-actions/.github/workflows/_publish-mobile-github-release.yml@main + with: + release_name: "Password Manager" + workflow_name: "publish-github-release.yml" + credentials_filename: "play_creds.json" + project_type: android + check_release_command: > + bundle exec fastlane getLatestPlayStoreVersion package_name:com.x8bit.bitwarden track:production + secrets: inherit + + publish-release-authenticator: + name: Publish Authenticator Release + uses: bitwarden/gh-actions/.github/workflows/_publish-mobile-github-release.yml@main + with: + release_name: "Authenticator" + workflow_name: "publish-github-release.yml" + credentials_filename: "authenticator_play_store-creds.json" + project_type: android + check_release_command: > + bundle exec fastlane getLatestPlayStoreVersion package_name:com.bitwarden.authenticator track:production + secrets: inherit diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 3b708483df..454b806547 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -265,6 +265,40 @@ platform :android do releaseNotes end + desc "Get latest published version for a given package name and Play Store track" + lane :getLatestPlayStoreVersion do |options| + package_name = options[:package_name] + track = options[:track] + # Hardcoding paths for now, it will simplify transitioning to the new build .env files + case package_name + when "com.x8bit.bitwarden", "com.x8bit.bitwarden.beta" + json_key = "secrets/play_creds.json" + when "com.bitwarden.authenticator" + json_key = "secrets/authenticator_play_store-creds.json" + else + UI.important "Unexpected package name: #{package_name}, using default play store json key" + json_key = "secrets/play_creds.json" + end + + release_name = google_play_track_release_names( + package_name: package_name, + track: track, + json_key: json_key, + ) + + version_code = google_play_track_version_codes( + package_name: package_name, + track: track, + json_key: json_key, + ) + + latest_version_name = release_name.first + latest_version_number = version_code.first.to_s.strip + + UI.message("version_name: #{latest_version_name}") + UI.message("version_number: #{latest_version_number}") + end + # Authenticator desc "Apply build version information" fastlane_require "time" From 2d2a5e74dadd0f6fd6a0d8339391e113e9226be5 Mon Sep 17 00:00:00 2001 From: Patrick Honkonen <1883101+SaintPatrck@users.noreply.github.com> Date: Wed, 16 Jul 2025 20:42:41 -0400 Subject: [PATCH 07/12] Fix `unmockkStatic` usage in `SdkCipherRepositoryTest` (#5534) --- .../platform/manager/sdk/repository/SdkCipherRepositoryTest.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/sdk/repository/SdkCipherRepositoryTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/sdk/repository/SdkCipherRepositoryTest.kt index e546b4b565..5bb5f3064e 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/sdk/repository/SdkCipherRepositoryTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/sdk/repository/SdkCipherRepositoryTest.kt @@ -13,6 +13,7 @@ import io.mockk.just import io.mockk.mockk import io.mockk.mockkStatic import io.mockk.runs +import io.mockk.unmockkStatic import kotlinx.coroutines.test.runTest import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.Assertions.assertEquals @@ -41,7 +42,7 @@ class SdkCipherRepositoryTest { @AfterEach fun tearDown() { - mockkStatic( + unmockkStatic( SyncResponseJson.Cipher::toEncryptedSdkCipher, Cipher::toEncryptedNetworkCipherResponse, ) From fca4ebe023fe7e5e8876230d6fbef82fd9cb2a8c Mon Sep 17 00:00:00 2001 From: Patrick Honkonen <1883101+SaintPatrck@users.noreply.github.com> Date: Thu, 17 Jul 2025 12:10:41 -0400 Subject: [PATCH 08/12] [PM-23681] Update TotpCodeManager to use CipherListView (#5532) --- .../autofill/util/CipherListViewExtensions.kt | 18 +++ .../data/vault/manager/TotpCodeManager.kt | 19 +++ .../data/vault/manager/TotpCodeManagerImpl.kt | 124 +++++++++++++++++- .../manager/model/VerificationCodeItem.kt | 2 - .../vault/feature/item/VaultItemViewModel.kt | 1 - .../feature/item/model/TotpCodeItemData.kt | 2 - .../util/CipherListViewExtensionsTest.kt | 60 +++++++++ .../datasource/sdk/VaultSdkSourceTest.kt | 10 +- .../sdk/model/CipherListViewUtil.kt | 123 +++++++++++++++++ .../data/vault/manager/TotpCodeManagerTest.kt | 124 ++++++++++++++++++ .../vault/repository/VaultRepositoryTest.kt | 2 +- .../vault/feature/item/VaultItemScreenTest.kt | 2 - .../feature/item/VaultItemViewModelTest.kt | 3 - .../item/util/CipherViewExtensionsTest.kt | 3 - .../feature/item/util/VaultItemTestUtil.kt | 1 - .../util/VerificationCodeDataUtil.kt | 1 - 16 files changed, 470 insertions(+), 25 deletions(-) create mode 100644 app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/util/CipherListViewExtensions.kt create mode 100644 app/src/test/kotlin/com/x8bit/bitwarden/data/autofill/util/CipherListViewExtensionsTest.kt create mode 100644 app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/model/CipherListViewUtil.kt diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/util/CipherListViewExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/util/CipherListViewExtensions.kt new file mode 100644 index 0000000000..885eb182e8 --- /dev/null +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/util/CipherListViewExtensions.kt @@ -0,0 +1,18 @@ +package com.x8bit.bitwarden.data.autofill.util + +import com.bitwarden.vault.CardListView +import com.bitwarden.vault.CipherListView +import com.bitwarden.vault.CipherListViewType +import com.bitwarden.vault.LoginListView + +/** + * Returns the [LoginListView] if the cipher is of type [CipherListViewType.Login], otherwise null. + */ +val CipherListView.login: LoginListView? + get() = (this.type as? CipherListViewType.Login)?.v1 + +/** + * Returns the [CardListView] if the cipher is of type [CipherListViewType.Card], otherwise null. + */ +val CipherListView.card: CardListView? + get() = (this.type as? CipherListViewType.Card)?.v1 diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/TotpCodeManager.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/TotpCodeManager.kt index 2f3ead330b..fd6a4bb5f9 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/TotpCodeManager.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/TotpCodeManager.kt @@ -1,6 +1,7 @@ package com.x8bit.bitwarden.data.vault.manager import com.bitwarden.core.data.repository.model.DataState +import com.bitwarden.vault.CipherListView import com.bitwarden.vault.CipherView import com.x8bit.bitwarden.data.vault.manager.model.VerificationCodeItem import kotlinx.coroutines.flow.StateFlow @@ -18,6 +19,15 @@ interface TotpCodeManager { cipherList: List, ): StateFlow>> + /** + * Flow for getting a DataState with multiple verification code items for the given + * [cipherListViews]. + */ + fun getTotpCodesForCipherListViewsStateFlow( + userId: String, + cipherListViews: List, + ): StateFlow>> + /** * Flow for getting a DataState with a single verification code item. */ @@ -25,4 +35,13 @@ interface TotpCodeManager { userId: String, cipher: CipherView, ): StateFlow> + + /** + * Flow for getting a DataState with a single verification code item for the given + * [cipherListView]. + */ + fun getTotpCodeStateFlow( + userId: String, + cipherListView: CipherListView, + ): StateFlow> } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/TotpCodeManagerImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/TotpCodeManagerImpl.kt index 3acb6e4bd6..469cefd1c9 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/TotpCodeManagerImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/TotpCodeManagerImpl.kt @@ -3,8 +3,10 @@ package com.x8bit.bitwarden.data.vault.manager import com.bitwarden.core.DateTime import com.bitwarden.core.data.repository.model.DataState import com.bitwarden.data.manager.DispatcherManager +import com.bitwarden.vault.CipherListView import com.bitwarden.vault.CipherRepromptType import com.bitwarden.vault.CipherView +import com.x8bit.bitwarden.data.autofill.util.login import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource import com.x8bit.bitwarden.data.vault.manager.model.VerificationCodeItem import kotlinx.coroutines.CoroutineScope @@ -36,6 +38,9 @@ class TotpCodeManagerImpl( private val mutableVerificationCodeStateFlowMap = mutableMapOf>>() + private val mutableCipherListViewVerificationCodeStateFlowMap = + mutableMapOf>>() + override fun getTotpCodesStateFlow( userId: String, cipherList: List, @@ -73,6 +78,43 @@ class TotpCodeManagerImpl( cipher = cipher, ) + override fun getTotpCodesForCipherListViewsStateFlow( + userId: String, + cipherListViews: List, + ): StateFlow>> { + // Generate state flows + val stateFlows = cipherListViews.map { cipherListView -> + getTotpCodeStateFlowInternal(userId, cipherListView) + } + return combine(stateFlows) { results -> + when { + results.any { it is DataState.Loading } -> { + DataState.Loading + } + + else -> { + DataState.Loaded( + data = results.mapNotNull { (it as DataState.Loaded).data }, + ) + } + } + } + .stateIn( + scope = unconfinedScope, + started = SharingStarted.WhileSubscribed(), + initialValue = DataState.Loading, + ) + } + + override fun getTotpCodeStateFlow( + userId: String, + cipherListView: CipherListView, + ): StateFlow> = + getTotpCodeStateFlowInternal( + userId = userId, + cipherListView = cipherListView, + ) + @Suppress("LongMethod") private fun getTotpCodeStateFlowInternal( userId: String, @@ -108,7 +150,6 @@ class TotpCodeManagerImpl( .onSuccess { response -> item = VerificationCodeItem( code = response.code, - totpCode = totpCode, periodSeconds = response.period.toInt(), timeLeftSeconds = response.period.toInt() - time % response.period.toInt(), @@ -129,12 +170,9 @@ class TotpCodeManagerImpl( return@flow } } else { - item?.let { - item = it.copy( - timeLeftSeconds = it.periodSeconds - - (time % it.periodSeconds), - ) - } + item = item.copy( + timeLeftSeconds = item.periodSeconds - (time % item.periodSeconds), + ) } item?.let { @@ -154,6 +192,78 @@ class TotpCodeManagerImpl( ) } } + + @Suppress("LongMethod") + private fun getTotpCodeStateFlowInternal( + userId: String, + cipherListView: CipherListView?, + ): StateFlow> { + val cipherId = cipherListView?.id ?: return MutableStateFlow(DataState.Loaded(null)) + cipherListView.login?.totp ?: return MutableStateFlow(DataState.Loaded(null)) + + return mutableCipherListViewVerificationCodeStateFlowMap.getOrPut(cipherListView) { + // Define a per-item scope so that we can clear the Flow from the scope when it is + // no longer needed. + val itemScope = CoroutineScope(dispatcherManager.unconfined) + + flow> { + + var item: VerificationCodeItem? = null + while (currentCoroutineContext().isActive) { + val dateTime = clock.instant() + val time = dateTime.epochSecond.toInt() + if (item == null || item.isExpired(clock = clock)) { + vaultSdkSource + .generateTotpForCipherListView( + cipherListView = cipherListView, + userId = userId, + time = dateTime, + ) + .onSuccess { response -> + item = VerificationCodeItem( + code = response.code, + periodSeconds = response.period.toInt(), + timeLeftSeconds = response.period.toInt() - + time % response.period.toInt(), + issueTime = clock.millis(), + uriLoginViewList = cipherListView.login?.uris, + id = cipherId, + name = cipherListView.name, + username = cipherListView.login?.username, + hasPasswordReprompt = when (cipherListView.reprompt) { + CipherRepromptType.PASSWORD -> true + CipherRepromptType.NONE -> false + }, + orgUsesTotp = cipherListView.organizationUseTotp, + ) + } + .onFailure { + emit(DataState.Loaded(null)) + return@flow + } + } else { + item = item.copy( + timeLeftSeconds = item.periodSeconds - (time % item.periodSeconds), + ) + } + + item?.let { + emit(DataState.Loaded(it)) + } + delay(ONE_SECOND_MILLISECOND) + } + } + .onCompletion { + mutableCipherListViewVerificationCodeStateFlowMap.remove(cipherListView) + itemScope.cancel() + } + .stateIn( + scope = itemScope, + started = SharingStarted.WhileSubscribed(), + initialValue = DataState.Loading, + ) + } + } } private fun VerificationCodeItem.isExpired(clock: Clock): Boolean { diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/model/VerificationCodeItem.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/model/VerificationCodeItem.kt index fadc0f357b..8dbf54fd07 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/model/VerificationCodeItem.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/model/VerificationCodeItem.kt @@ -6,7 +6,6 @@ import com.bitwarden.vault.LoginUriView * Models the items returned by the TotpCodeManager. * * @property code The verification code for the item. - * @property totpCode The totp code for the item. * @property periodSeconds The time span where the code is valid in seconds. * @property timeLeftSeconds The seconds remaining until a new code is required. * @property issueTime The time the verification code was issued. @@ -19,7 +18,6 @@ import com.bitwarden.vault.LoginUriView */ data class VerificationCodeItem( val code: String, - val totpCode: String, val periodSeconds: Int, val timeLeftSeconds: Int, val issueTime: Long, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt index 51124c5ee0..ffafb95ccd 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt @@ -120,7 +120,6 @@ class VaultItemViewModel @Inject constructor( TotpCodeItemData( periodSeconds = it.periodSeconds, timeLeftSeconds = it.timeLeftSeconds, - totpCode = it.totpCode, verificationCode = it.code, ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/model/TotpCodeItemData.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/model/TotpCodeItemData.kt index 5bc6cebef7..63f01dc876 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/model/TotpCodeItemData.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/model/TotpCodeItemData.kt @@ -9,12 +9,10 @@ import kotlinx.parcelize.Parcelize * @property periodSeconds The period for the verification code. * @property timeLeftSeconds The time left for the verification timer. * @property verificationCode The verification code for the item. - * @property totpCode The totp code for the item. */ @Parcelize data class TotpCodeItemData( val periodSeconds: Int, val timeLeftSeconds: Int, val verificationCode: String, - val totpCode: String, ) : Parcelable diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/autofill/util/CipherListViewExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/autofill/util/CipherListViewExtensionsTest.kt new file mode 100644 index 0000000000..630ef69e17 --- /dev/null +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/autofill/util/CipherListViewExtensionsTest.kt @@ -0,0 +1,60 @@ +package com.x8bit.bitwarden.data.autofill.util + +import com.bitwarden.vault.CipherListViewType +import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCardListView +import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherListView +import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockLoginListView +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertNotNull +import org.junit.jupiter.api.assertNull + +class CipherListViewExtensionsTest { + + @Test + fun `login should return LoginListView when type is Login`() { + val cipherListView = createMockCipherListView( + number = 1, + type = CipherListViewType.Login(createMockLoginListView(1)), + ) + val loginListView = cipherListView.login + assertNotNull(loginListView) + } + + @Test + fun `login should return null when type is not Login`() { + val cipherListViews = listOf( + createMockCipherListView(number = 1, type = CipherListViewType.SecureNote), + createMockCipherListView( + number = 2, + type = CipherListViewType.Card(createMockCardListView(number = 2)), + ), + createMockCipherListView(number = 3, type = CipherListViewType.SshKey), + createMockCipherListView(number = 4, type = CipherListViewType.Identity), + ) + cipherListViews.forEach { assertNull(it.login) } + } + + @Test + fun `card should return CardListView when type is Card`() { + val cipherListView = createMockCipherListView( + number = 1, + type = CipherListViewType.Card(createMockCardListView(number = 1)), + ) + val cardListView = cipherListView.card + assertNotNull(cardListView) + } + + @Test + fun `card should return null when type is not Card`() { + listOf( + createMockCipherListView( + number = 1, + type = CipherListViewType.Login(createMockLoginListView(1)), + ), + createMockCipherListView(number = 2, type = CipherListViewType.SecureNote), + createMockCipherListView(number = 3, type = CipherListViewType.SshKey), + createMockCipherListView(number = 4, type = CipherListViewType.Identity), + ) + .forEach { assertNull(it.card) } + } +} diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceTest.kt index 996bad15ee..9d1c871b9d 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceTest.kt @@ -1,6 +1,5 @@ package com.x8bit.bitwarden.data.vault.datasource.sdk -import com.bitwarden.core.DateTime import com.bitwarden.core.DeriveKeyConnectorRequest import com.bitwarden.core.DerivePinKeyResponse import com.bitwarden.core.InitOrgCryptoRequest @@ -71,6 +70,9 @@ import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Test import java.security.MessageDigest +import java.time.Clock +import java.time.Instant +import java.time.ZoneOffset @Suppress("LargeClass") class VaultSdkSourceTest { @@ -1030,7 +1032,7 @@ class VaultSdkSourceTest { val totpResponse = TotpResponse("TestCode", 30u) coEvery { clientVault.generateTotp(any(), any()) } returns totpResponse - val time = DateTime.now() + val time = FIXED_CLOCK.instant() val result = vaultSdkSource.generateTotp( userId = userId, totp = "Totp", @@ -1469,3 +1471,7 @@ private val DEFAULT_FIDO_2_AUTH_REQUEST = AuthenticateFido2CredentialRequest( isUserVerificationSupported = true, selectedCipherView = createMockCipherView(number = 1), ) +private val FIXED_CLOCK: Clock = Clock.fixed( + Instant.parse("2023-10-27T12:00:00Z"), + ZoneOffset.UTC, +) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/model/CipherListViewUtil.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/model/CipherListViewUtil.kt new file mode 100644 index 0000000000..335f41e512 --- /dev/null +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/model/CipherListViewUtil.kt @@ -0,0 +1,123 @@ +package com.x8bit.bitwarden.data.vault.datasource.sdk.model + +import com.bitwarden.vault.CardListView +import com.bitwarden.vault.CipherListView +import com.bitwarden.vault.CipherListViewType +import com.bitwarden.vault.CipherPermissions +import com.bitwarden.vault.CipherRepromptType +import com.bitwarden.vault.CopyableCipherFields +import com.bitwarden.vault.Fido2CredentialListView +import com.bitwarden.vault.LocalDataView +import com.bitwarden.vault.LoginListView +import com.bitwarden.vault.LoginUriView +import java.time.Instant +import java.time.ZonedDateTime + +/** + * Default date time used for [ZonedDateTime] properties of mock objects. + */ +private const val DEFAULT_TIMESTAMP = "2023-10-27T12:00:00Z" + +/** + * Creates a mock [CipherListView] for testing. Defaults to a Login cipher. Set [type] to override + * the default behavior. + */ +@Suppress("LongParameterList") +fun createMockCipherListView( + number: Int, + id: String = "mockId-$number", + organizationId: String? = "mockOrganizationId-$number", + folderId: String? = "mockId-$number", + type: CipherListViewType = CipherListViewType.Login( + createMockLoginListView(number = 1), + ), + reprompt: CipherRepromptType = CipherRepromptType.NONE, + name: String = "mockName-$number", + favorite: Boolean = false, + collectionIds: List = listOf("mockId-$number"), + revisionDate: Instant = Instant.parse(DEFAULT_TIMESTAMP), + creationDate: Instant = Instant.parse(DEFAULT_TIMESTAMP), + attachments: UInt = 0U, + organizationUseTotp: Boolean = false, + edit: Boolean = false, + viewPassword: Boolean = false, + permissions: CipherPermissions? = createMockSdkCipherPermissions(), + localData: LocalDataView? = null, + key: String = "mockKey-$number", + subtitle: String = "mockSubtitle-$number", + hasOldAttachments: Boolean = false, + copyableFields: List = emptyList(), + isDeleted: Boolean = false, +): CipherListView = CipherListView( + id = id, + organizationId = organizationId, + folderId = folderId, + type = type, + reprompt = reprompt, + name = name, + favorite = favorite, + collectionIds = collectionIds, + revisionDate = revisionDate, + creationDate = creationDate, + deletedDate = if (isDeleted) Instant.parse(DEFAULT_TIMESTAMP) else null, + attachments = attachments, + organizationUseTotp = organizationUseTotp, + edit = edit, + viewPassword = viewPassword, + permissions = permissions, + localData = localData, + key = key, + subtitle = subtitle, + hasOldAttachments = hasOldAttachments, + copyableFields = copyableFields, +) + +/** + * Creates a mock [LoginListView] for testing. + */ +@Suppress("LongParameterList") +fun createMockLoginListView( + number: Int, + fido2Credentials: List = listOf( + createMockFido2CredentialListView(number = 1), + ), + hasFido2: Boolean = true, + username: String = "mockUsername-$number", + totp: String? = "mockTotp-$number", + uris: List = listOf(createMockUriView(number = 1)), +): LoginListView = LoginListView( + fido2Credentials = fido2Credentials, + hasFido2 = hasFido2, + username = username, + totp = totp, + uris = uris, +) + +/** + * Creates a mock [Fido2CredentialListView] for testing. + */ +@Suppress("LongParameterList") +fun createMockFido2CredentialListView( + number: Int, + credentialId: String = "mockCredentialId-$number", + rpId: String = "mockRpId-$number", + userHandle: String = "mockUserHandle-$number", + userName: String = "mockUserName-$number", + userDisplayName: String = "mockUserDisplayName-$number", +): Fido2CredentialListView = Fido2CredentialListView( + credentialId = credentialId, + rpId = rpId, + userHandle = userHandle, + userName = userName, + userDisplayName = userDisplayName, +) + +/** + * Creates a mock [CardListView] for testing. + */ +fun createMockCardListView( + number: Int, + brand: String = "mockBrand-$number", +): CardListView = CardListView( + brand = brand, +) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/manager/TotpCodeManagerTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/manager/TotpCodeManagerTest.kt index a40245df00..579b4b0c59 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/manager/TotpCodeManagerTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/manager/TotpCodeManagerTest.kt @@ -6,10 +6,13 @@ import com.bitwarden.core.data.util.asFailure import com.bitwarden.core.data.util.asSuccess import com.bitwarden.data.datasource.disk.base.FakeDispatcherManager import com.bitwarden.data.manager.DispatcherManager +import com.bitwarden.vault.CipherListViewType import com.bitwarden.vault.CipherRepromptType import com.bitwarden.vault.TotpResponse import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource +import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherListView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView +import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockLoginListView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockLoginView import com.x8bit.bitwarden.data.vault.manager.model.VerificationCodeItem import com.x8bit.bitwarden.ui.vault.feature.verificationcode.util.createVerificationCodeItem @@ -129,4 +132,125 @@ class TotpCodeManagerTest { assertEquals(DataState.Loaded(null), awaitItem()) } } + + @Test + @Suppress("MaxLineLength") + fun `getTotpCodesForCipherListViewsStateFlow should have loaded data with a valid values passed in`() = + runTest { + val cipherListViews = listOf( + createMockCipherListView(number = 1), + ) + val totpResponse = TotpResponse("123456", 30u) + coEvery { + vaultSdkSource.generateTotpForCipherListView( + userId = any(), + cipherListView = any(), + time = any(), + ) + } returns totpResponse.asSuccess() + + val expected = createVerificationCodeItem() + + totpCodeManager.getTotpCodesForCipherListViewsStateFlow(userId, cipherListViews).test { + assertEquals(DataState.Loaded(listOf(expected)), awaitItem()) + } + } + + @Test + @Suppress("MaxLineLength") + fun `getTotpCodesForCipherListViewsStateFlow should have loaded data with empty list if no totp code is provided`() = + runTest { + val totpResponse = TotpResponse("123456", 30u) + coEvery { + vaultSdkSource.generateTotpForCipherListView( + userId = any(), + cipherListView = any(), + time = any(), + ) + } returns totpResponse.asSuccess() + + val cipherListView = createMockCipherListView( + number = 1, + type = CipherListViewType.Login( + createMockLoginListView( + number = 1, + totp = null, + ), + ), + ) + + totpCodeManager.getTotpCodesForCipherListViewsStateFlow(userId, listOf(cipherListView)) + .test { + assertEquals(DataState.Loaded(emptyList()), awaitItem()) + } + } + + @Suppress("MaxLineLength") + @Test + fun `getTotpCodesForCipherListViewsStateFlow should have loaded data with empty list if unable to generate auth code`() = + runTest { + coEvery { + vaultSdkSource.generateTotpForCipherListView( + userId = any(), + cipherListView = any(), + time = any(), + ) + } returns Exception().asFailure() + + val cipherListView = createMockCipherListView( + number = 1, + type = CipherListViewType.Login(createMockLoginListView(number = 1)), + ) + + totpCodeManager.getTotpCodesForCipherListViewsStateFlow(userId, listOf(cipherListView)).test { + assertEquals(DataState.Loaded(emptyList()), awaitItem()) + } + } + + @Test + @Suppress("MaxLineLength") + fun `getTotpCodeStateFlow from CipherListView should have loaded item with valid data passed in`() = + runTest { + val totpResponse = TotpResponse("123456", 30u) + coEvery { + vaultSdkSource.generateTotpForCipherListView( + userId = any(), + cipherListView = any(), + time = any(), + ) + } returns totpResponse.asSuccess() + + val cipherListView = createMockCipherListView( + number = 1, + reprompt = CipherRepromptType.PASSWORD, + ) + + val expected = createVerificationCodeItem().copy(hasPasswordReprompt = true) + + totpCodeManager.getTotpCodeStateFlow(userId, cipherListView).test { + assertEquals(DataState.Loaded(expected), awaitItem()) + } + } + + @Test + fun `getTotpCodeFlow from CipherListView should have null data if unable to get item`() = + runTest { + val totpResponse = TotpResponse("123456", 30u) + coEvery { + vaultSdkSource.generateTotp( + userId = any(), + totp = any(), + time = any(), + ) + } returns totpResponse.asSuccess() + + val cipherListView = createMockCipherListView( + number = 1, + type = CipherListViewType.SshKey, + ) + + totpCodeManager.getTotpCodeStateFlow(userId, cipherListView).test { + assertEquals(DataState.Loaded(null), awaitItem()) + } + } } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt index 9fafd4a20a..cfc294d4bf 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt @@ -3180,7 +3180,7 @@ class VaultRepositoryTest { ) every { - totpCodeManager.getTotpCodeStateFlow(userId = userId, any()) + totpCodeManager.getTotpCodeStateFlow(userId = userId, cipher = any()) } returns stateFlow setupDataStateFlow(userId = userId) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt index 44a341be1d..c268c2ef1a 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt @@ -2103,7 +2103,6 @@ class VaultItemScreenTest : BitwardenComposeTest() { periodSeconds = 30, timeLeftSeconds = 15, verificationCode = "123456", - totpCode = "testCode", ), ), ), @@ -3226,7 +3225,6 @@ private val DEFAULT_LOGIN: VaultItemState.ViewState.Content.ItemType.Login = periodSeconds = 30, timeLeftSeconds = 15, verificationCode = "123456", - totpCode = "testCode", ), fido2CredentialCreationDateText = null, canViewTotpCode = true, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModelTest.kt index 27e7147a8c..945eb5c01b 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModelTest.kt @@ -2482,7 +2482,6 @@ class VaultItemViewModelTest : BaseViewModelTest() { periodSeconds = 30, timeLeftSeconds = 30, verificationCode = "123456", - totpCode = "mockTotp-1", ) private fun setupMockUri() { @@ -2549,8 +2548,6 @@ class VaultItemViewModelTest : BaseViewModelTest() { passwordRevisionDate = R.string.password_last_updated.asText("12/31/69 06:16 PM"), isPremiumUser = true, totpCodeItemData = TotpCodeItemData( - totpCode = "otpauth://totp/Example:alice@google.com" + - "?secret=JBSWY3DPEHPK3PXP&issuer=Example", verificationCode = "123456", timeLeftSeconds = 15, periodSeconds = 30, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/util/CipherViewExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/util/CipherViewExtensionsTest.kt index 098f459bea..7c535c9395 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/util/CipherViewExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/util/CipherViewExtensionsTest.kt @@ -48,7 +48,6 @@ class CipherViewExtensionsTest { periodSeconds = 30, timeLeftSeconds = 15, verificationCode = "123456", - totpCode = "testCode", ), clock = fixedClock, canDelete = true, @@ -82,7 +81,6 @@ class CipherViewExtensionsTest { periodSeconds = 30, timeLeftSeconds = 15, verificationCode = "123456", - totpCode = "testCode", ), clock = fixedClock, canDelete = true, @@ -122,7 +120,6 @@ class CipherViewExtensionsTest { periodSeconds = 30, timeLeftSeconds = 15, verificationCode = "123456", - totpCode = "testCode", ), clock = fixedClock, canDelete = true, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/util/VaultItemTestUtil.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/util/VaultItemTestUtil.kt index b2007b802b..61d2c43951 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/util/VaultItemTestUtil.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/util/VaultItemTestUtil.kt @@ -278,7 +278,6 @@ fun createLoginContent(isEmpty: Boolean): VaultItemState.ViewState.Content.ItemT periodSeconds = 30, timeLeftSeconds = 15, verificationCode = "123456", - totpCode = "testCode", ) .takeUnless { isEmpty }, fido2CredentialCreationDateText = R.string.created_x diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/verificationcode/util/VerificationCodeDataUtil.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/verificationcode/util/VerificationCodeDataUtil.kt index ba8fbe4014..8b0b980b71 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/verificationcode/util/VerificationCodeDataUtil.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/verificationcode/util/VerificationCodeDataUtil.kt @@ -6,7 +6,6 @@ import com.x8bit.bitwarden.data.vault.manager.model.VerificationCodeItem fun createVerificationCodeItem(number: Int = 1) = VerificationCodeItem( code = "123456", - totpCode = "mockTotp-$number", periodSeconds = 30, id = "mockId-$number", issueTime = 1698408000000, From 44aae70fe49f7a62c5552872f4daf3425f8df3c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Bispo?= Date: Thu, 17 Jul 2025 19:27:10 +0100 Subject: [PATCH 09/12] [PM-23314] Enforce HTTPS (#5533) --- .../debug/res/xml/network_security_config.xml | 27 +++++++++++++++++++ .../main/res/xml/network_security_config.xml | 4 +-- 2 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 app/src/debug/res/xml/network_security_config.xml diff --git a/app/src/debug/res/xml/network_security_config.xml b/app/src/debug/res/xml/network_security_config.xml new file mode 100644 index 0000000000..53a4b88f21 --- /dev/null +++ b/app/src/debug/res/xml/network_security_config.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + bitwarden.com + bitwarden.eu + bitwarden.pw + + + + + + + diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml index 53a4b88f21..3e49bd3da6 100644 --- a/app/src/main/res/xml/network_security_config.xml +++ b/app/src/main/res/xml/network_security_config.xml @@ -1,9 +1,7 @@ - + From 9995fa92f13a012ca817a37d923a4456c1c43de3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Gon=C3=A7alves?= Date: Thu, 17 Jul 2025 19:39:55 +0100 Subject: [PATCH 10/12] [PM-23871] Update Bitwarden SDK (#5537) --- .../AuthenticatorBridgeRepositoryImpl.kt | 1 + .../vault/manager/VaultLockManagerImpl.kt | 1 + .../AuthenticatorBridgeRepositoryTest.kt | 8 ++++++++ .../vault/manager/VaultLockManagerTest.kt | 19 +++++++++++++++++++ gradle/libs.versions.toml | 2 +- 5 files changed, 30 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/repository/AuthenticatorBridgeRepositoryImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/repository/AuthenticatorBridgeRepositoryImpl.kt index fcb5bf2bd4..82518ded52 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/repository/AuthenticatorBridgeRepositoryImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/repository/AuthenticatorBridgeRepositoryImpl.kt @@ -141,6 +141,7 @@ class AuthenticatorBridgeRepositoryImpl( decryptedUserKey = decryptedUserKey, ), signingKey = null, + securityState = null, ), ) .flatMap { result -> diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerImpl.kt index 54d7fee5b7..1938450278 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerImpl.kt @@ -183,6 +183,7 @@ class VaultLockManagerImpl( method = initUserCryptoMethod, userId = userId, signingKey = null, + securityState = null, ), ) .flatMap { result -> diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/repository/AuthenticatorBridgeRepositoryTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/repository/AuthenticatorBridgeRepositoryTest.kt index 3368c8ee24..99a0ff2a34 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/repository/AuthenticatorBridgeRepositoryTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/repository/AuthenticatorBridgeRepositoryTest.kt @@ -94,6 +94,7 @@ class AuthenticatorBridgeRepositoryTest { decryptedUserKey = USER_1_UNLOCK_KEY, ), signingKey = null, + securityState = null, ), ) } returns InitializeCryptoResult.Success.asSuccess() @@ -109,6 +110,7 @@ class AuthenticatorBridgeRepositoryTest { decryptedUserKey = USER_2_UNLOCK_KEY, ), signingKey = null, + securityState = null, ), ) } returns InitializeCryptoResult.Success.asSuccess() @@ -206,6 +208,7 @@ class AuthenticatorBridgeRepositoryTest { decryptedUserKey = USER_2_UNLOCK_KEY, ), signingKey = null, + securityState = null, ), ) scopedVaultSdkSource.initializeOrganizationCrypto( @@ -244,6 +247,7 @@ class AuthenticatorBridgeRepositoryTest { decryptedUserKey = USER_1_UNLOCK_KEY, ), signingKey = null, + securityState = null, ), ) scopedVaultSdkSource.initializeOrganizationCrypto( @@ -266,6 +270,7 @@ class AuthenticatorBridgeRepositoryTest { decryptedUserKey = USER_2_UNLOCK_KEY, ), signingKey = null, + securityState = null, ), ) scopedVaultSdkSource.initializeOrganizationCrypto( @@ -300,6 +305,7 @@ class AuthenticatorBridgeRepositoryTest { decryptedUserKey = USER_1_UNLOCK_KEY, ), signingKey = null, + securityState = null, ), ) } returns InitializeCryptoResult.AuthenticationError(error = Throwable()).asSuccess() @@ -321,6 +327,7 @@ class AuthenticatorBridgeRepositoryTest { decryptedUserKey = USER_1_UNLOCK_KEY, ), signingKey = null, + securityState = null, ), ) scopedVaultSdkSource.initializeCrypto( @@ -334,6 +341,7 @@ class AuthenticatorBridgeRepositoryTest { decryptedUserKey = USER_2_UNLOCK_KEY, ), signingKey = null, + securityState = null, ), ) scopedVaultSdkSource.initializeOrganizationCrypto( diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerTest.kt index 8005c480a4..62dabc134f 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerTest.kt @@ -749,6 +749,7 @@ class VaultLockManagerTest { decryptedUserKey = userAutoUnlockKey, ), signingKey = null, + securityState = null, ), ) } returns InitializeCryptoResult.Success.asSuccess() @@ -774,6 +775,7 @@ class VaultLockManagerTest { decryptedUserKey = userAutoUnlockKey, ), signingKey = null, + securityState = null, ), ) trustedDeviceManager.trustThisDeviceIfNecessary(userId = USER_ID) @@ -907,6 +909,7 @@ class VaultLockManagerTest { userKey = userKey, ), signingKey = null, + securityState = null, ), ) } returns InitializeCryptoResult.Success.asSuccess() @@ -973,6 +976,7 @@ class VaultLockManagerTest { userKey = userKey, ), signingKey = null, + securityState = null, ), ) vaultSdkSource.initializeOrganizationCrypto( @@ -1007,6 +1011,7 @@ class VaultLockManagerTest { userKey = userKey, ), signingKey = null, + securityState = null, ), ) } returns InitializeCryptoResult.Success.asSuccess() @@ -1084,6 +1089,7 @@ class VaultLockManagerTest { userKey = userKey, ), signingKey = null, + securityState = null, ), ) vaultSdkSource.initializeOrganizationCrypto( @@ -1119,6 +1125,7 @@ class VaultLockManagerTest { userKey = userKey, ), signingKey = null, + securityState = null, ), ) } returns InitializeCryptoResult.AuthenticationError(error = error).asSuccess() @@ -1166,6 +1173,7 @@ class VaultLockManagerTest { userKey = userKey, ), signingKey = null, + securityState = null, ), ) } @@ -1194,6 +1202,7 @@ class VaultLockManagerTest { userKey = userKey, ), signingKey = null, + securityState = null, ), ) } returns InitializeCryptoResult.Success.asSuccess() @@ -1248,6 +1257,7 @@ class VaultLockManagerTest { userKey = userKey, ), signingKey = null, + securityState = null, ), ) } @@ -1283,6 +1293,7 @@ class VaultLockManagerTest { userKey = userKey, ), signingKey = null, + securityState = null, ), ) } returns error.asFailure() @@ -1329,6 +1340,7 @@ class VaultLockManagerTest { userKey = userKey, ), signingKey = null, + securityState = null, ), ) } @@ -1357,6 +1369,7 @@ class VaultLockManagerTest { userKey = userKey, ), signingKey = null, + securityState = null, ), ) } returns InitializeCryptoResult.Success.asSuccess() @@ -1410,6 +1423,7 @@ class VaultLockManagerTest { userKey = userKey, ), signingKey = null, + securityState = null, ), ) } @@ -1444,6 +1458,7 @@ class VaultLockManagerTest { userKey = userKey, ), signingKey = null, + securityState = null, ), ) } returns InitializeCryptoResult.Success.asSuccess() @@ -1504,6 +1519,7 @@ class VaultLockManagerTest { userKey = userKey, ), signingKey = null, + securityState = null, ), ) } @@ -1630,6 +1646,7 @@ class VaultLockManagerTest { userKey = userKey, ), signingKey = null, + securityState = null, ), ) } coAnswers { @@ -1677,6 +1694,7 @@ class VaultLockManagerTest { userKey = userKey, ), signingKey = null, + securityState = null, ), ) } returns InitializeCryptoResult.Success.asSuccess() @@ -1713,6 +1731,7 @@ class VaultLockManagerTest { userKey = userKey, ), signingKey = null, + securityState = null, ), ) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d70b287455..823a92a093 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -25,7 +25,7 @@ androidxRoom = "2.7.2" androidxSecurityCrypto = "1.1.0-beta01" androidxSplash = "1.1.0-rc01" androidxWork = "2.10.2" -bitwardenSdk = "1.0.0-20250708.105256-238" +bitwardenSdk = "1.0.0-20250715.111352-243" crashlytics = "3.0.4" detekt = "1.23.8" firebaseBom = "33.16.0" From b5cd0c9d9d37fe106fa06347b982380716527863 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Fri, 18 Jul 2025 08:42:22 -0400 Subject: [PATCH 11/12] Crowdin Pull - Password Manager (#5542) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- app/src/main/res/values-af-rZA/strings.xml | 2 +- app/src/main/res/values-ar-rSA/strings.xml | 2 +- app/src/main/res/values-az-rAZ/strings.xml | 2 +- app/src/main/res/values-be-rBY/strings.xml | 2 +- app/src/main/res/values-bg-rBG/strings.xml | 2 +- app/src/main/res/values-bn-rBD/strings.xml | 2 +- app/src/main/res/values-bs-rBA/strings.xml | 2 +- app/src/main/res/values-ca-rES/strings.xml | 2 +- app/src/main/res/values-cs-rCZ/strings.xml | 2 +- app/src/main/res/values-cy-rGB/strings.xml | 2 +- app/src/main/res/values-da-rDK/strings.xml | 2 +- app/src/main/res/values-de-rDE/strings.xml | 2 +- app/src/main/res/values-el-rGR/strings.xml | 2 +- app/src/main/res/values-en-rGB/strings.xml | 2 +- app/src/main/res/values-en-rIN/strings.xml | 2 +- app/src/main/res/values-es-rES/strings.xml | 2 +- app/src/main/res/values-et-rEE/strings.xml | 2 +- app/src/main/res/values-eu-rES/strings.xml | 2 +- app/src/main/res/values-fa-rIR/strings.xml | 2 +- app/src/main/res/values-fi-rFI/strings.xml | 2 +- app/src/main/res/values-fil-rPH/strings.xml | 2 +- app/src/main/res/values-fr-rFR/strings.xml | 6 +- app/src/main/res/values-gl-rES/strings.xml | 2 +- app/src/main/res/values-hi-rIN/strings.xml | 2 +- app/src/main/res/values-hr-rHR/strings.xml | 2 +- app/src/main/res/values-hu-rHU/strings.xml | 2 +- app/src/main/res/values-in-rID/strings.xml | 2 +- app/src/main/res/values-it-rIT/strings.xml | 114 +++--- app/src/main/res/values-iw-rIL/strings.xml | 2 +- app/src/main/res/values-ja-rJP/strings.xml | 2 +- app/src/main/res/values-ka-rGE/strings.xml | 2 +- app/src/main/res/values-kn-rIN/strings.xml | 2 +- app/src/main/res/values-ko-rKR/strings.xml | 2 +- app/src/main/res/values-lt-rLT/strings.xml | 2 +- app/src/main/res/values-lv-rLV/strings.xml | 2 +- app/src/main/res/values-ml-rIN/strings.xml | 2 +- app/src/main/res/values-mr-rIN/strings.xml | 2 +- app/src/main/res/values-my-rMM/strings.xml | 2 +- app/src/main/res/values-nb-rNO/strings.xml | 2 +- app/src/main/res/values-ne-rNP/strings.xml | 2 +- app/src/main/res/values-nl-rNL/strings.xml | 2 +- app/src/main/res/values-nn-rNO/strings.xml | 2 +- app/src/main/res/values-or-rIN/strings.xml | 2 +- app/src/main/res/values-pl-rPL/strings.xml | 18 +- app/src/main/res/values-pt-rBR/strings.xml | 2 +- app/src/main/res/values-pt-rPT/strings.xml | 2 +- app/src/main/res/values-ro-rRO/strings.xml | 2 +- app/src/main/res/values-ru-rRU/strings.xml | 2 +- app/src/main/res/values-si-rLK/strings.xml | 2 +- app/src/main/res/values-sk-rSK/strings.xml | 2 +- app/src/main/res/values-sl-rSI/strings.xml | 2 +- app/src/main/res/values-sr-rSP/strings.xml | 2 +- app/src/main/res/values-sv-rSE/strings.xml | 384 ++++++++++---------- app/src/main/res/values-ta-rIN/strings.xml | 2 +- app/src/main/res/values-te-rIN/strings.xml | 2 +- app/src/main/res/values-th-rTH/strings.xml | 2 +- app/src/main/res/values-tr-rTR/strings.xml | 2 +- app/src/main/res/values-uk-rUA/strings.xml | 2 +- app/src/main/res/values-vi-rVN/strings.xml | 54 +-- app/src/main/res/values-zh-rCN/strings.xml | 4 +- app/src/main/res/values-zh-rTW/strings.xml | 2 +- 61 files changed, 345 insertions(+), 345 deletions(-) diff --git a/app/src/main/res/values-af-rZA/strings.xml b/app/src/main/res/values-af-rZA/strings.xml index a69d040178..ffa550912c 100644 --- a/app/src/main/res/values-af-rZA/strings.xml +++ b/app/src/main/res/values-af-rZA/strings.xml @@ -170,7 +170,7 @@ Waarmerktoep Voer die 6-syferbevestigingskode van u waarmerktoep in. Voer die 6-syferbevestigingskode in wat aan %1$s gestuur is. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Terugstelkode Remember Remember email diff --git a/app/src/main/res/values-ar-rSA/strings.xml b/app/src/main/res/values-ar-rSA/strings.xml index d9f2e8313c..7c18e66d4e 100644 --- a/app/src/main/res/values-ar-rSA/strings.xml +++ b/app/src/main/res/values-ar-rSA/strings.xml @@ -170,7 +170,7 @@ تطبيق المُصادَقة أدخل رمز التحقق من 6 أرقام من تطبيق المصادقة الخاص بك. أدخل رمز التحقق المكون من 6 أرقام الذي تم ارساله إلى %1$s. - نحن لا نعرف هذا الجهاز. أدخل رمز التحقق المكون من 8 أرقام الذي تم مراسلته بالبريد الإلكتروني إلى %1$s. + نحن لا نعرف هذا الجهاز. أدخل رمز التحقق المكون من 8 أرقام الذي تم مراسلته بالبريد الإلكتروني إلى [%1$s]. رمز الاسترداد تذكر تذكر البريد الإلكتروني diff --git a/app/src/main/res/values-az-rAZ/strings.xml b/app/src/main/res/values-az-rAZ/strings.xml index 0ccdbdfe04..e91f9dd404 100644 --- a/app/src/main/res/values-az-rAZ/strings.xml +++ b/app/src/main/res/values-az-rAZ/strings.xml @@ -170,7 +170,7 @@ Kimlik doğrulayıcı tətbiqi Kimlik doğrulayıcı tətbiqindən 6 rəqəmli doğrulama kodunu daxil edin. %1$s ünvanına göndərilən e-poçtdakı 6 rəqəmli doğrulama kodunu daxil edin. - Bu cihazı tanımırıq. %1$s ünvanına göndərilən 8 rəqəmli doğrulama kodunu daxil edin. + Bu cihazı tanımırıq. [%1$s] ünvanına göndərilən 8 rəqəmli doğrulama kodunu daxil edin. Bərpa kodu Xatırla E-poçtu xatırla diff --git a/app/src/main/res/values-be-rBY/strings.xml b/app/src/main/res/values-be-rBY/strings.xml index 0a17011054..e3ac55d8ba 100644 --- a/app/src/main/res/values-be-rBY/strings.xml +++ b/app/src/main/res/values-be-rBY/strings.xml @@ -170,7 +170,7 @@ Праграма аўтэнтыфікацыі Увядзіце 6 лічбаў праверачнага кода з вашай праграмы аўтэнтыфікацыі. Увядзіце 6 лічбаў праверачнага кода, які быў адпраўлены на %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Код аднаўлення Remember Remember email diff --git a/app/src/main/res/values-bg-rBG/strings.xml b/app/src/main/res/values-bg-rBG/strings.xml index ca721cbcb1..5d268ab68e 100644 --- a/app/src/main/res/values-bg-rBG/strings.xml +++ b/app/src/main/res/values-bg-rBG/strings.xml @@ -170,7 +170,7 @@ Приложение за удостоверяване Въведете шестцифрения код за потвърждение от приложението за удостоверяване. Въведете шестцифрения код за потвърждение, който е бил изпратен на %1$s. - Това устройство е непознато. Въведете 8-цифрения код за потвърждаване, който беше изпратен на %1$s. + Това устройство е непознато. Въведете 8-цифрения код за потвърждаване, който беше изпратен на [%1$s]. Код за възстановяване Запомняне Запомняне на е-пощата diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index 1be1bf711d..6e449d4613 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -170,7 +170,7 @@ Authenticator app Enter the 6 digit verification code from your authenticator app. Enter the 6 digit verification code that was emailed to %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. পুনরুদ্ধার কোড Remember Remember email diff --git a/app/src/main/res/values-bs-rBA/strings.xml b/app/src/main/res/values-bs-rBA/strings.xml index e018a944c0..14875a6f29 100644 --- a/app/src/main/res/values-bs-rBA/strings.xml +++ b/app/src/main/res/values-bs-rBA/strings.xml @@ -170,7 +170,7 @@ Aplikacije za potvrdu autentičnosti Unesite 6-ocifreni verifikacioni kod iz Vaše aplikacije za potvrdu autentičnosti. Unesite 6-ocifreni verifikacioni kod koji je e-poštom poslan na %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Kod za oporavak Remember Remember email diff --git a/app/src/main/res/values-ca-rES/strings.xml b/app/src/main/res/values-ca-rES/strings.xml index 245bd4134a..5adf40717e 100644 --- a/app/src/main/res/values-ca-rES/strings.xml +++ b/app/src/main/res/values-ca-rES/strings.xml @@ -170,7 +170,7 @@ Aplicació autenticadora Introduïu el codi de verificació de 6 dígits de l\'aplicació autenticadora. Introduïu el codi de verificació de 6 dígits que s\'ha enviat per correu electrònic a %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Codi de recuperació Recorda-ho Recorda el correu electronic diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index 7e659aae94..afe008605e 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -170,7 +170,7 @@ Ověřovací aplikace Zadejte 6místný kód z ověřovací aplikace. Zadejte 6místný kód z e-mailu, který byl zaslán na %1$s. - Toto zařízení nelze rozpoznat. Zadejte osmimístný ověřovací kód, který byl zaslán e-mailem na %1$s. + Toto zařízení nepoznáváme. Zadejte kód zaslaný na Váš e-mail pro ověření Vaší totožnosti. Kód pro obnovení Zapamatovat Pamatovat si e-mail diff --git a/app/src/main/res/values-cy-rGB/strings.xml b/app/src/main/res/values-cy-rGB/strings.xml index ae1a1548e6..651cf49785 100644 --- a/app/src/main/res/values-cy-rGB/strings.xml +++ b/app/src/main/res/values-cy-rGB/strings.xml @@ -170,7 +170,7 @@ Ap dilysu Rhowch y cod dilysu 6 nod o\'ch ap dilysu. Rhowch y cod dilysu 6 nod anfonwyd i %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Cod adfer Remember Remember email diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index 02a37e5238..9ec53b9901 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -170,7 +170,7 @@ Godkender-app Angiv den 6-cifrede bekræftelseskode fra godkender-appen. Angiv den 6-cifrede bekræftelseskode e-mailet til %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Gendannelseskode Husk Husk e-mail diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index 60a642118a..5c84871fb4 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -170,7 +170,7 @@ Authenticator App Gib den 6-stelligen Verifizierungscode aus deiner Authenticator App ein. Gib den 6-stelligen Bestätigungscode ein, der an %1$s gesendet wurde. - Wir erkennen dieses Gerät nicht. Gib den 8-stelligen Verifizierungscode ein, der an %1$s gesendet wurde. + Wir erkennen dieses Gerät nicht. Gib den 8-stelligen Verifizierungscode ein, der an [%1$s] gesendet wurde. Wiederherstellungscode Merken E-Mail-Adresse merken diff --git a/app/src/main/res/values-el-rGR/strings.xml b/app/src/main/res/values-el-rGR/strings.xml index b20747f05c..a1aaf45dee 100644 --- a/app/src/main/res/values-el-rGR/strings.xml +++ b/app/src/main/res/values-el-rGR/strings.xml @@ -170,7 +170,7 @@ Εφαρμογή αυθεντικοποίησης Εισάγετε τον 6ψήφιο κωδικό από την εφαρμογή επαλήθευσης. Εισαγωγή 6ψήφιου κωδικού επαλήθευσης που σταλθηκε με μήνυμα στο %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Κωδικός ανάκτησης Απομνημόνευση Απομνημόνευση email diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 12375eb3d0..8c85af8fe3 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -170,7 +170,7 @@ Authenticator app Enter the 6 digit verification code from your authenticator app. Enter the 6 digit verification code that was emailed to %1$s. - We don\'t recognise this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognise this device. Enter the 8 digit verification code that was emailed to [%1$s]. Recovery code Remember Remember email diff --git a/app/src/main/res/values-en-rIN/strings.xml b/app/src/main/res/values-en-rIN/strings.xml index 82f6a44fca..14a16266d8 100644 --- a/app/src/main/res/values-en-rIN/strings.xml +++ b/app/src/main/res/values-en-rIN/strings.xml @@ -170,7 +170,7 @@ Authenticator app Enter the 6 digit verification code from your authenticator app. Enter the 6 digit verification code that was emailed to %1$s. - We don\'t recognise this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognise this device. Enter the 8 digit verification code that was emailed to [%1$s]. Recovery code Remember Remember email diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index bf16e2a9f8..d7023583f4 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -170,7 +170,7 @@ Aplicación de autenticación Introduce el código de verificación de 6 dígitos de tu aplicación autenticadora. Introduce el código de verificación de 6 dígitos que ha sido enviado por correo a %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Código de recuperación Recordar Recordar correo electrónico diff --git a/app/src/main/res/values-et-rEE/strings.xml b/app/src/main/res/values-et-rEE/strings.xml index 42287d55b7..20e67ada39 100644 --- a/app/src/main/res/values-et-rEE/strings.xml +++ b/app/src/main/res/values-et-rEE/strings.xml @@ -170,7 +170,7 @@ Autentimise rakendus Sisesta autentimise rakendusest 6 kohaline number. Sisesta 6 kohaline number, mis saadeti e-posti aadressile %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Taastamise kood Remember Remember email diff --git a/app/src/main/res/values-eu-rES/strings.xml b/app/src/main/res/values-eu-rES/strings.xml index 5d3846e24b..b57c7f248f 100644 --- a/app/src/main/res/values-eu-rES/strings.xml +++ b/app/src/main/res/values-eu-rES/strings.xml @@ -170,7 +170,7 @@ Autentifikazio aplikazioa Sartu zure autentifikazio aplikazioaren 6 digituko egiaztatze-kodea. Sartu %1$s-era bidalitako 6 digituko egiaztatze-kodea. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Berreskuratze-kodea Remember Remember email diff --git a/app/src/main/res/values-fa-rIR/strings.xml b/app/src/main/res/values-fa-rIR/strings.xml index cf9e78740a..b8ac815040 100644 --- a/app/src/main/res/values-fa-rIR/strings.xml +++ b/app/src/main/res/values-fa-rIR/strings.xml @@ -170,7 +170,7 @@ برنامه احراز هویت کد ۶ رقمی تأیید را از برنامه احراز هویت وارد کنید. کد ۶ رقمی تأیید را که به %1$s ایمیل شده را وارد کنید. - ما این دستگاه را نمی‌شناسیم. کد تأیید 8 رقمی را که به %1$s ایمیل شده است، وارد کنید. + ما این دستگاه را نمی‌شناسیم. کد تأیید 8 رقمی را که به [%1$s] ایمیل شده است، وارد کنید. کد بازیابی به خاطر بسپار ایمیل را به خاطر بسپار diff --git a/app/src/main/res/values-fi-rFI/strings.xml b/app/src/main/res/values-fi-rFI/strings.xml index 7c102ba745..c48bb82d01 100644 --- a/app/src/main/res/values-fi-rFI/strings.xml +++ b/app/src/main/res/values-fi-rFI/strings.xml @@ -170,7 +170,7 @@ Todennussovellus Syötä todennussovelluksesi näyttämä kuusinumeroinen todennuskoodi. Syötä osoitteeseen %1$s lähetetty kuusinumeroinen todennuskoodi. - Laitetta ei tunnisteta. Syötä osoitteeseen %1$s lähetetty kahdeksan numeroinen vahvistuskoodi. + Laitetta ei tunnisteta. Syötä osoitteeseen [%1$s] lähetetty kahdeksan numeroinen vahvistuskoodi. Palautuskoodi Muista Muista sähköpostiosoite diff --git a/app/src/main/res/values-fil-rPH/strings.xml b/app/src/main/res/values-fil-rPH/strings.xml index dca271d89e..252cd60823 100644 --- a/app/src/main/res/values-fil-rPH/strings.xml +++ b/app/src/main/res/values-fil-rPH/strings.xml @@ -170,7 +170,7 @@ Authenticator app Ilagay ang 6 na numerong code pamberipika mula sa authenticator app mo. Ilagay ang 6 na numerong code pamberipikang in-email sa %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Code pang-recover Remember Remember email diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml index b1e88404ab..5b9fdd5591 100644 --- a/app/src/main/res/values-fr-rFR/strings.xml +++ b/app/src/main/res/values-fr-rFR/strings.xml @@ -170,7 +170,7 @@ Application d\'authentification Saisissez le code de vérification à 6 chiffres depuis votre application d\'authentification. Saisissez le code de vérification à 6 chiffres qui a été envoyé par courriel à %1$s. - Nous ne reconnaissons pas cet appareil. Entrez le code de vérification à 8 chiffres qui a été envoyé à %1$s. + Nous ne reconnaissons pas cet appareil. Entrez le code de vérification à 8 chiffres qui a été envoyé à [%1$s]. Code de récupération Remember Se souvenir de l\'e-mail @@ -567,7 +567,7 @@ sélectionnez « Ajouter un TOTP » pour stocker la clé en toute sécuritéCourriel (requis) domain name Nom de domaine (requis) - API key + Clé API Clé API (requise) Service addy.io @@ -576,7 +576,7 @@ sélectionnez « Ajouter un TOTP » pour stocker la clé en toute sécuritéDuckDuckGo Fastmail ForwardEmail - API access token (required) + Jeton d’accès API (requis) Jeton d\'accès API Êtes-vous sûr(e) de vouloir remplacer le nom d\'utilisateur actuel ? Générer un nom d\'utilisateur diff --git a/app/src/main/res/values-gl-rES/strings.xml b/app/src/main/res/values-gl-rES/strings.xml index c25dc1093a..2624581374 100644 --- a/app/src/main/res/values-gl-rES/strings.xml +++ b/app/src/main/res/values-gl-rES/strings.xml @@ -170,7 +170,7 @@ Aplicación de autenticación Insire o código de 6 díxitos da túa aplicación de autenticación. Insire o código de verificación de 6 díxitos enviado a %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Código de recuperación Lembrar Lembrar correo diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index fd7747c828..e2ff501730 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -170,7 +170,7 @@ ऑथेंटिकेटर ऐप अपने ऑथेंटिकेटर ऐप से वेरिफिकेशन कोड डालें। %1$s को ईमेल किया गया वेरिफिकेशन कोड डालें। - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. रिकवरी कोड Remember Remember email diff --git a/app/src/main/res/values-hr-rHR/strings.xml b/app/src/main/res/values-hr-rHR/strings.xml index 0f59091287..0ed4325b2e 100644 --- a/app/src/main/res/values-hr-rHR/strings.xml +++ b/app/src/main/res/values-hr-rHR/strings.xml @@ -170,7 +170,7 @@ Autentifikatorska aplikacija Unesi 6-znamenkasti kôd za provjeru iz autentifikatorske aplikacije. Unesi 6-znamenkasti kôd za provjeru poslan e-poštom na %1$s - Ne prepoznajemo ovaj uređaj. Unesi 8-znamenkasti kôd za provjeru poslan e-poštom na %1$s. + Ne prepoznajemo ovaj uređaj. Unesi 8-znamenkasti kôd za provjeru poslan e-poštom na [%1$s]. Kôd za oporavak Zapamti Zapamti adresu e-pošte diff --git a/app/src/main/res/values-hu-rHU/strings.xml b/app/src/main/res/values-hu-rHU/strings.xml index 63898438ec..dae1c9e174 100644 --- a/app/src/main/res/values-hu-rHU/strings.xml +++ b/app/src/main/res/values-hu-rHU/strings.xml @@ -170,7 +170,7 @@ Hitelesítő alkalmazás Add meg a 6 számjegyű ellenőrző kódot a hitelesítő alkalmazásodból. 6 számjegyű ellenőrző kód megadása, ami %1$s e-mail címre lett küldve. - Nem ismerhető fel ez az eszköz. Írjuk be a 8 számjegyű ellenőrző kódot, amelyet emailben lett elküldve %1$s email címre. + Nem ismerhető fel ez az eszköz. Írjuk be a 8 számjegyű ellenőrző kódot, amelyet emailben lett elküldve [%1$s] email címre. Helyreállító kód Megjegyzés Email cím megjegyzése diff --git a/app/src/main/res/values-in-rID/strings.xml b/app/src/main/res/values-in-rID/strings.xml index d1d407beb4..1f4701c600 100644 --- a/app/src/main/res/values-in-rID/strings.xml +++ b/app/src/main/res/values-in-rID/strings.xml @@ -170,7 +170,7 @@ Aplikasi Autentikasi Masukkan 6 digit kode verifikasi dari aplikasi autentikasi Anda. Masukkan 6 digit kode verifikasi yang dikirim melalui email ke %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Kode Pemulihan Remember Remember email diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index 8a0e4f5481..c324722cb9 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -170,7 +170,7 @@ App di autenticazione Inserisci il codice di verifica a 6 cifre dell\'app di autenticazione Inserisci il codice di verifica a 6 cifre inviato a %1$s - Dispositivo non riconosciuto. Inserisci il codice di verifica a 8 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 l\'indirizzo email @@ -356,117 +356,117 @@ La scansione è automatica. 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. + Scegli il metodo predefinito con cui viene rilevata la corrispondenza tra l\'URL di un sito web e quello salvato in un login Tema - Cambia il tema dell\'app. + Cambia il tema dell\'applicazione Copia le note Chiudi Vuoi davvero chiudere Bitwarden? - Richiedi la password principale al riavvio dell\'app? + Richiedi la password principale dopo il riavvio Vuoi richiedere lo sblocco con la password principale quando l\'app viene riavviata? - Chiedi di aggiungere nuovi login - Chiedi di aggiungere un nuovo elemento se non ce n\'è uno nella tua cassaforte. - Al riavvio dell\'app + Proposta per nuovi login + Proponi di aggiungere un login quando non è presente nella cassaforte + Dopo il riavvio dell\'app Iniziale maiuscola - Include un numero + Numero casuale Scarica - La tua sessione è scaduta. + Sessione scaduta Autenticazione biometrica Biometria Autenticazione biometrica fallita - Effettua l\'accesso con la tua parola d\'accesso principale o il PIN e riabilita l\'accesso biometrico nelle impostazioni. + Effettua l\'accesso con la password principale o il codice PIN. Puoi riabilitare l\'autenticazione biometrica nelle impostazioni. Sblocca con la biometria - Formato file - Inserisci la tua password principale per esportare i dati della tua cassaforte. - Invia un codice di verifica alla tua email - Codice inviato! - Conferma la tua identità per continuare. - Questa esportazione contiene i dati della tua cassaforte in un formato non crittografato. Non salvare o inviare il file esportato attraverso canali non protetti (come le email). Eliminalo immediatamente dopo l\'utilizzo. - Questo file esportato sarà protetto e richiederà la password del file per decifrarlo. - Conferma l\'esportazione della cassaforte + Formato del file + Inserisci la password principale dell\'account Bitwarden + Invia un codice di verifica all\'indirizzo email + Codice inviato + Conferma la tua identità per continuare + Questa esportazione contiene i dati della cassaforte in un formato non crittografato. Non salvare, inviare o condividere il file esportato tramite mezzi non protetti (come le email). Elimina il file il prima possibile. + Questa esportazione contiene i dati della cassaforte in un formato crittografato. Sarà necessario inserire la password del file per decrittografarlo. + Esporta la cassaforte Avviso - Si è verificato un problema esportando la tua cassaforte. Se il problema persiste, esportala dalla cassaforte web. + Esportazione della cassaforte non riuscita. Prova a esportare la cassaforte dall\'app web. Cassaforte esportata Copia - Una o più politiche dell\'organizzazione stanno influenzando le impostazioni del tuo generatore - Si è verificato un problema salvando questo allegato. Se il problema persiste, prova a salvarlo dalla cassaforte web. + Il generatore di password è limitato dalle politiche dell\'organizzazione + Salvataggio dell\'allegato non riuscito. Prova a salvare l\'allegato dall\'app web. Allegato salvato - Abilita il \"Servizio di accessibilità per il riempimento automatico\" dalle impostazioni di Bitwarden per usare il pop-up di riempimento automatico. + Abilita il servizio di accessibilità per il riempimento automatico dalle impostazioni di Bitwarden per usare il popup di riempimento automatico Nessun campo password rilevato - Eliminazione in corso... + Eliminazione in corso Elemento eliminato Ripristina - Ripristino in corso... + Ripristino in corso Elemento ripristinato Cestino - Vuoi davvero eliminare definitivamente questo elemento? L\'azione non può essere annullata. + Vuoi davvero eliminare definitivamente questo elemento? Questa azione non può essere annullata. Vuoi davvero ripristinare questo elemento? Vuoi davvero eliminare questo elemento? - Sblocco biometrico per questo account disabilitato in attesa della verifica della password principale. + Sblocco biometrico bloccato. Conferma della password principale necessaria. Gesto di sincronizzazione - Sincronizza la cassaforte trascinando verso il basso. + Sincronizza la cassaforte quando scorri verso il basso. Single Sign-On aziendale - Effettua l\'accesso velocemente con il portale di accesso (SSO) della tua organizzazione. Inserisci l\'identificativo dell\'organizzazione per iniziare. + Effettua l\'accesso velocemente con il portale di accesso SSO dell\'organizzazione. Inserisci l\'identificativo dell\'organizzazione per iniziare. Identificativo dell\'organizzazione - Al momento è impossibile effettuare l\'accesso con SSO - Imposta password principale - Una o più politiche dell\'organizzazione richiedono che la tua password principale soddisfi questi requisiti: + Accesso con SSO non riuscito + Imposta la password principale + Le politiche dell\'organizzazione richiedono che la password principale soddisfi questi requisiti: Punteggio minimo di complessità: %1$s - Lunghezza minima di %1$s + Lunghezza minima: %1$s Contiene almeno un carattere maiuscolo Contiene almeno un carattere minuscolo - Contiene uno o più numeri + Contiene almeno un numero Contiene almeno uno dei seguenti caratteri speciali: %1$s - Inserisci una password valida - La password non soddisfa i requisiti dell\'organizzazione. Controlla i criteri password dell\'organizzazione e riprova. - Caricamento in corso... + Password non valida + La password non soddisfa i requisiti dell\'organizzazione. Controlla i requisiti e prova con un\'altra password. + Caricamento in corso Accetta i Termini di Servizio e l\'Informativa sulla Privacy Termini di Servizio Informativa sulla Privacy Gestione delle passkey Servizi di riempimento automatico - Suggerimenti riempimento automatico + Suggerimenti per il 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à. + Le opzioni di proprietà sono limitate dalle politiche dell\'organizzazione Send - Invia dettagli + Dettagli del Send Tutti i Send Testo - Testo da condividere + Testo condiviso Testo Nascondi il testo per impostazione predefinita File Eliminazione programmata Orario - Il Send sarà eliminato definitivamente nella data e all\'ora specificate. - In attesa di eliminazione + Il Send verrà eliminato definitivamente dopo il periodo di tempo specificato + Eliminazione in attesa Scaduto Scade alle %s Scade domani Scade il %s - Ferma il tracciamento su %1$s a %2$s - Numero massimo di accessi - Il numero di accessi complessivi consentiti al Send. - Numero massimo di accessi raggiunto - Numero di accessi attuali - Password aggiuntiva - La password per accedere al Send (facoltativa). + Ferma il tracciamento il %1$s alle %2$s + Limite di accessi + Il Send verrà disabilitato al superamento del limite di accessi specificati (opzionale) + Limite di accessi raggiunto + Numero di accessi attuali: %s + Password del Send + Imposta la password necessaria per accedere al Send (opzionale) Rimuovi la password - Rimozione della password in corso... + Rimozione della password in corso Password rimossa - Aggiungi un Send + Crea un Send Copia il link - Condividi link + Condividi il link Link del Send - Cerca Send + Cerca nei Send Modifica il Send - Modifica file Send - Modifica testo Send - Nuovo file Send - Nuovo testo Send + Modifica il file Send + Modifica il testo Send + Crea un file Send + Crea un testo Send Vuoi davvero eliminare questo Send? Send eliminato Send aggiornato diff --git a/app/src/main/res/values-iw-rIL/strings.xml b/app/src/main/res/values-iw-rIL/strings.xml index 54170a69ef..448c7c2634 100644 --- a/app/src/main/res/values-iw-rIL/strings.xml +++ b/app/src/main/res/values-iw-rIL/strings.xml @@ -170,7 +170,7 @@ יישום מאמת הזן את קוד האימות בן 6 הספרות מהיישום המאמת שלך. הזן את קוד האימות בן 6 הספרות שנשלח בדוא\"ל אל %1$s. - אנחנו לא מזהים את המכשיר הזה. הזן את קוד האימות בן 8 הספרות שנשלח בדוא\"ל אל %1$s. + אנחנו לא מזהים את המכשיר הזה. הזן את קוד האימות בן 8 הספרות שנשלח בדוא\"ל אל [%1$s]. קוד שחזור זכור זכור דוא\"ל diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index a1d641d6da..0049a8cb10 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -170,7 +170,7 @@ 認証アプリ 認証アプリに表示された6桁の認証コードを入力してください。 %1$s に送信された6桁の認証コードを入力してください。 - このデバイスは未確認です。本人確認のため、 %1$s に送信されたメールに書かれている 8 桁の認証コードを入力してください。 + このデバイスは未確認です。本人確認のため、 [%1$s] に送信されたメールに書かれている 8 桁の認証コードを入力してください。 リカバリーコード ログイン状態を記憶 メールアドレスを記録 diff --git a/app/src/main/res/values-ka-rGE/strings.xml b/app/src/main/res/values-ka-rGE/strings.xml index 11f5cc8a41..4c24394b8a 100644 --- a/app/src/main/res/values-ka-rGE/strings.xml +++ b/app/src/main/res/values-ka-rGE/strings.xml @@ -170,7 +170,7 @@ Authenticator app Enter the 6 digit verification code from your authenticator app. Enter the 6 digit verification code that was emailed to %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Recovery code Remember Remember email diff --git a/app/src/main/res/values-kn-rIN/strings.xml b/app/src/main/res/values-kn-rIN/strings.xml index 4768d58f44..c17f0c09fc 100644 --- a/app/src/main/res/values-kn-rIN/strings.xml +++ b/app/src/main/res/values-kn-rIN/strings.xml @@ -170,7 +170,7 @@ ದೃಢೀಕರಣ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ದೃಢೀಕರಣ ಅಪ್ಲಿಕೇಶನ್‌ನಿಂದ 6 ಅಂಕಿಯ ಪರಿಶೀಲನಾ ಕೋಡ್ ಅನ್ನು ನಮೂದಿಸಿ. %1$s ಇಮೇಲ್ ಮಾಡಲಾದ 6 ಅಂಕಿಯ ಪರಿಶೀಲನಾ ಕೋಡ್ ಅನ್ನು ನಮೂದಿಸಿ. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. ಮರುಪಡೆಯುವಿಕೆ ಕೋಡ್ Remember Remember email diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 63e1f008a3..2e0d752291 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -170,7 +170,7 @@ 인증 앱 인증 앱에서 6자리 인증 코드를 입력하세요. %1$s 주소로 전송된 6자리 인증 코드를 입력하세요. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. 복구 코드 Remember Remember email diff --git a/app/src/main/res/values-lt-rLT/strings.xml b/app/src/main/res/values-lt-rLT/strings.xml index 9f41728d48..a736d6b02c 100644 --- a/app/src/main/res/values-lt-rLT/strings.xml +++ b/app/src/main/res/values-lt-rLT/strings.xml @@ -170,7 +170,7 @@ Autentifikavimo programa Įveskite 6 skaitmenų patvirtinimo kodą iš autentifikavimo programos. Įveskite 6 skaitmenų patvirtinimo kodą, kuris buvo išsiųstas el. paštu %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Atstatymo rėžimas Remember Remember email diff --git a/app/src/main/res/values-lv-rLV/strings.xml b/app/src/main/res/values-lv-rLV/strings.xml index 5ef24f8ecd..03b78062d1 100644 --- a/app/src/main/res/values-lv-rLV/strings.xml +++ b/app/src/main/res/values-lv-rLV/strings.xml @@ -170,7 +170,7 @@ Autentificētāja lietotne Jāievada 6 ciparu apliecinājuma kods no autentificētāja lietotnes. Jāievada 6 ciparu apliecinājuma kods, kas tika nosūtīts uz %1$s. - Mēs neatpazīstam šo ierīci. Jāievada 8 ciparu apliecinājuma kods, kas tika nosūtīts %1$s. + Mēs neatpazīstam šo ierīci. Jāievada 8 ciparu apliecinājuma kods, kas tika nosūtīts [%1$s]. Atgūšanas kods Atcerēties Atcerēties e-pasta adresi diff --git a/app/src/main/res/values-ml-rIN/strings.xml b/app/src/main/res/values-ml-rIN/strings.xml index 96616fd873..e0dd29260c 100644 --- a/app/src/main/res/values-ml-rIN/strings.xml +++ b/app/src/main/res/values-ml-rIN/strings.xml @@ -170,7 +170,7 @@ ഓതന്റിക്കേറ്റർ ആപ്പ് തങ്ങളുടെ ഓതന്റിക്കേറ്റർ അപ്ലിക്കേഷനിൽ നിന്ന് 6 അക്ക സ്ഥിരീകരണ കോഡ് നൽകുക. %1$sൽ ഇമെയിൽ ചെയ്ത 6 അക്ക സ്ഥിരീകരണ കോഡ് നൽകുക. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. റിക്കവറി കോഡ് Remember Remember email diff --git a/app/src/main/res/values-mr-rIN/strings.xml b/app/src/main/res/values-mr-rIN/strings.xml index 549141fed9..a3a87390f0 100644 --- a/app/src/main/res/values-mr-rIN/strings.xml +++ b/app/src/main/res/values-mr-rIN/strings.xml @@ -170,7 +170,7 @@ Authenticator app Enter the 6 digit verification code from your authenticator app. Enter the 6 digit verification code that was emailed to %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Recovery code Remember Remember email diff --git a/app/src/main/res/values-my-rMM/strings.xml b/app/src/main/res/values-my-rMM/strings.xml index 11f5cc8a41..4c24394b8a 100644 --- a/app/src/main/res/values-my-rMM/strings.xml +++ b/app/src/main/res/values-my-rMM/strings.xml @@ -170,7 +170,7 @@ Authenticator app Enter the 6 digit verification code from your authenticator app. Enter the 6 digit verification code that was emailed to %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Recovery code Remember Remember email diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 2376757f70..45fd326f77 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -170,7 +170,7 @@ Autentiseringsapp Skriv inn den 6-sifrede verifiseringskoden som står på din autentiseringsapp. Skriv inn den 6-sifrede verifiseringskoden som ble sendt til %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Gjenopprettingskode Husk Husk e-postadressen diff --git a/app/src/main/res/values-ne-rNP/strings.xml b/app/src/main/res/values-ne-rNP/strings.xml index 11f5cc8a41..4c24394b8a 100644 --- a/app/src/main/res/values-ne-rNP/strings.xml +++ b/app/src/main/res/values-ne-rNP/strings.xml @@ -170,7 +170,7 @@ Authenticator app Enter the 6 digit verification code from your authenticator app. Enter the 6 digit verification code that was emailed to %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Recovery code Remember Remember email diff --git a/app/src/main/res/values-nl-rNL/strings.xml b/app/src/main/res/values-nl-rNL/strings.xml index e1f24d8d66..6c174629ec 100644 --- a/app/src/main/res/values-nl-rNL/strings.xml +++ b/app/src/main/res/values-nl-rNL/strings.xml @@ -170,7 +170,7 @@ Authenticatie-app Voer de 6-cijferige verificatiecode uit je authenticatie-app in. Voer de 6-cijferige verificatiecode in die via e-mail is verstuurd naar %1$s. - We herkennen dit apparaat niet. Voer de 8-cijferige verificatiecode in die gemaild is naar %1$s. + We herkennen dit apparaat niet. Voer de 8-cijferige verificatiecode in die gemaild is naar [%1$s]. Herstelcode Onthouden E-mailadres onthouden diff --git a/app/src/main/res/values-nn-rNO/strings.xml b/app/src/main/res/values-nn-rNO/strings.xml index b0815a1931..2ca251be23 100644 --- a/app/src/main/res/values-nn-rNO/strings.xml +++ b/app/src/main/res/values-nn-rNO/strings.xml @@ -170,7 +170,7 @@ Authenticator app Enter the 6 digit verification code from your authenticator app. Enter the 6 digit verification code that was emailed to %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Gjenopprettingskode Remember Remember email diff --git a/app/src/main/res/values-or-rIN/strings.xml b/app/src/main/res/values-or-rIN/strings.xml index 6648d7806f..76904eb0fa 100644 --- a/app/src/main/res/values-or-rIN/strings.xml +++ b/app/src/main/res/values-or-rIN/strings.xml @@ -170,7 +170,7 @@ Authenticator app Enter the 6 digit verification code from your authenticator app. Enter the 6 digit verification code that was emailed to %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Recovery code Remember Remember email diff --git a/app/src/main/res/values-pl-rPL/strings.xml b/app/src/main/res/values-pl-rPL/strings.xml index d7d2bc6643..44d5c52e3e 100644 --- a/app/src/main/res/values-pl-rPL/strings.xml +++ b/app/src/main/res/values-pl-rPL/strings.xml @@ -170,7 +170,7 @@ Aplikacja uwierzytelniająca Wpisz 6-cyfrowy kod weryfikacyjny z aplikacji uwierzytelniającej. Wpisz 6-cyfrowy kod weryfikacyjny wysłany na adres %1$s. - Nie rozpoznajemy tego urządzenia. Wpisz 8-cyfrowy kod weryfikacyjny, który został wysłany na adres %1$s. + Nie rozpoznajemy tego urządzenia. Wpisz 8-cyfrowy kod weryfikacyjny, który został wysłany na adres [%1$s]. Kod odzyskiwania Zapamiętaj Zapamiętaj adres e-mail @@ -496,10 +496,10 @@ Skanowanie nastąpi automatycznie. Uwierzytelnianie WebAuthn Wróć do aplikacji Zasada organizacji umożliwia administratorom organizacji zmianę Twojego hasła głównego. - Zasady organizacji mają wpływ na czas blokowania aplikacji. Maksymalny dozwolony czas wynosi %1$s godz. i %2$s min. - Zasady organizacji mają wpływ na czas blokowania aplikacji. Maksymalny dozwolony czas wynosi %1$s godz. i %2$s min. Twój czas blokowania aplikacji to %3$s. - Zasada organizacji wymusza czas blokowania aplikacji na %1$s. - Czas blokowania aplikacji przekracza limit określony przez organizację. + Zasady organizacji mają wpływ na czas blokowania sejfu. Maksymalny dozwolony czas wynosi %1$s godz. i %2$s min. + Zasady organizacji mają wpływ na czas blokowania sejfu. Maksymalny dozwolony czas wynosi %1$s godz. i %2$s min. Twój czas blokowania sejfu to %3$s. + Zasady organizacji wymuszają sposób blokowania sejfu na %1$s. + Czas blokowania sejfu przekracza limit określony przez organizację. Co najmniej jedna zasada organizacji uniemożliwia wyeksportowanie osobistego sejfu. Dodaj konto Odblokowane @@ -678,7 +678,7 @@ Czy chcesz przełączyć się na to konto? Bitwarden pozwala na udostępnianie zawartości sejfu innym użytkownikom za pośrednictwem organizacji. Dowiedz się więcej na stronie bitwarden.com. Utworzono %1$s Twoja organizacja wymaga ustawienia hasła głównego. - Ustaw metodę odblokowania, aby zmienić czas blokowania aplikacji. + Ustaw opcje odblokowania, aby zmienić czas blokowania sejfu. Zapisz klucz dostępu jako nowe dane logowania Zastąpić klucz dostępu? Element zawiera już klucz dostępu. Czy na pewno chcesz zastąpić obecny klucz dostępu? @@ -689,7 +689,7 @@ Czy chcesz przełączyć się na to konto? Klucze dostępu nie są obsługiwane dla tej aplikacji Operacja klucza dostępu nie powiodła się, ponieważ przeglądarka nie jest dozwolona Operacja klucza dostępu nie powiodła się, ponieważ podpis przeglądarki się nie zgadza - Operacja klucza dostępu nie powiodła się, ponieważ brakuje połączeń zasobów + Operacja klucza dostępu nie powiodła się, ponieważ brakuje powiązań zasobów Operacja klucza dostępu nie powiodła się, ponieważ aplikacja nie mogła zostać zweryfikowana Potwierdź hasło pliku Hasło pliku @@ -706,7 +706,7 @@ Czy chcesz przełączyć się na to konto? Utwórz konto na: Wysłaliśmy wiadomość na adres %1$s. Kontynuując, akceptujesz Regulamin i Politykę prywatności - Aktywując, akceptujesz Regulamin i Politykę prywatności + Zaznaczając tę opcję, akceptujesz Regulamin i Politykę prywatności Anuluj subskrypcję Sprawdź swoją pocztę e-mail Otwórz aplikację poczty e-mail @@ -746,7 +746,7 @@ Czy chcesz przełączyć się na to konto? Dowiedz się więcej o sposobach zapobiegania blokowaniu konta Pomoc z geolokalizacjami serwera. Adres e-mail (wymagane) - "Kliknij link w wiadomości e-mail, aby zweryfikować adres e-mail i utworzyć konto." + "Kliknij link w wiadomości, aby zweryfikować adres e-mail i utworzyć konto." Zmień adres e-mail Dalej Bitwarden nie może odzyskać utraconego hasła głównego. diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 44276d12ed..3f807eb347 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -170,7 +170,7 @@ Aplicativo de Autenticação Digite o código de verificação de 6 dígitos do seu aplicativo de autenticação. Digite o código de verificação de 6 dígitos que foi enviado por e-mail para %1$s. - Não reconhecemos este dispositivo. Digite o código de verificação de 8 dígitos que foi enviado por e-mail para %1$s. + Não reconhecemos este dispositivo. Digite o código de verificação de 8 dígitos que foi enviado por e-mail para [%1$s]. Código de Recuperação Lembrar Lembrar e-mail diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index c557251705..d7b30fb8b1 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -170,7 +170,7 @@ Aplicação de autenticação Introduza o código de verificação de 6 dígitos da sua aplicação de autenticação. Introduza o código de verificação de 6 dígitos que foi enviado por e-mail para %1$s. - Não reconhecemos este dispositivo. Introduza o código de verificação de 8 dígitos que foi enviado por e-mail para %1$s. + Não reconhecemos este dispositivo. Introduza o código de verificação de 8 dígitos que foi enviado por e-mail para [%1$s]. Código de recuperação Memorizar Memorizar e-mail diff --git a/app/src/main/res/values-ro-rRO/strings.xml b/app/src/main/res/values-ro-rRO/strings.xml index 8f7a66336f..909cd73aae 100644 --- a/app/src/main/res/values-ro-rRO/strings.xml +++ b/app/src/main/res/values-ro-rRO/strings.xml @@ -170,7 +170,7 @@ Aplicația Autentificator Introducere cod de verificare din 6 cifre din aplicația de autentificare. Introducere cod de verificare din 6 cifre, care a fost trimis prin e-mail la %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Cod de recuperare Remember Remember email diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index bb12271fd1..a1fa9ac3d4 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -170,7 +170,7 @@ Приложение-аутентификатор Введите 6-значный код подтверждения из вашего приложения-аутентификатора. Введите 6-значный код подтверждения, который был отправлен на %1$s. - Мы не распознали это устройство. Введите 8-значный код подтверждения, который был отправлен на email %1$s. + Мы не распознали это устройство. Введите 8-значный код подтверждения, который был отправлен на email [%1$s]. Код восстановления Запомнить Запомнить email diff --git a/app/src/main/res/values-si-rLK/strings.xml b/app/src/main/res/values-si-rLK/strings.xml index 02648f5128..699581d86e 100644 --- a/app/src/main/res/values-si-rLK/strings.xml +++ b/app/src/main/res/values-si-rLK/strings.xml @@ -170,7 +170,7 @@ Authenticator app Enter the 6 digit verification code from your authenticator app. Enter the 6 digit verification code that was emailed to %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. ප්‍රතිසාධන කේතය Remember Remember email diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/app/src/main/res/values-sk-rSK/strings.xml index 178242cf92..b354ed7ae8 100644 --- a/app/src/main/res/values-sk-rSK/strings.xml +++ b/app/src/main/res/values-sk-rSK/strings.xml @@ -170,7 +170,7 @@ Overovacia aplikácia Zadajte 6-miestny verifikačný kód z vašej overovacej aplikácie. Zadajte 6-miestny verifikačný kód, ktorý bol zaslaný e-mailom na %1$s. - Nespoznávame toto zariadenie. Zadajte 8-miestny overovací kód zaslaný na %1$s. + Nespoznávame toto zariadenie. Zadajte 8-miestny overovací kód zaslaný na [%1$s]. Záchranný kód Zapamätať si Zapamätať si e-mail diff --git a/app/src/main/res/values-sl-rSI/strings.xml b/app/src/main/res/values-sl-rSI/strings.xml index 74c1e0d93e..5af2c0b8ae 100644 --- a/app/src/main/res/values-sl-rSI/strings.xml +++ b/app/src/main/res/values-sl-rSI/strings.xml @@ -170,7 +170,7 @@ Avtentikacijska aplikacija Vnesite 6 mestno številčno verifikacijsko kodo z vaše avtentifikacijske aplikacije. Vnesite 6-mestno verifikacijsko kodo, ki vam je bila poslana na %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Koda za obnovitev Remember Remember email diff --git a/app/src/main/res/values-sr-rSP/strings.xml b/app/src/main/res/values-sr-rSP/strings.xml index c6cf9ab9ca..b19726678e 100644 --- a/app/src/main/res/values-sr-rSP/strings.xml +++ b/app/src/main/res/values-sr-rSP/strings.xml @@ -170,7 +170,7 @@ Апликација Аутентификатор Унесите шестоцифрени верификациони код из апликације за утврђивање аутентичности. Унесите шестоцифрени верификациони код који је послан на %1$s. - Не препознајемо овај уређај. Унесите 8-цифрени верификациони кôд који је послат на %1$s. + Не препознајемо овај уређај. Унесите 8-цифрени верификациони кôд који је послат на [%1$s]. Шифра за опоравак Запамти ме Запамти адресу е-поште diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index 60a72d2132..30223c99cd 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -3,7 +3,7 @@ Om Lägg till mapp Lägg till objekt - Ett fel har inträffat. + Ett fel har inträffat Tillbaka Bitwarden Avbryt @@ -49,7 +49,7 @@ "Skicka namn (krävs)" Nej Anteckningar - Private notes + Privata anteckningar Okej Lösenord Spara @@ -86,10 +86,10 @@ Redigera kort Redigera identitet Redigera anteckning - Edit passkey + Redigera inloggningsnyckel Ange ditt kontos e-postadress för att hämta din huvudlösenordsledtråd. Favorit - Unfavorite + Avmarkera som favorit Fingeravtryck Generera lösenord Hämta huvudlösenordsledtråd @@ -121,14 +121,14 @@ Ny identitet Det finns inga anteckningar i ditt valv. Ny anteckning - New passkey + Ny huvudnyckel Nytt objekt Ny SSH-nyckel - There are no text Sends in your vault. - There are no file Sends in your vault. + Det finns inga textmeddelanden i ditt valv. + Det finns inga filöverföringar i ditt valv. Det finns inga SSH-nycklar i ditt valv. - New text Send - New file Send + Ny text Skicka + Ny fil Skicka Inget användarnamn Alternativ Annat @@ -137,8 +137,8 @@ Vi har skickat ett mejl till dig med din huvudlösenordsledtråd. Är du säker på att du vill skriva över det nuvarande lösenordet? Ange huvudlösenordet igen - Re-type new master password (required) - Re-type master password (required) + Skriv in det nya huvudlösenordet (krävs) + Skriv in huvudlösenordet igen (krävs) Sök i valvet Välj Objektinformation @@ -154,7 +154,7 @@ Visa kort Visa identitet Visa anteckning - View passkey + Visa nyckeln Bitwarden webbvalv Objekt Objekt för %1$s @@ -170,7 +170,7 @@ Autentiseringsapp Ange den 6-siffriga verifieringskoden från din autentiseringsapp. Ange den 6-siffriga verifieringskoden som skickades till %1$s. - Vi känner inte igen den här enheten. Ange den 8-siffriga verifieringskoden som skickades till %1$s. + Vi känner inte igen den här enheten. Ange den 8-siffriga verifieringskoden som skickades till [%1$s]. Återställningskod Kom ihåg Kom ihåg e-post @@ -205,7 +205,7 @@ Skanningen sker automatiskt. Läs mer API-server-URL Klientcertifikat (mTLS) - Certificate used for client authentication. + Certifikat som används för klientautentisering. Anpassad miljö För avancerade användare. Du kan ange bas-URL:en för varje tjänst oberoende av varandra. Miljö-URL:er har sparats. @@ -265,7 +265,7 @@ Skanningen sker automatiskt. Adress Utgång Visa webbplatsikoner - Visa en identifierbar bild bredvid varje inloggning. + Visa en identifierbar bild bredvid varje inloggning Ikonserver-URL Valvet är låst Gå till mitt valv @@ -273,11 +273,11 @@ Skanningen sker automatiskt. Det finns inga objekt i samlingen. Det finns inga objekt i den här mappen. Det finns inga objekt i papperskorgen. - Assist with filling username and password fields in other apps and on the web. + Hjälp med att fylla i fält för användarnamn och lösenord i andra appar och på webben. Bitwardens tjänst för automatisk ifyllnad använder Android Autofill Framework för att hjälpa till att fylla i inloggningsuppgifter i andra appar på din enhet. Det gick inte att automatiskt öppna inställningsmenyn för Android automatisk ifyllnad. Du kan navigera till menyn manuellt från Android inställningar > System > Språk och inmatning > Avancerat > Tjänsten autofyll. Anpassat fältnamn - Boolean + Boolesk Dold Länkad Text @@ -296,8 +296,8 @@ Skanningen sker automatiskt. Fyll i automatiskt och spara Organisation Försök igen - Created: %1$s - Password last updated: %1$s + Skapad: %1$s + Lösenordet senast uppdaterat: %1$s Senast redigerad: %1$s Ogiltig e-postadress. Kort @@ -307,13 +307,13 @@ Skanningen sker automatiskt. Säkra anteckningar Personlig information Kontaktuppgifter - Check password for data breaches + Kontrollera lösenord för dataintrång 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. Identitetsnamn Värde Lösenordshistorik - Password history: %1$s + Lösenordshistorik: %1$s Typer Inga lösenord att lista. Sök bland Sends-filer @@ -358,7 +358,7 @@ Skanningen sker automatiskt. Standardmatchning för URI Välj standardalternativet för hur matchning av URI är hanterat för inloggningar när du utför operationer såsom automatisk ifyllnad. Tema - Ändra appens färgtema. + Ändra appens färgtema Kopiera anteckning Avsluta Är du säker på att du vill avsluta Bitwarden? @@ -425,11 +425,11 @@ Skanningen sker automatiskt. Integritetspolicy Nyckelhantering Tjänster för automatisk ifyllnad - Display autofill suggestions - Inline (shows in keyboard) - Popup (shows over input field) + Visa förslag på autofyllning + Inline (visas i tangentbordet) + Popup (visas över inmatningsfältet) Använd tillgänglighet - Required to use the Autofill Quick-Action Tile. + Krävs för att använda Autofill Quick-Action Tile. En organisationspolicy påverkar dina ägarskapsalternativ. Send Skicka detaljer @@ -447,7 +447,7 @@ Skanningen sker automatiskt. Går ut den %s Går ut imorgon Går ut den %s - Stops logging on %1$s at %2$s + Slutar logga in på %1$s vid %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. Det maximala antalet åtkomster har uppnåtts @@ -463,13 +463,13 @@ Skanningen sker automatiskt. Send-länk Sök bland Send Redigera Send - Edit file Send - Edit text Send - New file Send - New text Send + Redigera fil Skicka + Redigera text Skicka + Ny fil Skicka + Ny text Skicka Är du säker på att du vill radera denna Send? Send har raderats - Send updated + Skicka uppdaterat 1 dag 2 dagar 3 dagar @@ -509,7 +509,7 @@ Skanningen sker automatiskt. Radera konto Radering av ditt konto är permanent Ditt konto och all associerad data raderas och kan inte återställas. Är du säker på att du vill fortsätta? - Ditt konto har raderats permanent. + Ditt konto har raderats permanent Ogiltig verifieringskod Send-kod Skickar @@ -534,10 +534,10 @@ Skanningen sker automatiskt. Skanna QR-kod Kan inte skanna QR-koden? Ange nyckeln manuellt Autentiseringsnyckel - Authenticator key help + Hjälp med autentiseringsnyckel Ange nyckel manuellt Lägg till TOTP - Set up authenticator key + Konfigurera autentiseringsnyckel När nyckeln har matats in, välj Lägg till TOTP för att lagra nyckeln på ett säkert sätt Att ställa in låsalternativ till “Aldrig” håller ditt valv tillgängligt för alla med tillgång till din enhet. Om du använder det här alternativet bör du se till att du håller din enhet ordentligt skyddad. @@ -576,7 +576,7 @@ välj Lägg till TOTP för att lagra nyckeln på ett säkert sätt DuckDuckGo Fastmail ForwardEmail - API access token (required) + API-åtkomsttoken (krävs) API-åtkomsttoken Är du säker på att du vill ersätta nuvarande användarnamn? Generera användarnamn @@ -681,27 +681,27 @@ Vill du byta till detta konto? 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? + Skriv över inloggningsnyckel? 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 - Din passkey kommer att sparas i ditt Bitwarden-valv för %1$s - Passkeys not supported for this app - Passkey operation failed because browser is not privileged - Passkey operation failed because browser signature does not match - Passkey operation failed because of missing asset links - Passkey operation failed because app could not be verified + Din inloggningsnyckel kommer att sparas i ditt Bitwarden-valv för %1$s + Inloggningsnycklar stöds inte för den här appen + Passkey-operationen misslyckades eftersom webbläsaren inte är privilegierad + Passkey-operationen misslyckades eftersom webbläsarens signatur inte stämmer överens + Passkey-operationen misslyckades på grund av saknade tillgångslänkar + Passkey-operationen misslyckades eftersom appen inte kunde verifieras Bekräfta fillösenord Fillösenord Lösenordsskyddad - This password will be used to export and import this file - Autofill suggestion - Continue to complete WebAuthn verification. + Detta lösenord kommer att användas för att exportera och importera denna fil + Autofyll-förslag + Fortsätt för att slutföra WebAuthn-verifieringen. Starta WebAuthn - There was an error starting WebAuthn two factor authentication - Self-hosted server URL - Passkey operation failed because user could not be verified. + Det uppstod ett fel vid start av WebAuthns tvåfaktorsautentisering + URL för server med egen hosting + Passkey-operationen misslyckades eftersom användaren inte kunde verifieras. Användarverifiering Skapa konto på Skapa konto på: @@ -722,30 +722,30 @@ Vill du byta till detta konto? 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? + Passkey borttagen + Vad gör ett lösenord starkt? 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? - You can return to complete this step anytime from Account Security in Settings. + Du kan återgå till att slutföra detta steg när som helst från kontosäkerhet i Inställningar. Bekräfta - Set up biometrics or choose a PIN code to quickly access your vault and Autofill your logins. + Ställ in biometri eller välj en PIN-kod för att snabbt komma åt ditt valv och fylla i dina inloggningsuppgifter automatiskt. Förlora aldrig åtkomst till ditt valv - The best way to make sure you can always access your vault is to set up safeguards from the start. - One of the best ways to create a secure and memorable password is to use a passphrase. \nHere’s how: + Det bästa sättet att säkerställa att du alltid har tillgång till ditt valv är att ställa in säkerhetsåtgärder från början. + Ett av de bästa sätten att skapa ett säkert och minnesvärt lösenord är att använda en lösenordsfras. \nSå här gör du: Skapa en ledtråd - Your hint will be sent to you via email when you request it. + Din ledtråd skickas till dig via e-post när du begär det. Skriv ner ditt lösenord Var noga med att förvara ditt skriftliga lösenord på en hemlig och säker plats. Förhindra kontoutlåsning Generera huvudlösenord Generera 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. + Läs mer om andra sätt att förhindra att kontot spärras + Läs om hur du kan förhindra att ditt konto spärras + Hjälp med servergeolokalisering. E-postadress (obligatoriskt) "Välj länken i e-postmeddelandet för att verifiera din e-postadress och fortsätta skapa ditt konto. " Ändra e-postadress @@ -756,21 +756,21 @@ Vill du byta till detta konto? Välj ett unikt och starkt lösenord för att hålla din information säker. %1$s tecken Utgången länk - Please restart registration or try logging in. You may already have an account. + Starta om registreringen eller försök logga in. Du kanske redan har ett konto. Starta om registrering - Authenticator Sync - Allow authenticator syncing - There was an issue validating the registration token. + Synkronisering av autentiserare + Tillåt synkronisering av autentiserare + Det uppstod ett problem med valideringen av registreringstoken. Slå på Autofyll Använd autofyll för att logga in på dina konton med ett tryck. Slå på senare 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. + Du kan återgå till detta steg när som helst i Inställningar. + Du kan nu utforska allt som Bitwarden har att erbjuda och börja hantera dina lösenord på ett säkert sätt. Du är klar! - Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance. + Fel vid anslutning till Duo-tjänsten. Använd en annan tvåstegsinloggningsmetod eller kontakta Duo för hjälp. Huvudlösenordsledtråd - New master password hint + Ny ledtråd för huvudlösenord Kom igång Spara och skydda din data Valvet skyddar mer än bara lösenord. Lagra säkra inloggningar, identiteter, kort och anteckningar säkert här. @@ -779,19 +779,19 @@ Vill du byta till detta konto? Skicka känslig information, säkert Importera sparade inloggningar 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. + Du kan återgå till att slutföra detta steg när som helst i Vault Settings. Importera inloggningar senare Importera inloggningar senare? - Do you have a computer available? - The following instructions will guide you through importing logins from your desktop or laptop computer + Har du tillgång till en dator? + Följande instruktioner hjälper dig att importera inloggningar från din stationära eller bärbara dator Importera inloggningar - From your computer, follow these instructions to export saved passwords from your browser or other password manager. Then, safely import them to Bitwarden. - Give your vault a head start - Unlock with biometrics requires strong biometric authentication and may not be compatible with all biometric options on this device. - Unlock with biometrics requires strong biometric authentication and is not compatible with the biometrics options available on this device. - On your computer, log in to your current browser or password manager. - Export your passwords. This option is usually found in your settings. - Select Import data in the web app, then Done below to finish syncing. + Från din dator följer du dessa instruktioner för att exportera sparade lösenord från din webbläsare eller annan lösenordshanterare. Sedan kan du importera dem till Bitwarden på ett säkert sätt. + Ge ditt valv ett försprång + Låsa upp med biometri kräver stark biometrisk autentisering och är kanske inte kompatibelt med alla biometriska alternativ på den här enheten. + Låsa upp med biometri kräver stark biometrisk autentisering och är inte kompatibelt med de biometriska alternativ som finns tillgängliga på den här enheten. + Logga in på din dator med din nuvarande webbläsare eller lösenordshanterare. + Exportera dina lösenord. Det här alternativet finns vanligtvis i dina inställningar. + Välj Importera data i webbappen och sedan Klar nedan för att avsluta synkroniseringen. Steg 1 av 3 Exportera dina sparade inloggningar Du kan ta bort denna fil efter importen är färdig. @@ -801,94 +801,94 @@ Vill du byta till detta konto? Logga in på Bitwarden Steg 3 av 3 Importera inloggningar till Bitwarden - In the Bitwarden navigation, find the Tools option and select Import data. - Fill out the form and import your saved password file. - For your security, be sure to delete your saved password file. - Need help? Check out import help. - Save the exported file somewhere on your computer you can find easily. - This is not a recognized Bitwarden server. You may need to check with your provider or update your server. + I Bitwarden-navigeringen hittar du alternativet Verktyg och väljer Importera data. + Fyll i formuläret och importera din sparade lösenordsfil. + För din egen säkerhets skull bör du ta bort din sparade lösenordsfil. + Behöver du hjälp? Kolla in importhjälp. + Spara den exporterade filen på ett ställe på datorn som du lätt kan hitta. + Detta är inte en erkänd Bitwarden-server. Du kan behöva kontrollera med din leverantör eller uppdatera din server. 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. + Ställ in autofyll på alla dina enheter för att logga in med ett enda tryck var som helst. + Importen lyckades! + Hantera dina inloggningar var som helst med Bitwardens verktyg för webben och datorn. Bitwarden-verktyg Jag fattar Inga inloggningar importerades - Import error - Logins imported - Remember to delete your imported password file from your computer + Importfel + Inloggningar importerade + Kom ihåg att radera den importerade lösenordsfilen från din dator SSH-nyckel Offentlig nyckel Privat nyckel SSH-nycklar Kopiera offentlig nyckel Kopiera fingeravtryck - Enable notifications - Log in quickly and easily across devices - Bitwarden can notify you each time you receive a new login request from another device. + Aktivera aviseringar + Logga in snabbt och enkelt på alla enheter + Bitwarden kan meddela dig varje gång du får en ny inloggningsbegäran från en annan enhet. Hoppa över nu Klar %1$s av %2$s - Copy identity name + Kopiera identitetsnamn Kopiera företag Kopiera personnummer Kopiera passnummer - Copy license number + Kopiera licensnummer Kopiera e-postadress Kopiera telefonnummer Kopiera adress - Biometrics are no longer supported on this device - You’ve been logged out because your device’s biometrics don’t meet the latest security requirements. To update settings, log in once again or contact your administrator for access. - CXP Import - CXP Export - Choose three or four random words - Pick three or four random, unrelated words that you can easily remember. Think of objects, places, or things you like. - Combine those words together - Put the words together in any order to form your passphrase. Use hyphens, spaces, or leave them as one long word—your choice! - Make it yours - Add a number or symbol to make it even stronger. Now you have a unique, secure, and memorable passphrase! - "Need some inspiration?" - "Check out the passphrase generator" - We couldn’t verify the server’s certificate. The certificate chain or proxy settings on your device or your Bitwarden server may not be set up correctly. - Review flow launched! + Biometri stöds inte längre på den här enheten + Du har loggats ut eftersom din enhets biometriska data inte uppfyller de senaste säkerhetskraven. För att uppdatera inställningarna, logga in igen eller kontakta din administratör för åtkomst. + CXP-import + CXP-export + Välj tre eller fyra slumpmässiga ord + Välj tre eller fyra slumpmässiga, orelaterade ord som du lätt kan komma ihåg. Tänk på föremål, platser eller saker som du tycker om. + Kombinera dessa ord tillsammans + Sätt ihop orden i valfri ordning för att bilda din lösenordsfras. Använd bindestreck, mellanslag eller låt dem vara ett enda långt ord - dittval! + Gör den till din + Lägg till en siffra eller symbol för att göra den ännu starkare. Nu har du en unik, säker och minnesvärd lösenordsfras! + "Behöver du lite inspiration?" + "Kolla in lösenordsfrasgeneratorn" + Vi kunde inte verifiera serverns certifikat. Certifikatkedjan eller proxyinställningarna på din enhet eller din Bitwarden-server kanske inte är korrekt konfigurerade. + Granskningsflödet lanserat! 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. + Du behöver bara ställa in Authenticator Key för inloggningar som kräver tvåfaktorsautentisering med en kod. Nyckeln kommer kontinuerligt att generera sexsiffriga koder som du kan använda för att logga in. 3 AV 3 - You must add a web address to use autofill to access this account. + Du måste lägga till en webbadress för att använda autofyll för att komma åt det här kontot. Ö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. + Skapa passerkort med en enda knapptryckning + Inloggning med en knapptryckning och nyckel + Lär dig mer om nya inloggningar + Vi guidar dig genom de viktigaste funktionerna för att lägga till en ny inloggning. Utforska generatorn - Learn more about generating secure login credentials with a guided tour. + Lär dig mer om hur du genererar säkra inloggningsuppgifter med en guidad tur. Importera klientcertifikat - Enter the client certificate password and the desired alias for this certificate. + Ange lösenordet för klientcertifikatet och önskat alias för detta certifikat. 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. + "Använd generatorn för att skapa säkra lösenord, lösenordsfraser och användarnamn. " + Passfras är starka lösenord som ofta är lättare att komma ihåg och skriva än slumpmässiga lösenord. De är användbara för att logga in på konton där Autofill inte är tillgängligt, t.ex. en streamingtjänst på din TV. + Unika användarnamn ger ett extra lager av säkerhet och kan hjälpa till att förhindra att hackare hittar dina konton. 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. " + Använd dessa alternativ för att justera ditt lösenord så att det uppfyller kraven på din kontowebbplats. + "När du har sparat ditt nya lösenord i Bitwarden, glöm inte att uppdatera det på ditt kontos webbplats. " Verifiera din identitet Fel vid inläsning av certifikat - Certificate alias + Alias för certifikat Importera certifikat Välj systemcertifikat Certifikat installerat @@ -896,42 +896,42 @@ Vill du byta till detta konto? 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. + Att använda ett systemcertifikat är mindre säkert än att lagra certifikatet i Bitwarden. Continuing visar en lista över tillgängliga systemcertifikat om ett sådant redan är installerat. 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. - Passkey operation failed because relying party cannot be identified. - Passkey operation failed because the selected item does not exist. - Passkey operation failed because user is locked out. - Passkey operation failed because user verification was cancelled. - Passkey operation failed because the request is invalid. - Passkey operation failed because user verification attempts exceeded. - Passkey operation failed because no item was selected. - Passkey operation failed because the request is unsupported. - Self-host server URL - Use Brave autofill integration - 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. + Passkey-operationen misslyckades eftersom värd-URL:en inte finns med i begäran. + Passkey-operationen misslyckades eftersom appens signatur är ogiltig. + Passkey-registreringen misslyckades på grund av ett internt fel. + Passkey-operationen misslyckades eftersom den förlitande parten inte kan identifieras. + Passkey-operationen misslyckades eftersom det valda objektet inte finns. + Passkey-operationen misslyckades eftersom användaren är utelåst. + Passkey-operationen misslyckades eftersom användarverifieringen avbröts. + Passkey-operationen misslyckades eftersom begäran är ogiltig. + Passkey-operationen misslyckades eftersom antalet försök att verifiera användaren överskreds. + Passkey-operationen misslyckades eftersom inget objekt valdes. + Passkey-operationen misslyckades eftersom begäran inte stöds. + URL för server med egen värd + Använd Brave autofyll-integration + Använd Chrome autofyll-integration + Använd Chrome autofyll-integration (Beta) + Förbättrar inloggning för webbplatser som stöds i utvalda webbläsare. När den är aktiverad kommer du att hänvisas till webbläsarinställningarna för att aktivera autofyll från tredje part. Visa mer - No folder - Show less - Add field + Ingen mapp + Visa mindre + Lägg till fält %s... - Share error details - Flight recorder - Flight recorder help - View recorded logs - Enable flight recorder - Recorded logs - No logs recorded - Experiencing an issue? - Enable temporary logging to collect and inspect logs locally. When enabled, application states and network calls may be logged—never sensitive vault information. - To get started, set a logging duration. Logging 
will automatically turn off after this period, giving you time to capture activity while reproducing 
any issues. - Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. - For details on what is and isn’t logged, visit the\nBitwarden help center. - Logging duration + Dela felinformation + Färdskrivare + Hjälp med färdskrivare + Visa inspelade loggar + Aktivera färdskrivare + Inspelade loggar + Inga loggar registrerade + Upplever du ett problem? + Aktivera tillfällig loggning för att samla in och inspektera loggar lokalt. När det är aktiverat kan programstatus och nätverksanrop loggas - aldrig känslig valvinformation. + För att komma igång ställer du in en loggningsperiod. Loggningen stängs av automatiskt efter denna period, vilket ger dig tid att registrera aktivitet och samtidigt återskapa eventuella problem. + Loggar raderas automatiskt efter 30 dagar. Bitwarden kan endast komma åt dina loggdata när du delar dem. + För mer information om vad som loggas och inte loggas, besök\nBitwardenshjälpcenter. + Loggningens varaktighet 1 timme 8 timmar 24 timmar @@ -939,54 +939,54 @@ Vill du byta till detta konto? 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. + Vänligen försök igen eller välj en annan logg. + Den loggfil som du försöker dela har tagits bort. Ta bort logg - Do you really want to delete this log? + Vill du verkligen radera den här loggen? Radera loggar - Do you really want to delete all recorded logs? - Confirm Key Connector domain - Key Connector domain: + Vill du verkligen radera alla inspelade loggar? + Bekräfta Key Connector-domän + Key Connector-domän: 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. + Ett huvudlösenord krävs inte längre för medlemmar i följande organisation. Vänligen bekräfta domänen nedan med din organisationsadministratör. + Vänligen bekräfta domänen nedan med din organisationsadministratör.\n\nKey Connector-domän:\n%1$s + Färdskrivare på + Färdskrivaren kommer att vara aktiv tills %1$s vid %2$s. Återgå till inställningarna för att avaktivera nu. Gå till inställningar - All logs deleted - Log deleted + Alla loggar raderade + Loggen raderad 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. + Ett certifikat med aliaset \"%s\" finns redan. Vill du byta ut det? Att byta ut certifikatet kan påverka din anslutning till alla miljöer som använder det för närvarande. 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. - This account will soon be deleted. Log in at %1$s to continue using Bitwarden. - View file Send - View text Send - Delete Send - Missing Send re-sync your vault + Det går inte att läsa certifikatet. + Det går inte att radera ditt konto + Den här åtgärden kan inte slutföras eftersom ditt konto ägs av en organisation. Kontakta din organisationsadministratör om du vill ha mer information. + Detta konto kommer snart att raderas. Logga in på %1$s för att fortsätta använda Bitwarden. + Visa fil Skicka + Visa text Skicka + Radera Skicka + Saknas Skicka synkronisera ditt valv igen 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. - 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. + Applicera dynamiska färger baserat på din tapet + Dynamiska färger använder systemfärgerna och uppfyller kanske inte alla riktlinjer för tillgänglighet. + Passkey-operationen misslyckades eftersom webbläsaren (%1$s) inte känns igen. Välj \"Trust\" för att lägga till %1$s i listan över lokalt betrodda program. + Passkey-operationen misslyckades eftersom webbläsaren inte är pålitlig. + Förtroende + Det här är program eller webbläsare som Bitwarden inte litar på som standard, men som du litar på för att utföra nyckeloperationer. + Det här är applikationer som inte ingår i Google Play Store, men Bitwarden litar på att utföra passskey-operationer efter att medlemmar i samhället använder och rapporterar dem som säkra. 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 + För att skydda användare från nätfiskeförsök genomför Bitwarden som standard endast passerkortsoperationer via program eller webbläsare som är betrodda av Google eller Bitwarden-communityn. + Om privilegierade applikationer + Läs mer om privilegierade appar + Privilegierade appar Okänd webbläsare - Learn more about using passkeys with Bitwarden. - All trusted apps - Are you sure you want to stop trusting %s? - Installed apps - Delete %s + Läs mer om hur du använder inloggningsnycklar med Bitwarden. + Alla betrodda appar + Är du säker på att du inte längre vill lita på %s? + Installerade appar + Radera %s diff --git a/app/src/main/res/values-ta-rIN/strings.xml b/app/src/main/res/values-ta-rIN/strings.xml index fc0a75499a..6ecb3b271d 100644 --- a/app/src/main/res/values-ta-rIN/strings.xml +++ b/app/src/main/res/values-ta-rIN/strings.xml @@ -170,7 +170,7 @@ அங்கீகரிப்பான் செயலி உங்கள் அங்கீகார செயலியிலிருந்து ௬ இலக்க சரிபார்ப்புக் குறியீட்டை உள்ளிடவும். %1$s க்கு மின்னஞ்சல் செய்த ௬ இலக்க சரிபார்ப்புக் குறியீட்டை உள்ளிடவும். - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. மீட்புக் குறியீடு Remember Remember email diff --git a/app/src/main/res/values-te-rIN/strings.xml b/app/src/main/res/values-te-rIN/strings.xml index 11f5cc8a41..4c24394b8a 100644 --- a/app/src/main/res/values-te-rIN/strings.xml +++ b/app/src/main/res/values-te-rIN/strings.xml @@ -170,7 +170,7 @@ Authenticator app Enter the 6 digit verification code from your authenticator app. Enter the 6 digit verification code that was emailed to %1$s. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Recovery code Remember Remember email diff --git a/app/src/main/res/values-th-rTH/strings.xml b/app/src/main/res/values-th-rTH/strings.xml index cc539e3d6f..9b8717d6a5 100644 --- a/app/src/main/res/values-th-rTH/strings.xml +++ b/app/src/main/res/values-th-rTH/strings.xml @@ -170,7 +170,7 @@ แอป Authenticator ป้อนรหัสยืนยัน 6 หลักจากคุณแอป authenticator ป้อนรหัสยืนยัน6หลักที่ส่งอีเมลไปที่ %1$s - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. รหัสกู้คืน Remember Remember email diff --git a/app/src/main/res/values-tr-rTR/strings.xml b/app/src/main/res/values-tr-rTR/strings.xml index 4a44db30f8..190b8b5ffc 100644 --- a/app/src/main/res/values-tr-rTR/strings.xml +++ b/app/src/main/res/values-tr-rTR/strings.xml @@ -170,7 +170,7 @@ Kimlik doğrulama uygulaması Kimlik doğrulama uygulamanızdaki 6 haneli doğrulama kodunu girin. %1$s adresine e-postayla gönderdiğimiz 6 haneli doğrulama kodunu girin. - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. Kurtarma kodu Hatırla E-postayı hatırla diff --git a/app/src/main/res/values-uk-rUA/strings.xml b/app/src/main/res/values-uk-rUA/strings.xml index fa146282df..d74cf032b4 100644 --- a/app/src/main/res/values-uk-rUA/strings.xml +++ b/app/src/main/res/values-uk-rUA/strings.xml @@ -170,7 +170,7 @@ Програма автентифікації Введіть 6-значний код підтвердження з програми автентифікації. Введіть 6-значний код підтвердження, надісланий на %1$s. - Ми не впізнаємо цей пристрій. Введіть восьмизначний код підтвердження, надісланий на %1$s. + Ми не впізнаємо цей пристрій. Введіть восьмизначний код підтвердження, надісланий на [%1$s]. Код відновлення Запам\'ятати Запам\'ятати е-пошту diff --git a/app/src/main/res/values-vi-rVN/strings.xml b/app/src/main/res/values-vi-rVN/strings.xml index cb8ea48be9..e295a67f77 100644 --- a/app/src/main/res/values-vi-rVN/strings.xml +++ b/app/src/main/res/values-vi-rVN/strings.xml @@ -62,7 +62,7 @@ Đồng bộ Đường dẫn (URI) Trang web (URI) - Tên người dùng + Tên đăng nhập Vui lòng nhập %1$s. Bạn phải đính kèm một tệp để lưu Send này. Đã sao chép %1$s @@ -102,7 +102,7 @@ 1 phút 4 giờ Tức thì - Đă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? + Đă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 đóng kho. 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. @@ -129,7 +129,7 @@ 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 + Không tên đăng nhập Tùy chọn Khác Trình tạo mật khẩu @@ -170,8 +170,8 @@ Ứ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. - 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 + 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ã khôi phục Ghi nhớ Ghi nhớ email Gửi lại mã @@ -191,7 +191,7 @@ 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 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. + 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ảng 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. Đã xóa tệp đính kèm @@ -273,7 +273,7 @@ Quá trình quét sẽ diễn ra tự động. 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 trường tương ứng trong các ứng dụng khác và trên trang web. + Hỗ trợ điền tên đăng nhập 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 @@ -309,7 +309,7 @@ Quá trình quét sẽ diễn ra tự động. Thông tin liên hệ 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. + Không tìm thấy mật khẩu này trong các vụ rò rỉ dữ liệu trước đây. Nó an toàn để sử dụng. Tên định danh Giá trị Lịch sử mật khẩu @@ -353,8 +353,8 @@ Quá trình quét sẽ diễn ra tự động. 30 giây 20 giây 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. + Xóa bảng nhớ tạm + Tự động xóa mọi thứ đã sao chép khỏi bảng nhớ tạm. 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ủ đề @@ -408,8 +408,8 @@ Quá trình quét sẽ diễn ra tự độ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 + Hiện tại không thể đăng nhập bằng Đăng nhập một lần + Đặt mật khẩu chính 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 @@ -420,7 +420,7 @@ Quá trình quét sẽ diễn ra tự động. 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 - Điều khoản Dịch vụ và Chính sách Bảo mật chưa được xác nhận. + Bạn chưa đồng ý với Điều khoản Dịch vụ và Chính sách Bảo mật. Điều khoản Dịch vụ Chính sách Bảo mật Quản lý mã khoá @@ -447,7 +447,7 @@ Quá trình quét sẽ diễn ra tự động. Hết hạn vào %s Hết hạn ngày mai Hết hạn vào %s - Ngừng đăng nhập %1$s vào %2$s + Ngừng ghi %1$s lúc %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 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 @@ -497,8 +497,8 @@ 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. - 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. + 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 đóng kho. + Tổ chức bạn đã thiết lập hành động sau khi đóng kho là %1$s. 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. Thêm tài khoản @@ -559,7 +559,7 @@ chọn Thêm TOTP để lưu khóa an toàn Phê duyệt yêu cầu đăng nhập Không, cảm ơn Phê duyệt đăng nhập cho %1$s - Loại tên người dùng + Loại tên đăng nhập Địa chỉ email có hậu tố Catch-all email Địa chỉ email thay thế @@ -578,13 +578,13 @@ chọn Thêm TOTP để lưu khóa an toàn ForwardEmail 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 + Bạn có chắc chắn muốn ghi đè lên tên đăng nhập hiện tại không? + Tạo tên đăng nhập 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 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. + 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 nhập & 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. @@ -629,7 +629,7 @@ Bạn có muốn chuyển sang tài khoản này không? 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 khi sử dụng thiết bị công cộng + Tắt nếu sử dụng thiết bị công cộng Lưu thiết bị này Mã khoá Mã khóa sẽ không được sao chép @@ -658,8 +658,8 @@ Bạn có muốn chuyển sang tài khoản này không? Trung tâm hỗ trợ Bitwarden Đồng bộ ngay Tùy chọn mở khóa - Thời gian hết phiên - Hành động sau khi hết phiên + Thời gian đóng kho + Hành động sau khi đóng kho 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. @@ -679,7 +679,7 @@ Bạn có muốn chuyển sang tài khoản này không? 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. + Thiết lập phương thức mở khóa để thay đổi hành động khi đóng 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? @@ -877,7 +877,7 @@ Bạn có muốn chuyển sang tài khoản này không? 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 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. + Tên đăng nhập 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 @@ -927,7 +927,7 @@ Bạn có muốn chuyển sang tài khoản này không? Nhật ký đã lưu 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 tính năng ghi nhật ký tạm thời để thu thập và kiểm tra 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ờ bao 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 đề. @@ -969,7 +969,7 @@ các vấn đề. Xem văn bản Send Xóa Send Thiếu Send, đồng bộ lại kho của bạn - Màu động + Màu sắc tự động điều chỉnh Dựa theo hình nền của bạn 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ộ. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index c494ce3d02..64a076c779 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -170,7 +170,7 @@ 验证器 App 请输入您的验证器 App 中的 6 位数验证码。 请输入发送到 %1$s 的 6 位数验证码。 - 我们无法识别这个设备。请输入发送到 %1$s 的 8 位数验证码。 + 我们无法识别这个设备。请输入发送到您电子邮箱中的代码以验证您的身份。 恢复代码 记住 记住电子邮箱 @@ -980,7 +980,7 @@ 被您信任 被社区信任 被 Google 信任 - 为保护用户免遭钓鱼攻击,默认情况下,Bitwarden 仅允许使用被 Google 或 Bitwarden 社区信任的网页浏览器完成通行密钥操作。 + 为保护用户免遭钓鱼攻击,默认情况下,Bitwarden 仅使用被 Google 或 Bitwarden 社区信任的应用程序或网页浏览器完成通行密钥操作。 关于特权 App 进一步了解特权 App 特权 App diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 90cc12dcde..1ad110b6e6 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -170,7 +170,7 @@ 驗證器應用程式 輸入驗證器應用程式提供的 6 位數驗證碼。 輸入已傳送至電子郵件信箱 %1$s 的 6 位數驗證碼。 - We don\'t recognize this device. Enter the 8 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. 復原代碼 Remember Remember email From 710e35680baf833ccb47926b1ad18b7f20e14390 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Fri, 18 Jul 2025 08:42:38 -0400 Subject: [PATCH 12/12] Crowdin Pull - Authenticator (#5541) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- .../src/main/res/values-af-rZA/strings.xml | 2 +- .../src/main/res/values-ar-rSA/strings.xml | 2 +- .../src/main/res/values-az-rAZ/strings.xml | 2 +- .../src/main/res/values-be-rBY/strings.xml | 2 +- .../src/main/res/values-bg-rBG/strings.xml | 2 +- .../src/main/res/values-bn-rBD/strings.xml | 2 +- .../src/main/res/values-bs-rBA/strings.xml | 2 +- .../src/main/res/values-ca-rES/strings.xml | 2 +- .../src/main/res/values-cs-rCZ/strings.xml | 2 +- .../src/main/res/values-cy-rGB/strings.xml | 2 +- .../src/main/res/values-da-rDK/strings.xml | 2 +- .../src/main/res/values-de-rDE/strings.xml | 2 +- .../src/main/res/values-el-rGR/strings.xml | 2 +- .../src/main/res/values-en-rGB/strings.xml | 2 +- .../src/main/res/values-en-rIN/strings.xml | 2 +- .../src/main/res/values-es-rES/strings.xml | 2 +- .../src/main/res/values-et-rEE/strings.xml | 2 +- .../src/main/res/values-eu-rES/strings.xml | 2 +- .../src/main/res/values-fa-rIR/strings.xml | 2 +- .../src/main/res/values-fi-rFI/strings.xml | 2 +- .../src/main/res/values-fil-rPH/strings.xml | 2 +- .../src/main/res/values-fr-rFR/strings.xml | 84 +++++++++---------- .../src/main/res/values-gl-rES/strings.xml | 2 +- .../src/main/res/values-hi-rIN/strings.xml | 2 +- .../src/main/res/values-hr-rHR/strings.xml | 2 +- .../src/main/res/values-hu-rHU/strings.xml | 2 +- .../src/main/res/values-in-rID/strings.xml | 2 +- .../src/main/res/values-it-rIT/strings.xml | 2 +- .../src/main/res/values-iw-rIL/strings.xml | 2 +- .../src/main/res/values-ja-rJP/strings.xml | 2 +- .../src/main/res/values-ka-rGE/strings.xml | 2 +- .../src/main/res/values-kn-rIN/strings.xml | 2 +- .../src/main/res/values-ko-rKR/strings.xml | 2 +- .../src/main/res/values-lt-rLT/strings.xml | 2 +- .../src/main/res/values-lv-rLV/strings.xml | 2 +- .../src/main/res/values-ml-rIN/strings.xml | 2 +- .../src/main/res/values-mr-rIN/strings.xml | 2 +- .../src/main/res/values-my-rMM/strings.xml | 2 +- .../src/main/res/values-nb-rNO/strings.xml | 2 +- .../src/main/res/values-ne-rNP/strings.xml | 2 +- .../src/main/res/values-nl-rNL/strings.xml | 2 +- .../src/main/res/values-nn-rNO/strings.xml | 2 +- .../src/main/res/values-or-rIN/strings.xml | 2 +- .../src/main/res/values-pl-rPL/strings.xml | 2 +- .../src/main/res/values-pt-rBR/strings.xml | 2 +- .../src/main/res/values-pt-rPT/strings.xml | 2 +- .../src/main/res/values-ro-rRO/strings.xml | 2 +- .../src/main/res/values-ru-rRU/strings.xml | 2 +- .../src/main/res/values-si-rLK/strings.xml | 2 +- .../src/main/res/values-sk-rSK/strings.xml | 2 +- .../src/main/res/values-sl-rSI/strings.xml | 2 +- .../src/main/res/values-sr-rSP/strings.xml | 2 +- .../src/main/res/values-sv-rSE/strings.xml | 22 ++--- .../src/main/res/values-ta-rIN/strings.xml | 2 +- .../src/main/res/values-te-rIN/strings.xml | 2 +- .../src/main/res/values-th-rTH/strings.xml | 2 +- .../src/main/res/values-tr-rTR/strings.xml | 2 +- .../src/main/res/values-uk-rUA/strings.xml | 2 +- .../src/main/res/values-vi-rVN/strings.xml | 2 +- .../src/main/res/values-zh-rCN/strings.xml | 2 +- .../src/main/res/values-zh-rTW/strings.xml | 2 +- 61 files changed, 112 insertions(+), 112 deletions(-) diff --git a/authenticator/src/main/res/values-af-rZA/strings.xml b/authenticator/src/main/res/values-af-rZA/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-af-rZA/strings.xml +++ b/authenticator/src/main/res/values-af-rZA/strings.xml @@ -116,7 +116,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-ar-rSA/strings.xml b/authenticator/src/main/res/values-ar-rSA/strings.xml index 3fc1f6ecef..db435972b0 100644 --- a/authenticator/src/main/res/values-ar-rSA/strings.xml +++ b/authenticator/src/main/res/values-ar-rSA/strings.xml @@ -116,7 +116,7 @@ تخزين جميع تسجيلات الدخول الخاصة بك ومزامنة رموز التحقق مباشرة مع تطبيق المصادقة. تنزيل الآن المزامنة مع تطبيق Bitwarden - This feature is not yet available for self-hosted users. Learn more + Learn more غير قادر على مزامنة الرموز من تطبيق Bitwarden. تأكد من تحديث كلا التطبيقين. لا يزال بإمكانك الوصول إلى الرموز الموجودة في تطبيق Bitwarden. %1$s | %2$s المزامنة مع تطبيق Bitwarden diff --git a/authenticator/src/main/res/values-az-rAZ/strings.xml b/authenticator/src/main/res/values-az-rAZ/strings.xml index bb202f9881..697ea071c3 100644 --- a/authenticator/src/main/res/values-az-rAZ/strings.xml +++ b/authenticator/src/main/res/values-az-rAZ/strings.xml @@ -116,7 +116,7 @@ Bütün girişlərinizi saxlayın və doğrulama kodlarını birbaşa Authenticator tətbiqi ilə sinxronlaşdırın. İndi endir Bitwarden tətbiqi ilə sinxronlaşdır - This feature is not yet available for self-hosted users. Learn more + Learn more Kodlar, Bitwarden tətbiqindən sinxronlaşdırıla bilmir. Hər iki tətbiqin güncəl olduğuna əmin olun. Mövcud kodlarınıza Bitwarden tətbiqində müraciət etməyə davam edə bilərsiniz. %1$s | %2$s Bitwarden tətbiqi ilə sinxronlaşdır diff --git a/authenticator/src/main/res/values-be-rBY/strings.xml b/authenticator/src/main/res/values-be-rBY/strings.xml index 2be731dd0a..972fa2009d 100644 --- a/authenticator/src/main/res/values-be-rBY/strings.xml +++ b/authenticator/src/main/res/values-be-rBY/strings.xml @@ -116,7 +116,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-bg-rBG/strings.xml b/authenticator/src/main/res/values-bg-rBG/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-bg-rBG/strings.xml +++ b/authenticator/src/main/res/values-bg-rBG/strings.xml @@ -116,7 +116,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-bn-rBD/strings.xml b/authenticator/src/main/res/values-bn-rBD/strings.xml index 53b15f4787..4b25cfac20 100644 --- a/authenticator/src/main/res/values-bn-rBD/strings.xml +++ b/authenticator/src/main/res/values-bn-rBD/strings.xml @@ -116,7 +116,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-bs-rBA/strings.xml b/authenticator/src/main/res/values-bs-rBA/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-bs-rBA/strings.xml +++ b/authenticator/src/main/res/values-bs-rBA/strings.xml @@ -116,7 +116,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-ca-rES/strings.xml b/authenticator/src/main/res/values-ca-rES/strings.xml index 2570730bfa..d7dcf0fc7b 100644 --- a/authenticator/src/main/res/values-ca-rES/strings.xml +++ b/authenticator/src/main/res/values-ca-rES/strings.xml @@ -116,7 +116,7 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Descarregueu ara 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-cs-rCZ/strings.xml b/authenticator/src/main/res/values-cs-rCZ/strings.xml index 739faa140c..f9a2f06ba2 100644 --- a/authenticator/src/main/res/values-cs-rCZ/strings.xml +++ b/authenticator/src/main/res/values-cs-rCZ/strings.xml @@ -116,7 +116,7 @@ Uložte všechny Vaše přihlašovací údaje a synchronizujte ověřovací kódy přímo s ověřovací aplikací. Stáhnout nyní Synchronizovat s aplikací Bitwarden - Tato funkce zatím není dostupná pro vlastní hostované uživatele. Další informace + Další informace Nelze synchronizovat kódy z aplikace Bitwarden. Zkontrolujte, zda jsou obě aplikace aktuální. Ke stávajícím kódům máte stále přístup v aplikaci Bitwarden. %1$s | %2$s (%3$d) Synchronizovat s aplikací Bitwarden diff --git a/authenticator/src/main/res/values-cy-rGB/strings.xml b/authenticator/src/main/res/values-cy-rGB/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-cy-rGB/strings.xml +++ b/authenticator/src/main/res/values-cy-rGB/strings.xml @@ -116,7 +116,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-da-rDK/strings.xml b/authenticator/src/main/res/values-da-rDK/strings.xml index fb3b37d00f..42ee90cf6e 100644 --- a/authenticator/src/main/res/values-da-rDK/strings.xml +++ b/authenticator/src/main/res/values-da-rDK/strings.xml @@ -116,7 +116,7 @@ Gem alle logins og synk bekræftelseskoder direkte med Authenticator-appen. Download nu Synk med Bitwarden-appen - This feature is not yet available for self-hosted users. Learn more + Learn more Kan ikke synke koder fra Bitwarden-appen. Sørg for, at begge apps er opdaterede. Eksisterende koder kan stadig tilgås i Bitwarden-appen. %1$s | %2$s Synk med Bitwarden-appen diff --git a/authenticator/src/main/res/values-de-rDE/strings.xml b/authenticator/src/main/res/values-de-rDE/strings.xml index 038bdbd3e7..e87ec07961 100644 --- a/authenticator/src/main/res/values-de-rDE/strings.xml +++ b/authenticator/src/main/res/values-de-rDE/strings.xml @@ -116,7 +116,7 @@ Speicher alle deine Zugangsdaten und synchronisiere Verifizierungscodes direkt mit der Authenticator-App. Jetzt herunterladen Mit der Bitwarden-App synchronisieren - Diese Funktion ist für selbst gehostete Benutzer noch nicht verfügbar. Erfahre mehr + Learn more Codes aus der Bitwarden-App konnten nicht synchronisiert werden. Stelle sicher, dass beide Apps auf dem neusten Stand sind. Du kannst weiterhin auf deine existierenden Codes in der Bitwarden-App zugreifen. %1$s | %2$s Mit der Bitwarden-App synchronisieren diff --git a/authenticator/src/main/res/values-el-rGR/strings.xml b/authenticator/src/main/res/values-el-rGR/strings.xml index 1280648fbc..2fc319d564 100644 --- a/authenticator/src/main/res/values-el-rGR/strings.xml +++ b/authenticator/src/main/res/values-el-rGR/strings.xml @@ -116,7 +116,7 @@ Αποθηκεύστε όλες τις συνδέσεις σας και συγχρονίστε απευθείας τους κωδικούς επαλήθευσης με το Authenticator. Λήψη τώρα Συγχρονισμός με την εφαρμογή Bitwarden - This feature is not yet available for self-hosted users. Learn more + Learn more Δεν είναι δυνατός ο συγχρονισμός κωδικών από το Bitwarden. Βεβαιωθείτε ότι έχουν ενημερωθεί και οι δύο εφαρμογές. Μπορείτε ακόμα να αποκτήσετε πρόσβαση στους υπάρχοντες κωδικούς σας στο Bitwarden. %1$s | %2$s Συγχρονισμός με την εφαρμογή Bitwarden diff --git a/authenticator/src/main/res/values-en-rGB/strings.xml b/authenticator/src/main/res/values-en-rGB/strings.xml index 1f5d8484d1..31edb00e6e 100644 --- a/authenticator/src/main/res/values-en-rGB/strings.xml +++ b/authenticator/src/main/res/values-en-rGB/strings.xml @@ -116,7 +116,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 Sync with the Bitwarden app diff --git a/authenticator/src/main/res/values-en-rIN/strings.xml b/authenticator/src/main/res/values-en-rIN/strings.xml index 1f5d8484d1..31edb00e6e 100644 --- a/authenticator/src/main/res/values-en-rIN/strings.xml +++ b/authenticator/src/main/res/values-en-rIN/strings.xml @@ -116,7 +116,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 Sync with the Bitwarden app diff --git a/authenticator/src/main/res/values-es-rES/strings.xml b/authenticator/src/main/res/values-es-rES/strings.xml index 8d7e2e90f5..cc727de76f 100644 --- a/authenticator/src/main/res/values-es-rES/strings.xml +++ b/authenticator/src/main/res/values-es-rES/strings.xml @@ -116,7 +116,7 @@ Almacena todos tus inicios de sesión y sincroniza los códigos de verificación directamente con la aplicación Authenticator. Descargar ahora Sincronizar con la aplicación Bitwarden - Esta característica aún no está disponible para usuarios autoalojados. Más información + Learn more No se pueden sincronizar los códigos desde la aplicación de Bitwarden. Asegúrate de que ambas aplicaciones estén actualizadas. Aún puedes acceder a tus códigos existentes en la aplicación de Bitwarden. %1$s | %2$s Sincronizar con la aplicación Bitwarden diff --git a/authenticator/src/main/res/values-et-rEE/strings.xml b/authenticator/src/main/res/values-et-rEE/strings.xml index 4c76cc75df..7897667f67 100644 --- a/authenticator/src/main/res/values-et-rEE/strings.xml +++ b/authenticator/src/main/res/values-et-rEE/strings.xml @@ -116,7 +116,7 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Laadi kohe alla Sünkroniseeri Bitwardeni rakendusega - 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-eu-rES/strings.xml b/authenticator/src/main/res/values-eu-rES/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-eu-rES/strings.xml +++ b/authenticator/src/main/res/values-eu-rES/strings.xml @@ -116,7 +116,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-fa-rIR/strings.xml b/authenticator/src/main/res/values-fa-rIR/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-fa-rIR/strings.xml +++ b/authenticator/src/main/res/values-fa-rIR/strings.xml @@ -116,7 +116,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-fi-rFI/strings.xml b/authenticator/src/main/res/values-fi-rFI/strings.xml index d1ed616a6b..dcfb8860d6 100644 --- a/authenticator/src/main/res/values-fi-rFI/strings.xml +++ b/authenticator/src/main/res/values-fi-rFI/strings.xml @@ -116,7 +116,7 @@ Varastoi kaikki kirjautumistietosi ja synkronoi vahvistuskoodit suoraan todentajasovelluksella. Lataa nyt Synkronoi Bitwarden sovelluksen kanssa - This feature is not yet available for self-hosted users. Learn more + Learn more Koodien synkronointi Bitwarden sovelluksesta epäonnistui. Varmista, että molemmat sovellukset ovat ajan tasalla. Voit edelleen käyttää olemassa olevia koodejasi Bitwarden sovelluksessa. %1$s | %2$s Sync with the Bitwarden app diff --git a/authenticator/src/main/res/values-fil-rPH/strings.xml b/authenticator/src/main/res/values-fil-rPH/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-fil-rPH/strings.xml +++ b/authenticator/src/main/res/values-fil-rPH/strings.xml @@ -116,7 +116,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-fr-rFR/strings.xml b/authenticator/src/main/res/values-fr-rFR/strings.xml index 2747eb83ca..2176c0ee66 100644 --- a/authenticator/src/main/res/values-fr-rFR/strings.xml +++ b/authenticator/src/main/res/values-fr-rFR/strings.xml @@ -15,34 +15,34 @@ Bitwarden Authenticator Nom Add Item Rotation - Scan a QR code - Scan QR code - Point your camera at the QR code. - Cannot scan QR code? Enter key manually + Scanner un code QR + Scanner le code QR + Pointez votre caméra sur le code QR. + Impossible de scanner le code QR ? Saisir la clé manuellement Saisir la clé manuellement - Cannot add authenticator key? + Problème lors de l\'ajout de la clé d\'authentification ? No thanks Paramètres Enable camera permission to use the scanner Empty Item Listing You don\'t have any items to display. - Add a new code to secure your accounts. - Add code - Cannot read key. - Verification code added + Ajouter un nouveau code pour sécuriser vos comptes. + Ajouter le code + Impossible de lire la clé. + Code de vérification ajouté Nom d\'utilisateur - Refresh period - Algorithm + Fréquence de mise à jour + Algorithme Hide Show - Advanced + Avancé Collapse advanced options - Number of digits + Nombre de chiffres Sauvegarder Le champ %1$s est requis. %d seconds Saving - Item saved + Élément enregistré Information OTP type Codes de vérification @@ -51,33 +51,33 @@ Clear Search codes Options - Try again + Réessayer Apparence - Par défaut (Système) + Par défaut (système) Thème Sombre Clair La langue a été changée en %1$s. Veuillez redémarrer l\'application pour voir le changement - Secure your accounts with Bitwarden Authenticator + Sécurisez vos comptes avec Bitwarden Authenticator Get verification codes for all your accounts that support 2-step verification. - Use your device camera to scan codes - Scan the QR code in your 2-step verification settings for any account. + Utilisez l\'appareil photo pour scanner les codes + Scanner le code QR dans les paramètres de double authentification pour n\'importe quel compte. Sign in using unique codes When using 2-step verification, you\'ll enter your username and password and a code generated in this app. - Skip - Help - Launch tutorial + Passer + Aide + Lancer le tutoriel %1$s copié Delete item Élément supprimé Supprimer Do you really want to permanently delete? This cannot be undone. - Data - Export + Données + Exporter Loading Confirm export This export contains your data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it. - File format + Format de fichier There was a problem exporting your vault. If the problem persists, you\'ll need to export from the web vault. Data exported successfully Déverrouiller avec %1$s @@ -94,48 +94,48 @@ Privacy policy Poursuivre vers la politique de confidentialité ? Check out our privacy policy on bitwarden.com - Key + Clé Create Verification code - Key is required. + La clé est obligatoire. Name is required. Submit crash logs There was a problem importing your vault. File Source - Import + Importer Vault import successful - Key is invalid. - Favorite + La clé est invalide. + Favori Favoris - Backup - Data backup - Bitwarden Authenticator data is backed up and can be restored with your regularly scheduled device backups. + Sauvegarder + Sauvegarde des données + Les données de Bitwarden Authenticator sont sauvegardées et peuvent être restaurées avec vos sauvegardes d\'appareil programmées régulièrement. En savoir plus Importing from 2FAS password protected files is not supported. Try again with an exported file that is not password protected. Importing Bitwarden CSV files is not supported. Try again with an exported JSON file. - Download the Bitwarden app + Télécharger l\'app Bitwarden 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 + Synchroniser avec l\'app Bitwarden + 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 + Synchroniser avec l\'app Bitwarden 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 Something went wrong Please try again Copy to Bitwarden vault - Default save option - Save to Bitwarden - Save here + Option de sauvegarde par défaut + Enregistrer sur Bitwarden + Enregistrer ici None - Select where you would like to save new verification codes. + Sélectionner où vous souhaitez sauvegarder les nouveaux codes de vérification. Confirm Verification code created Save this authenticator key here, or add it to a login in your Bitwarden app. Save option as default Account synced from Bitwarden app - Local codes (%1$d) + Codes locaux (%1$d) 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" diff --git a/authenticator/src/main/res/values-gl-rES/strings.xml b/authenticator/src/main/res/values-gl-rES/strings.xml index 41858eda7b..01f2e9ae71 100644 --- a/authenticator/src/main/res/values-gl-rES/strings.xml +++ b/authenticator/src/main/res/values-gl-rES/strings.xml @@ -116,7 +116,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-hi-rIN/strings.xml b/authenticator/src/main/res/values-hi-rIN/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-hi-rIN/strings.xml +++ b/authenticator/src/main/res/values-hi-rIN/strings.xml @@ -116,7 +116,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-hr-rHR/strings.xml b/authenticator/src/main/res/values-hr-rHR/strings.xml index 83714a607c..4fbed1c5f2 100644 --- a/authenticator/src/main/res/values-hr-rHR/strings.xml +++ b/authenticator/src/main/res/values-hr-rHR/strings.xml @@ -116,7 +116,7 @@ Pohrani sve svoje prijave i sinkroniziraj kôdove za provjeru izravno s aplikacijom Autentifikator. Preuzmi sada Sinkroniziraj s Bitwarden aplikacijom - Ova značajka još nije dostupna za korsnike na vlastitom poslužitelju. Saznaj više + Saznaj više Nije moguće sinkronizirati kodove iz aplikacije Bitwarden. Provjeri jesu li obje aplikacije ažurirane. I dalje možeš pristupiti svojim postojećim kodovima u aplikaciji Bitwarden. %1$s | %2$s (%3$d) Sinkroniziraj s Bitwardenom diff --git a/authenticator/src/main/res/values-hu-rHU/strings.xml b/authenticator/src/main/res/values-hu-rHU/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-hu-rHU/strings.xml +++ b/authenticator/src/main/res/values-hu-rHU/strings.xml @@ -116,7 +116,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-in-rID/strings.xml b/authenticator/src/main/res/values-in-rID/strings.xml index c41a879a30..a0baae7f45 100644 --- a/authenticator/src/main/res/values-in-rID/strings.xml +++ b/authenticator/src/main/res/values-in-rID/strings.xml @@ -116,7 +116,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-it-rIT/strings.xml b/authenticator/src/main/res/values-it-rIT/strings.xml index 010a08ef6b..930354a967 100644 --- a/authenticator/src/main/res/values-it-rIT/strings.xml +++ b/authenticator/src/main/res/values-it-rIT/strings.xml @@ -116,7 +116,7 @@ Memorizza tutti i login e sincronizza i codici di verifica direttamente con l\'app Authenticator. Scarica adesso Sincronizza con l\'app Bitwarden - This feature is not yet available for self-hosted users. Learn more + Learn more Impossibile sincronizzare i codici dall\'app Bitwarden. Assicurati che entrambe le app siano aggiornate. Puoi comunque accedere ai tuoi codici esistenti nell\'app Bitwarden. %1$s | %2$s Sincronizza con l\'app Bitwarden diff --git a/authenticator/src/main/res/values-iw-rIL/strings.xml b/authenticator/src/main/res/values-iw-rIL/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-iw-rIL/strings.xml +++ b/authenticator/src/main/res/values-iw-rIL/strings.xml @@ -116,7 +116,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-ja-rJP/strings.xml b/authenticator/src/main/res/values-ja-rJP/strings.xml index 7d09d25162..b562970c5e 100644 --- a/authenticator/src/main/res/values-ja-rJP/strings.xml +++ b/authenticator/src/main/res/values-ja-rJP/strings.xml @@ -116,7 +116,7 @@ すべてのログイン情報を格納し、認証アプリに認証コードを直接同期します。 今すぐダウンロード Bitwarden アプリと同期 - セルフホスティングのユーザーは、まだこの機能をご利用いただけません。 詳細 + Learn more Bitwarden アプリからコードを同期できません。両方のアプリが最新であることを確認してください。既存のコードには Bitwarden アプリでアクセスできます。 %1$s | %2$s Bitwarden アプリと同期 diff --git a/authenticator/src/main/res/values-ka-rGE/strings.xml b/authenticator/src/main/res/values-ka-rGE/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-ka-rGE/strings.xml +++ b/authenticator/src/main/res/values-ka-rGE/strings.xml @@ -116,7 +116,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-kn-rIN/strings.xml b/authenticator/src/main/res/values-kn-rIN/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-kn-rIN/strings.xml +++ b/authenticator/src/main/res/values-kn-rIN/strings.xml @@ -116,7 +116,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-ko-rKR/strings.xml b/authenticator/src/main/res/values-ko-rKR/strings.xml index 696eb584a6..60115bf19c 100644 --- a/authenticator/src/main/res/values-ko-rKR/strings.xml +++ b/authenticator/src/main/res/values-ko-rKR/strings.xml @@ -116,7 +116,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-lt-rLT/strings.xml b/authenticator/src/main/res/values-lt-rLT/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-lt-rLT/strings.xml +++ b/authenticator/src/main/res/values-lt-rLT/strings.xml @@ -116,7 +116,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-lv-rLV/strings.xml b/authenticator/src/main/res/values-lv-rLV/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-lv-rLV/strings.xml +++ b/authenticator/src/main/res/values-lv-rLV/strings.xml @@ -116,7 +116,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-ml-rIN/strings.xml b/authenticator/src/main/res/values-ml-rIN/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-ml-rIN/strings.xml +++ b/authenticator/src/main/res/values-ml-rIN/strings.xml @@ -116,7 +116,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-mr-rIN/strings.xml b/authenticator/src/main/res/values-mr-rIN/strings.xml index 77c739ebbd..a8fbeb0ce2 100644 --- a/authenticator/src/main/res/values-mr-rIN/strings.xml +++ b/authenticator/src/main/res/values-mr-rIN/strings.xml @@ -116,7 +116,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-my-rMM/strings.xml b/authenticator/src/main/res/values-my-rMM/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-my-rMM/strings.xml +++ b/authenticator/src/main/res/values-my-rMM/strings.xml @@ -116,7 +116,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-nb-rNO/strings.xml b/authenticator/src/main/res/values-nb-rNO/strings.xml index 23334859c2..4781237bbf 100644 --- a/authenticator/src/main/res/values-nb-rNO/strings.xml +++ b/authenticator/src/main/res/values-nb-rNO/strings.xml @@ -116,7 +116,7 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Last ned nå 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 Sync with the Bitwarden app diff --git a/authenticator/src/main/res/values-ne-rNP/strings.xml b/authenticator/src/main/res/values-ne-rNP/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-ne-rNP/strings.xml +++ b/authenticator/src/main/res/values-ne-rNP/strings.xml @@ -116,7 +116,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-nl-rNL/strings.xml b/authenticator/src/main/res/values-nl-rNL/strings.xml index 22413d9178..9b4f04ad21 100644 --- a/authenticator/src/main/res/values-nl-rNL/strings.xml +++ b/authenticator/src/main/res/values-nl-rNL/strings.xml @@ -116,7 +116,7 @@ Sla al je logins op en synchroniseer verificatiecodes direct met de Authenticator app. Nu downloaden Synchroniseren met Bitwarden app - This feature is not yet available for self-hosted users. Learn more + Learn more Kan geen codes synchroniseren vanuit de Bitwarden app. Zorg ervoor dat beide apps up-to-date zijn. Je hebt nog steeds toegang tot je bestaande codes in de Bitwarden app. %1$s | %2$s Synchroniseren met de Bitwarden app diff --git a/authenticator/src/main/res/values-nn-rNO/strings.xml b/authenticator/src/main/res/values-nn-rNO/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-nn-rNO/strings.xml +++ b/authenticator/src/main/res/values-nn-rNO/strings.xml @@ -116,7 +116,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-or-rIN/strings.xml b/authenticator/src/main/res/values-or-rIN/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-or-rIN/strings.xml +++ b/authenticator/src/main/res/values-or-rIN/strings.xml @@ -116,7 +116,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-pl-rPL/strings.xml b/authenticator/src/main/res/values-pl-rPL/strings.xml index fd89048ab1..bd8b5e1f03 100644 --- a/authenticator/src/main/res/values-pl-rPL/strings.xml +++ b/authenticator/src/main/res/values-pl-rPL/strings.xml @@ -116,7 +116,7 @@ Przechowuj wszystkie swoje logowania i synchronizuj kody weryfikacyjne bezpośrednio z aplikacją Authenticator. Pobierz teraz Synchronizacja z aplikacją Bitwarden - Ta funkcja nie jest jeszcze dostępna dla użytkowników korzystających z hostingu samodzielnego. Dowiedz się więcej + Dowiedz się więcej Nie można zsynchronizować kodów z aplikacji Bitwarden. Upewnij się, że obie aplikacje są aktualne. Nadal możesz uzyskać dostęp do istniejących kodów w aplikacji Bitwarden. %1$s | %2$s Synchronizuj z aplikacją Bitwarden diff --git a/authenticator/src/main/res/values-pt-rBR/strings.xml b/authenticator/src/main/res/values-pt-rBR/strings.xml index 0e1e57e0e0..8e250eb78a 100644 --- a/authenticator/src/main/res/values-pt-rBR/strings.xml +++ b/authenticator/src/main/res/values-pt-rBR/strings.xml @@ -116,7 +116,7 @@ Armazene todos os seus logins e sincronize códigos de verificação diretamente com o app Autenticador. Baixe agora Sincronizar com o aplicativo Bitwarden - This feature is not yet available for self-hosted users. Learn more + Learn more Não é possível sincronizar os códigos do aplicativo Bitwarden. Certifique-se de que ambos os aplicativos estão atualizados. Você ainda pode acessar os códigos existentes no aplicativo Bitwarden. %1$s ├%2$s Sincronizar com o aplicativo Bitwarden diff --git a/authenticator/src/main/res/values-pt-rPT/strings.xml b/authenticator/src/main/res/values-pt-rPT/strings.xml index b71c24ea2f..a32ea354e4 100644 --- a/authenticator/src/main/res/values-pt-rPT/strings.xml +++ b/authenticator/src/main/res/values-pt-rPT/strings.xml @@ -116,7 +116,7 @@ Armazene todas as suas credenciais e sincronize os códigos de verificação diretamente com a app Authenticator. Descarregar agora Sincronizar com a app Bitwarden - Esta funcionalidade ainda não está disponível para utilizadores auto-hospedados. Saiba mais + Saber mais Não é possível sincronizar códigos da app Bitwarden. Certifique-se de que ambas as aplicações estão atualizadas. Ainda pode aceder aos seus códigos existentes na app Bitwarden. %1$s | %2$s (%3$d) Sincronizar com a app Bitwarden diff --git a/authenticator/src/main/res/values-ro-rRO/strings.xml b/authenticator/src/main/res/values-ro-rRO/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-ro-rRO/strings.xml +++ b/authenticator/src/main/res/values-ro-rRO/strings.xml @@ -116,7 +116,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-ru-rRU/strings.xml b/authenticator/src/main/res/values-ru-rRU/strings.xml index 66f29d8dcb..58c27d41ee 100644 --- a/authenticator/src/main/res/values-ru-rRU/strings.xml +++ b/authenticator/src/main/res/values-ru-rRU/strings.xml @@ -118,7 +118,7 @@ Храните все свои логины и синхронизируйте коды проверки непосредственно с приложением \"Аутентификатор\". Скачать сейчас Синхронизация с приложением Bitwarden - Эта функция пока недоступна для пользователей, использующих собственный хостинг. Узнать больше + Узнать больше Невозможно синхронизировать коды из приложения Bitwarden. Убедитесь, что оба приложения обновлены. Вы по-прежнему можете получить доступ к существующим кодам в приложении Bitwarden. %1$s | %2$s Синхронизация с приложением Bitwarden diff --git a/authenticator/src/main/res/values-si-rLK/strings.xml b/authenticator/src/main/res/values-si-rLK/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-si-rLK/strings.xml +++ b/authenticator/src/main/res/values-si-rLK/strings.xml @@ -116,7 +116,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-sk-rSK/strings.xml b/authenticator/src/main/res/values-sk-rSK/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-sk-rSK/strings.xml +++ b/authenticator/src/main/res/values-sk-rSK/strings.xml @@ -116,7 +116,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-sl-rSI/strings.xml b/authenticator/src/main/res/values-sl-rSI/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-sl-rSI/strings.xml +++ b/authenticator/src/main/res/values-sl-rSI/strings.xml @@ -116,7 +116,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-sr-rSP/strings.xml b/authenticator/src/main/res/values-sr-rSP/strings.xml index 7f4ab43ff4..6d38b46443 100644 --- a/authenticator/src/main/res/values-sr-rSP/strings.xml +++ b/authenticator/src/main/res/values-sr-rSP/strings.xml @@ -116,7 +116,7 @@ Чувајте све своје пријаве и синхронизујте верификационе кôдове директно са апликацијом Authenticator. Преузми сада Синхронизујте са апликацијом Bitwarden - This feature is not yet available for self-hosted users. Learn more + Learn more Није могуће синхронизовати кодове из апликације Bitwarden. Уверите се да су обе апликације ажуриране. И даље можете да приступите својим постојећим кодовима у апликацији Bitwarden. %1$s | %2$s Синхронизујте са апликацијом Bitwarden diff --git a/authenticator/src/main/res/values-sv-rSE/strings.xml b/authenticator/src/main/res/values-sv-rSE/strings.xml index fd71f7a265..3bdf5067ea 100644 --- a/authenticator/src/main/res/values-sv-rSE/strings.xml +++ b/authenticator/src/main/res/values-sv-rSE/strings.xml @@ -16,9 +16,9 @@ Namn Lägg till objektrotation Skanna en QR-kod - Skanna QR-kod + Skanna QR-kod Rikta din kamera mot QR-koden. - Kan inte skanna QR-koden? Ange nyckeln manuellt + Kan du inte skanna QR-koden? Ange nyckeln manuellt Ange nyckel manuellt. Kan inte lägga till authenticator-nyckeln? Nej tack @@ -59,7 +59,7 @@ Ljust Språket har ändrats till %1$s. Starta om appen för att aktivera ändringen Säkra dina konton med Bitwarden Authenticator - Få verifieringskoder för alla dina konton som stöder tvåstegsverifiering. + Få verifieringskoder för alla dina konton som har stöd för tvåstegsverifiering. Använd enhetens kamera för att skanna koder Skanna QR-koden i inställningarna för din tvåstegsverifiering för alla konton. Logga in med unika koder @@ -103,7 +103,7 @@ Filkälla Importera Import av valv lyckades - Nyckel är ogiltig. + Nyckeln är ogiltig. Favorit Favoriter Säkerhetskopiera @@ -116,17 +116,17 @@ Spara alla inloggningar och synkronisera verifieringskoder direkt med Authenticator-appen. Ladda ner nu Synkronisera med Bitwarden-appen - Denna funktion är ännu inte tillgänglig för användare med egen hosting. Läs mer + 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 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 + Någonting gick fel Försök igen Kopiera till Bitwarden-valv - Standardalternativ - Spara på Bitwarden + Spara alternativ som standard + Spara till Bitwarden Spara här Ingen Välj var du vill spara nya verifieringskoder. @@ -135,11 +135,11 @@ 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 + Lokala koder (%1$d) 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." + "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" + "Filen kunde inte behandlas. 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. diff --git a/authenticator/src/main/res/values-ta-rIN/strings.xml b/authenticator/src/main/res/values-ta-rIN/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-ta-rIN/strings.xml +++ b/authenticator/src/main/res/values-ta-rIN/strings.xml @@ -116,7 +116,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-te-rIN/strings.xml b/authenticator/src/main/res/values-te-rIN/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-te-rIN/strings.xml +++ b/authenticator/src/main/res/values-te-rIN/strings.xml @@ -116,7 +116,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-th-rTH/strings.xml b/authenticator/src/main/res/values-th-rTH/strings.xml index 371b0a15ac..a8ce7f09ec 100644 --- a/authenticator/src/main/res/values-th-rTH/strings.xml +++ b/authenticator/src/main/res/values-th-rTH/strings.xml @@ -116,7 +116,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-tr-rTR/strings.xml b/authenticator/src/main/res/values-tr-rTR/strings.xml index 50666b8532..e4640e1f1f 100644 --- a/authenticator/src/main/res/values-tr-rTR/strings.xml +++ b/authenticator/src/main/res/values-tr-rTR/strings.xml @@ -116,7 +116,7 @@ Tüm giriş bilgilerinizi saklayın ve doğrulama kodlarını doğrudan Authenticator uygulaması ile senkronize edin. Şimdi indir Bitwarden uygulaması ile senkronize et - Bu özellik, kendi kendine barındırılan kullanıcılar için henüz mevcut değil. Daha fazla bilgi edinin + Daha fazlasını öğren Bitwarden uygulamasından kodlar senkronize edilemiyor. Her iki uygulamanın da güncel olduğundan emin olun. Bitwarden uygulamasında mevcut kodlarınıza hala erişebilirsiniz. %1$s | %2$s Bitwarden uygulaması ile senkronize et diff --git a/authenticator/src/main/res/values-uk-rUA/strings.xml b/authenticator/src/main/res/values-uk-rUA/strings.xml index da107ede1f..78aa6c03d8 100644 --- a/authenticator/src/main/res/values-uk-rUA/strings.xml +++ b/authenticator/src/main/res/values-uk-rUA/strings.xml @@ -116,7 +116,7 @@ Зберігайте всі паролі та синхронізуйте коди підтвердження безпосередньо з програмою Authenticator. Завантажити Синхронізувати з програмою Bitwarden - Ця функція ще недоступна користувачам із власним розміщенням сховища. Докладніше + Докладніше Неможливо синхронізувати коди з програмою Bitwarden. Переконайтеся, що у вас найновіші версії обох програм. Ви все одно можете отримати доступ до наявних кодів у програмі Bitwarden. %1$s | %2$s (%3$d) Синхронізувати з програмою Bitwarden diff --git a/authenticator/src/main/res/values-vi-rVN/strings.xml b/authenticator/src/main/res/values-vi-rVN/strings.xml index 2fd7bbe7d2..6e57c963f3 100644 --- a/authenticator/src/main/res/values-vi-rVN/strings.xml +++ b/authenticator/src/main/res/values-vi-rVN/strings.xml @@ -116,7 +116,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-zh-rCN/strings.xml b/authenticator/src/main/res/values-zh-rCN/strings.xml index 671ce1307c..dd32cf9f22 100644 --- a/authenticator/src/main/res/values-zh-rCN/strings.xml +++ b/authenticator/src/main/res/values-zh-rCN/strings.xml @@ -117,7 +117,7 @@ 保存您所有的登录信息并直接与身份验证器 App 同步验证码。 现在就下载 与 Bitwarden App 同步 - This feature is not yet available for self-hosted users. Learn more + Learn more 无法从 Bitwarden App 同步代码,请确保这两个应用程序都是最新的。您仍然可以在 Bitwarden App 中访问您现有的代码。 %1$s | %2$s 与 Bitwarden App 同步 diff --git a/authenticator/src/main/res/values-zh-rTW/strings.xml b/authenticator/src/main/res/values-zh-rTW/strings.xml index db8b6450a8..8f5f2d2b60 100644 --- a/authenticator/src/main/res/values-zh-rTW/strings.xml +++ b/authenticator/src/main/res/values-zh-rTW/strings.xml @@ -116,7 +116,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) 與 Bitwarden 應用程式同步