Merge branch 'main' into pm-23278/kdf-upgrade-minimum

This commit is contained in:
André Bispo committed 2025-09-12 17:02:12 +01:00
commit d07e8f9ae2
144 files changed
+3701 -2302

No files matched your search

@@ -4,7 +4,7 @@ inputs:
java-version:
description: 'Java version to use'
required: false
default: '17'
default: '21'
runs:
using: 'composite'
steps:
+1 -1
View File
@@ -28,7 +28,7 @@ on:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
JAVA_VERSION: 17
JAVA_VERSION: 21
permissions:
contents: read
+1 -1
View File
@@ -28,7 +28,7 @@ on:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
JAVA_VERSION: 17
JAVA_VERSION: 21
GITHUB_ACTION_RUN_URL: "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
permissions:
+1 -1
View File
@@ -13,7 +13,7 @@ on:
workflow_dispatch:
env:
_JAVA_VERSION: 17
_JAVA_VERSION: 21
_GITHUB_ACTION_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}/attempts/${{ github.run_attempt }}
+3 -3
View File
@@ -52,12 +52,12 @@
Please avoid mixing formatting and logical changes in the same commit/PR. When possible, fix any large formatting issues in a separate PR before opening one to make logical changes to the same code. This helps others focus on the meaningful code changes when reviewing the code.
4. Setup JDK `Version` `17`:
4. Setup JDK `Version` `21`:
- Navigate to `Preferences > Build, Execution, Deployment > Build Tools > Gradle`.
- Hit the selected Gradle JDK next to `Gradle JDK:`.
- Select a `17.x` version or hit `Download JDK...` if not present.
- Select `Version` `17`.
- Select a `21.x` version or hit `Download JDK...` if not present.
- Select `Version` `21`.
- Select your preferred `Vendor`.
- Hit `Download`.
- Hit `Apply`.
+1 -1
View File
@@ -249,7 +249,7 @@
android:name="com.x8bit.bitwarden.AutofillTileService"
android:exported="true"
android:icon="@drawable/ic_notification"
android:label="@string/autofill"
android:label="@string/autofill_title"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"
tools:ignore="MissingClass">
<intent-filter>
@@ -27,6 +27,7 @@ import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import kotlinx.serialization.json.Json
import timber.log.Timber
import java.time.Clock
import java.time.ZoneOffset
import java.time.ZonedDateTime
@@ -129,8 +130,8 @@ class PushManagerImpl @Inject constructor(
@Suppress("LongMethod", "CyclomaticComplexMethod")
private fun onMessageReceived(notification: BitwardenNotification) {
if (authDiskSource.uniqueAppId == notification.contextId) return
val userId = activeUserId ?: return
Timber.d("Push Notification Received: ${notification.notificationType}")
when (val type = notification.notificationType) {
NotificationType.AUTH_REQUEST,
@@ -189,9 +190,14 @@ class PushManagerImpl @Inject constructor(
.decodeFromString<NotificationPayload.SyncCipherNotification>(
string = notification.payload,
)
.takeIf { isLoggedIn(userId) && it.userMatchesNotification(userId) }
?.cipherId
?.let { mutableSyncCipherDeleteSharedFlow.tryEmit(SyncCipherDeleteData(it)) }
.takeIf { it.userId != null && it.cipherId != null }
?.let {
SyncCipherDeleteData(
userId = requireNotNull(it.userId),
cipherId = requireNotNull(it.cipherId),
)
}
?.let { mutableSyncCipherDeleteSharedFlow.tryEmit(it) }
}
NotificationType.SYNC_CIPHERS,
@@ -226,9 +232,14 @@ class PushManagerImpl @Inject constructor(
.decodeFromString<NotificationPayload.SyncFolderNotification>(
string = notification.payload,
)
.takeIf { isLoggedIn(userId) && it.userMatchesNotification(userId) }
?.folderId
?.let { mutableSyncFolderDeleteSharedFlow.tryEmit(SyncFolderDeleteData(it)) }
.takeIf { it.userId != null && it.folderId != null }
?.let {
SyncFolderDeleteData(
userId = requireNotNull(it.userId),
folderId = requireNotNull(it.folderId),
)
}
?.let { mutableSyncFolderDeleteSharedFlow.tryEmit(it) }
}
NotificationType.SYNC_ORG_KEYS -> {
@@ -266,9 +277,14 @@ class PushManagerImpl @Inject constructor(
.decodeFromString<NotificationPayload.SyncSendNotification>(
string = notification.payload,
)
.takeIf { isLoggedIn(userId) && it.userMatchesNotification(userId) }
?.sendId
?.let { mutableSyncSendDeleteSharedFlow.tryEmit(SyncSendDeleteData(it)) }
.takeIf { it.userId != null && it.sendId != null }
?.let {
SyncSendDeleteData(
userId = requireNotNull(it.userId),
sendId = requireNotNull(it.sendId),
)
}
?.let { mutableSyncSendDeleteSharedFlow.tryEmit(it) }
}
}
}
@@ -2,9 +2,8 @@ package com.x8bit.bitwarden.data.platform.manager.model
/**
* Required data for sync cipher delete operations.
*
* @property cipherId The cipher ID.
*/
data class SyncCipherDeleteData(
val userId: String,
val cipherId: String,
)
@@ -2,9 +2,8 @@ package com.x8bit.bitwarden.data.platform.manager.model
/**
* Required data for sync folder delete operations.
*
* @property folderId The folder ID.
*/
data class SyncFolderDeleteData(
val userId: String,
val folderId: String,
)
@@ -2,9 +2,8 @@ package com.x8bit.bitwarden.data.platform.manager.model
/**
* Required data for sync send delete operations.
*
* @property sendId The send ID.
*/
data class SyncSendDeleteData(
val userId: String,
val sendId: String,
)
@@ -24,6 +24,14 @@ interface VaultDiskSource {
*/
suspend fun getCiphers(userId: String): List<SyncResponseJson.Cipher>
/**
* Retrieves all ciphers with the given [cipherIds] from the data source for a given [userId].
*/
suspend fun getSelectedCiphers(
userId: String,
cipherIds: List<String>,
): List<SyncResponseJson.Cipher>
/**
* Retrieves all ciphers from the data source for a given [userId] that contain TOTP codes.
*/
@@ -97,6 +97,24 @@ class VaultDiskSourceImpl(
}
}
override suspend fun getSelectedCiphers(
userId: String,
cipherIds: List<String>,
): List<SyncResponseJson.Cipher> {
val entities = ciphersDao.getSelectedCiphers(userId = userId, cipherIds = cipherIds)
return withContext(context = dispatcherManager.default) {
entities
.map { entity ->
async {
json.decodeFromStringWithErrorCallback<SyncResponseJson.Cipher>(
string = entity.cipherJson,
) { Timber.e(it, "Failed to deserialize Cipher in Vault") }
}
}
.awaitAll()
}
}
override suspend fun getTotpCiphers(userId: String): List<SyncResponseJson.Cipher> {
val entities = ciphersDao.getAllTotpCiphers(userId = userId)
return withContext(context = dispatcherManager.default) {
@@ -37,6 +37,15 @@ interface CiphersDao {
userId: String,
): List<CipherEntity>
/**
* Retrieves all ciphers from the database with the given [cipherIds] for a given [userId].
*/
@Query("SELECT * FROM ciphers WHERE user_id = :userId AND id IN (:cipherIds)")
suspend fun getSelectedCiphers(
userId: String,
cipherIds: List<String>,
): List<CipherEntity>
/**
* Retrieves all ciphers from the database for a given [userId].
*/
@@ -10,6 +10,7 @@ import com.bitwarden.core.UpdateKdfResponse
import com.bitwarden.core.UpdatePasswordResponse
import com.bitwarden.crypto.Kdf
import com.bitwarden.crypto.TrustDeviceResponse
import com.bitwarden.exporters.Account
import com.bitwarden.exporters.ExportFormat
import com.bitwarden.fido.Fido2CredentialAutofillView
import com.bitwarden.fido.PublicKeyCredentialAuthenticatorAssertionResponse
@@ -429,6 +430,23 @@ interface VaultSdkSource {
format: ExportFormat,
): Result<String>
/**
* Exports the users vault data to a CXF formatted string.
*/
suspend fun exportVaultDataToCxf(
userId: String,
account: Account,
ciphers: List<Cipher>,
): Result<String>
/**
* Imports the given CXF formatted [payload] into the users vault.
*
* @return Result of the import. If successful, a list of [Cipher]s deciphered from the CXF
* payload.
*/
suspend fun importCxf(userId: String, payload: String): Result<List<Cipher>>
/**
* Register a new FIDO 2 credential to a cipher.
*
@@ -11,6 +11,7 @@ import com.bitwarden.core.UpdatePasswordResponse
import com.bitwarden.crypto.Kdf
import com.bitwarden.crypto.TrustDeviceResponse
import com.bitwarden.data.manager.DispatcherManager
import com.bitwarden.exporters.Account
import com.bitwarden.exporters.ExportFormat
import com.bitwarden.fido.Fido2CredentialAutofillView
import com.bitwarden.fido.PublicKeyCredentialAuthenticatorAssertionResponse
@@ -492,6 +493,28 @@ class VaultSdkSourceImpl(
)
}
override suspend fun exportVaultDataToCxf(
userId: String,
account: Account,
ciphers: List<Cipher>,
): Result<String> = runCatchingWithLogs {
getClient(userId = userId)
.exporters()
.exportCxf(
account = account,
ciphers = ciphers,
)
}
override suspend fun importCxf(
userId: String,
payload: String,
): Result<List<Cipher>> = runCatchingWithLogs {
getClient(userId = userId)
.exporters()
.importCxf(payload = payload)
}
override suspend fun registerFido2Credential(
request: RegisterFido2CredentialRequest,
fido2CredentialStore: Fido2CredentialStore,
@@ -24,6 +24,7 @@ import com.x8bit.bitwarden.data.vault.repository.model.DeleteSendResult
import com.x8bit.bitwarden.data.vault.repository.model.DomainsData
import com.x8bit.bitwarden.data.vault.repository.model.ExportVaultDataResult
import com.x8bit.bitwarden.data.vault.repository.model.GenerateTotpResult
import com.x8bit.bitwarden.data.vault.repository.model.ImportCxfPayloadResult
import com.x8bit.bitwarden.data.vault.repository.model.RemovePasswordSendResult
import com.x8bit.bitwarden.data.vault.repository.model.SendData
import com.x8bit.bitwarden.data.vault.repository.model.SyncVaultDataResult
@@ -258,6 +259,20 @@ interface VaultRepository : CipherManager, VaultLockManager {
restrictedTypes: List<CipherType>,
): ExportVaultDataResult
/**
* Attempt to import a CXF payload.
*
* @param payload The CXF payload to import.
*/
suspend fun importCxfPayload(payload: String): ImportCxfPayloadResult
/**
* Attempt to export the vault data to a CXF file.
*
* @param ciphers Ciphers selected for export.
*/
suspend fun exportVaultDataToCxf(ciphers: List<CipherListView>): Result<String>
/**
* Flow that represents the data for a specific vault list item as found by ID. This may emit
* `null` if the item cannot be found.
@@ -73,6 +73,7 @@ import com.x8bit.bitwarden.data.vault.repository.model.DeleteSendResult
import com.x8bit.bitwarden.data.vault.repository.model.DomainsData
import com.x8bit.bitwarden.data.vault.repository.model.ExportVaultDataResult
import com.x8bit.bitwarden.data.vault.repository.model.GenerateTotpResult
import com.x8bit.bitwarden.data.vault.repository.model.ImportCxfPayloadResult
import com.x8bit.bitwarden.data.vault.repository.model.RemovePasswordSendResult
import com.x8bit.bitwarden.data.vault.repository.model.SendData
import com.x8bit.bitwarden.data.vault.repository.model.SyncVaultDataResult
@@ -82,7 +83,7 @@ import com.x8bit.bitwarden.data.vault.repository.model.UpdateSendResult
import com.x8bit.bitwarden.data.vault.repository.model.VaultData
import com.x8bit.bitwarden.data.vault.repository.model.VaultUnlockResult
import com.x8bit.bitwarden.data.vault.repository.util.sortAlphabetically
import com.x8bit.bitwarden.data.vault.repository.util.sortAlphabeticallyByType
import com.x8bit.bitwarden.data.vault.repository.util.sortAlphabeticallyByTypeAndOrganization
import com.x8bit.bitwarden.data.vault.repository.util.toDomainsData
import com.x8bit.bitwarden.data.vault.repository.util.toEncryptedNetworkFolder
import com.x8bit.bitwarden.data.vault.repository.util.toEncryptedNetworkSend
@@ -93,6 +94,7 @@ import com.x8bit.bitwarden.data.vault.repository.util.toEncryptedSdkFolder
import com.x8bit.bitwarden.data.vault.repository.util.toEncryptedSdkFolderList
import com.x8bit.bitwarden.data.vault.repository.util.toEncryptedSdkSend
import com.x8bit.bitwarden.data.vault.repository.util.toEncryptedSdkSendList
import com.x8bit.bitwarden.data.vault.repository.util.toSdkAccount
import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType
import com.x8bit.bitwarden.ui.vault.feature.vault.util.toFilteredList
import kotlinx.coroutines.CancellationException
@@ -114,7 +116,6 @@ import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.flow.merge
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.onStart
@@ -929,11 +930,9 @@ class VaultRepositoryImpl(
}
private suspend fun clearFolderIdFromCiphers(folderId: String, userId: String) {
vaultDiskSource.getCiphersFlow(userId).firstOrNull()?.forEach {
vaultDiskSource.getCiphers(userId = userId).forEach {
if (it.folderId == folderId) {
vaultDiskSource.saveCipher(
userId, it.copy(folderId = null),
)
vaultDiskSource.saveCipher(userId = userId, cipher = it.copy(folderId = null))
}
}
}
@@ -974,6 +973,42 @@ class VaultRepositoryImpl(
)
}
override suspend fun importCxfPayload(payload: String): ImportCxfPayloadResult {
val userId = activeUserId
?: return ImportCxfPayloadResult.Error(error = NoActiveUserException())
return vaultSdkSource
.importCxf(
userId = userId,
payload = payload,
)
.fold(
onSuccess = { ImportCxfPayloadResult.Success(it) },
onFailure = { ImportCxfPayloadResult.Error(error = it) },
)
}
override suspend fun exportVaultDataToCxf(
ciphers: List<CipherListView>,
): Result<String> {
val userId = activeUserId
?: return NoActiveUserException().asFailure()
val account = authDiskSource.userState
?.activeAccount
?.toSdkAccount()
?: return NoActiveUserException().asFailure()
val ciphers = vaultDiskSource
.getSelectedCiphers(userId = userId, cipherIds = ciphers.mapNotNull { it.id })
.map { it.toEncryptedSdkCipher() }
return vaultSdkSource
.exportVaultDataToCxf(
userId = userId,
account = account,
ciphers = ciphers,
)
}
/**
* Checks if the given [userId] has an associated encrypted PIN key but not a pin-protected user
* key. This indicates a scenario in which a user has requested PIN unlocking but requires
@@ -1168,7 +1203,11 @@ class VaultRepositoryImpl(
.fold(
onSuccess = { collections ->
DataState.Loaded(
collections.sortAlphabeticallyByType(),
collections.sortAlphabeticallyByTypeAndOrganization(
userOrganizations = authDiskSource
.getOrganizations(userId = userId)
.orEmpty(),
),
)
},
onFailure = { throwable -> DataState.Error(throwable) },
@@ -1246,12 +1285,9 @@ class VaultRepositoryImpl(
* Deletes the cipher specified by [syncCipherDeleteData] from disk.
*/
private suspend fun deleteCipher(syncCipherDeleteData: SyncCipherDeleteData) {
val userId = activeUserId ?: return
val cipherId = syncCipherDeleteData.cipherId
vaultDiskSource.deleteCipher(
userId = userId,
cipherId = cipherId,
userId = syncCipherDeleteData.userId,
cipherId = syncCipherDeleteData.cipherId,
)
}
@@ -1381,12 +1417,9 @@ class VaultRepositoryImpl(
* Deletes the send specified by [syncSendDeleteData] from disk.
*/
private suspend fun deleteSend(syncSendDeleteData: SyncSendDeleteData) {
val userId = activeUserId ?: return
val sendId = syncSendDeleteData.sendId
vaultDiskSource.deleteSend(
userId = userId,
sendId = sendId,
userId = syncSendDeleteData.userId,
sendId = syncSendDeleteData.sendId,
)
}
@@ -1401,15 +1434,14 @@ class VaultRepositoryImpl(
val isUpdate = syncSendUpsertData.isUpdate
val revisionDate = syncSendUpsertData.revisionDate
val localSend = sendDataStateFlow
.mapNotNull { it.data }
val localSend = vaultDiskSource
.getSends(userId = userId)
.first()
.sendViewList
.find { it.id == sendId }
val isValidCreate = !isUpdate && localSend == null
val isValidUpdate = isUpdate &&
localSend != null &&
localSend.revisionDate.epochSecond < revisionDate.toEpochSecond()
localSend.revisionDate.toEpochSecond() < revisionDate.toEpochSecond()
if (!isValidCreate && !isValidUpdate) return
@@ -1432,16 +1464,13 @@ class VaultRepositoryImpl(
* Deletes the folder specified by [syncFolderDeleteData] from disk.
*/
private suspend fun deleteFolder(syncFolderDeleteData: SyncFolderDeleteData) {
val userId = activeUserId ?: return
val folderId = syncFolderDeleteData.folderId
clearFolderIdFromCiphers(
folderId = folderId,
userId = userId,
folderId = syncFolderDeleteData.folderId,
userId = syncFolderDeleteData.userId,
)
vaultDiskSource.deleteFolder(
folderId = folderId,
userId = userId,
folderId = syncFolderDeleteData.folderId,
userId = syncFolderDeleteData.userId,
)
}
@@ -1454,21 +1483,20 @@ class VaultRepositoryImpl(
val folderId = syncFolderUpsertData.folderId
val isUpdate = syncFolderUpsertData.isUpdate
val revisionDate = syncFolderUpsertData.revisionDate
val localFolder = foldersStateFlow
.mapNotNull { it.data }
val localFolder = vaultDiskSource
.getFolders(userId = userId)
.first()
.find { it.id == folderId }
val isValidCreate = !isUpdate && localFolder == null
val isValidUpdate = isUpdate &&
localFolder != null &&
localFolder.revisionDate.epochSecond < revisionDate.toEpochSecond()
localFolder.revisionDate.toEpochSecond() < revisionDate.toEpochSecond()
if (!isValidCreate && !isValidUpdate) return
folderService
.getFolder(folderId)
.onSuccess { vaultDiskSource.saveFolder(userId, it) }
.getFolder(folderId = folderId)
.onSuccess { vaultDiskSource.saveFolder(userId = userId, folder = it) }
}
//endregion Push Notification helpers
@@ -0,0 +1,21 @@
package com.x8bit.bitwarden.data.vault.repository.model
import com.bitwarden.vault.Cipher
/**
* Models result of the vault data being imported from a CXF payload.
*/
sealed class ImportCxfPayloadResult {
/**
* The vault data has been successfully imported.
*/
data class Success(val ciphers: List<Cipher>) : ImportCxfPayloadResult()
/**
* There was an error importing the vault data.
*
* @param error The error that occurred during import.
*/
data class Error(val error: Throwable) : ImportCxfPayloadResult()
}
@@ -0,0 +1,13 @@
package com.x8bit.bitwarden.data.vault.repository.util
import com.bitwarden.exporters.Account
import com.x8bit.bitwarden.data.auth.datasource.disk.model.AccountJson
/**
* Converts a [AccountJson] to a [Account] for use in the SDK.
*/
fun AccountJson.toSdkAccount(): Account = Account(
id = profile.userId,
email = profile.email,
name = profile.name,
)
@@ -32,21 +32,45 @@ fun List<SyncResponseJson.Collection>.toEncryptedSdkCollectionList(): List<Colle
map { it.toEncryptedSdkCollection() }
/**
* Sorts the collections, grouping them by type, with `DEFAULT_USER_COLLECTION` types displayed
* first. Within each group, collections are sorted alphabetically by name.
* Sorts a list of [CollectionView] objects based on a multi-level sorting logic.
*
* The sorting criteria are as follows, in order of precedence:
* 1. Collections of type `DEFAULT_USER_COLLECTION` are placed first.
* 2. All other collections are grouped by their `CollectionType`.
* 3. Within each group, collections are sorted alphabetically by name. For collections of
* type `DEFAULT_USER_COLLECTION`, the corresponding organization's name is used for sorting
* instead of the collection's own name.
*
* This function uses a [SpecialCharWithPrecedenceComparator] for the alphabetical sort.
*
* @param userOrganizations A list of the user's organizations, used to find the name for
* `DEFAULT_USER_COLLECTION` types.
* @return A new list containing the sorted [CollectionView] objects.
*/
@JvmName("toAlphabeticallySortedCollectionList")
fun List<CollectionView>.sortAlphabeticallyByType(): List<CollectionView> {
fun List<CollectionView>.sortAlphabeticallyByTypeAndOrganization(
userOrganizations: List<SyncResponseJson.Profile.Organization>,
): List<CollectionView> {
return this.sortedWith(
// DEFAULT_USER_COLLECTION come first
comparator = compareBy<CollectionView> { it.type != CollectionType.DEFAULT_USER_COLLECTION }
// Then sort by other CollectionType ordinals
.thenBy { it.type }
// Finally, sort by name within each group
.thenComparing(
CollectionView::name,
SpecialCharWithPrecedenceComparator,
),
// Finally, sort within each group. For default collections, use the
// organization's name; for others, use the collection's name.
.thenBy(SpecialCharWithPrecedenceComparator) {
if (it.type == CollectionType.DEFAULT_USER_COLLECTION) {
// For default collections, sort by the organization's name
userOrganizations
.find { org -> org.id == it.organizationId }
?.name
?: it.name
} else {
// For other collections, sort by the collection's name
it.name
}
}
// As a final fallback if names are identical, sort by ID to ensure a stable order
.thenBy { it.id },
)
}
@@ -5,8 +5,10 @@ import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import com.bitwarden.ui.platform.base.BaseViewModel
import com.bitwarden.ui.platform.base.util.isValidEmail
import com.bitwarden.ui.platform.resource.BitwardenPlurals
import com.bitwarden.ui.platform.resource.BitwardenString
import com.bitwarden.ui.util.Text
import com.bitwarden.ui.util.asPluralsText
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus
import com.x8bit.bitwarden.data.auth.datasource.sdk.model.PasswordStrength
@@ -321,8 +323,11 @@ class CompleteRegistrationViewModel @Inject constructor(
it.copy(
dialog = CompleteRegistrationDialog.Error(
title = BitwardenString.an_error_has_occurred.asText(),
message = BitwardenString.master_password_length_val_message_x
.asText(MIN_PASSWORD_LENGTH),
message = BitwardenPlurals.master_password_length_val_message_x
.asPluralsText(
quantity = MIN_PASSWORD_LENGTH,
args = arrayOf(MIN_PASSWORD_LENGTH),
),
),
)
}
@@ -24,11 +24,12 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.drawBehind
import androidx.compose.ui.graphics.TransformOrigin
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.bitwarden.ui.platform.components.util.rememberVectorPainter
import com.bitwarden.ui.platform.resource.BitwardenDrawable
import com.bitwarden.ui.platform.resource.BitwardenPlurals
import com.bitwarden.ui.platform.resource.BitwardenString
import com.bitwarden.ui.platform.theme.BitwardenTheme
import com.bitwarden.ui.util.asText
@@ -154,7 +155,11 @@ private fun MinimumCharacterCount(
}
Spacer(modifier = Modifier.width(2.dp))
Text(
text = stringResource(BitwardenString.minimum_characters, minimumCharacterCount),
text = pluralStringResource(
id = BitwardenPlurals.minimum_characters,
count = minimumCharacterCount,
formatArgs = arrayOf(minimumCharacterCount),
),
color = BitwardenTheme.colorScheme.text.secondary,
style = BitwardenTheme.typography.labelSmall,
)
@@ -5,8 +5,10 @@ import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import com.bitwarden.ui.platform.base.BaseViewModel
import com.bitwarden.ui.platform.base.util.orNullIfBlank
import com.bitwarden.ui.platform.resource.BitwardenPlurals
import com.bitwarden.ui.platform.resource.BitwardenString
import com.bitwarden.ui.util.Text
import com.bitwarden.ui.util.asPluralsText
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.data.auth.datasource.disk.model.ForcePasswordResetReason
import com.x8bit.bitwarden.data.auth.datasource.sdk.model.PasswordStrength
@@ -199,8 +201,11 @@ class ResetPasswordViewModel @Inject constructor(
it.copy(
dialogState = ResetPasswordState.DialogState.Error(
title = BitwardenString.an_error_has_occurred.asText(),
message = BitwardenString.master_password_length_val_message_x
.asText(MIN_PASSWORD_LENGTH),
message = BitwardenPlurals.master_password_length_val_message_x
.asPluralsText(
quantity = MIN_PASSWORD_LENGTH,
args = arrayOf(MIN_PASSWORD_LENGTH),
),
),
)
}
@@ -4,8 +4,10 @@ import android.os.Parcelable
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import com.bitwarden.ui.platform.base.BaseViewModel
import com.bitwarden.ui.platform.resource.BitwardenPlurals
import com.bitwarden.ui.platform.resource.BitwardenString
import com.bitwarden.ui.util.Text
import com.bitwarden.ui.util.asPluralsText
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.data.auth.repository.AuthRepository
import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason
@@ -111,8 +113,11 @@ class SetPasswordViewModel @Inject constructor(
it.copy(
dialogState = SetPasswordState.DialogState.Error(
title = BitwardenString.an_error_has_occurred.asText(),
message = BitwardenString.master_password_length_val_message_x
.asText(MIN_PASSWORD_LENGTH),
message = BitwardenPlurals.master_password_length_val_message_x
.asPluralsText(
quantity = MIN_PASSWORD_LENGTH,
args = arrayOf(MIN_PASSWORD_LENGTH),
),
),
)
}
@@ -219,7 +219,7 @@ private fun AutofillSelectionDialog(
selectionItems = {
if (AutofillSelectionOption.AUTOFILL in displayItem.autofillSelectionOptions) {
BitwardenBasicDialogRow(
text = stringResource(id = BitwardenString.autofill),
text = stringResource(id = BitwardenString.autofill_title),
onClick = {
selectionCallback(
displayItem,
@@ -241,7 +241,7 @@ enum class Settings(
testTag = "AccountSecuritySettingsButton",
),
AUTO_FILL(
text = BitwardenString.autofill.asText(),
text = BitwardenString.autofill_title.asText(),
vectorIconRes = BitwardenDrawable.ic_check_mark,
testTag = "AutofillSettingsButton",
),
@@ -141,7 +141,7 @@ fun AutoFillScreen(
.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = {
BitwardenTopAppBar(
title = stringResource(id = BitwardenString.autofill),
title = stringResource(id = BitwardenString.autofill_title),
scrollBehavior = scrollBehavior,
navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_back),
navigationIconContentDescription = stringResource(id = BitwardenString.back),
@@ -187,7 +187,7 @@ private fun AutoFillScreenContent(
)
}
BitwardenListHeaderText(
label = stringResource(id = BitwardenString.autofill),
label = stringResource(id = BitwardenString.autofill_title),
modifier = Modifier
.fillMaxWidth()
.standardHorizontalMargin()
@@ -24,6 +24,7 @@ import com.bitwarden.ui.platform.components.navigation.model.NavigationItem
import com.bitwarden.ui.platform.components.scaffold.BitwardenScaffold
import com.bitwarden.ui.platform.components.scaffold.model.ScaffoldNavigationData
import com.bitwarden.ui.platform.theme.RootTransitionProviders
import com.bitwarden.ui.platform.util.toObjectNavigationRoute
import com.x8bit.bitwarden.ui.platform.components.util.rememberBitwardenNavController
import com.x8bit.bitwarden.ui.platform.feature.search.model.SearchType
import com.x8bit.bitwarden.ui.platform.feature.settings.about.navigateToAbout
@@ -272,14 +273,15 @@ private fun VaultUnlockedNavBarScaffold(
* If direct navigation is required, the [navigate] lambda will be invoked with the appropriate
* [NavOptions].
*/
@Suppress("MaxLineLength")
private fun NavController.navigateToTabOrRoot(
tabToNavigateTo: VaultUnlockedNavBarTab,
navigate: (NavOptions) -> Unit,
) {
if (tabToNavigateTo.startDestinationRoute == currentDestination?.route) {
if (tabToNavigateTo.startDestinationRoute.toObjectNavigationRoute() == currentDestination?.route) {
// We are at the start destination already, so nothing to do.
return
} else if (currentDestination?.parent?.route == tabToNavigateTo.graphRoute) {
} else if (currentDestination?.parent?.route == tabToNavigateTo.graphRoute.toObjectNavigationRoute()) {
// We are not at the start destination but we are in the correct graph,
// so lets pop up to the start destination.
popBackStack(route = tabToNavigateTo.startDestinationRoute, inclusive = false)
@@ -300,8 +302,8 @@ private fun NavController.navigateToTabOrRoot(
/**
* Determine if the current destination is the same as the given tab.
*/
private fun NavBackStackEntry?.isCurrentRoute(route: String): Boolean =
private fun NavBackStackEntry?.isCurrentRoute(route: Any): Boolean =
this
?.destination
?.hierarchy
?.any { it.route == route } == true
?.any { it.route == route.toObjectNavigationRoute() } == true
@@ -4,7 +4,6 @@ import android.os.Parcelable
import com.bitwarden.ui.platform.components.navigation.model.NavigationItem
import com.bitwarden.ui.platform.resource.BitwardenDrawable
import com.bitwarden.ui.platform.resource.BitwardenString
import com.bitwarden.ui.platform.util.toObjectNavigationRoute
import com.x8bit.bitwarden.ui.platform.feature.settings.SettingsGraphRoute
import com.x8bit.bitwarden.ui.platform.feature.settings.SettingsRoute
import com.x8bit.bitwarden.ui.tools.feature.generator.GeneratorGraphRoute
@@ -35,8 +34,8 @@ sealed class VaultUnlockedNavBarTab : NavigationItem, Parcelable {
override val iconRes get() = BitwardenDrawable.ic_generator
override val labelRes get() = BitwardenString.generator
override val contentDescriptionRes get() = BitwardenString.generator
override val graphRoute get() = GeneratorGraphRoute.toObjectNavigationRoute()
override val startDestinationRoute get() = GeneratorRoute.Standard.toObjectNavigationRoute()
override val graphRoute get() = GeneratorGraphRoute
override val startDestinationRoute get() = GeneratorRoute.Standard
override val testTag get() = "GeneratorTab"
override val notificationCount get() = 0
}
@@ -50,8 +49,8 @@ sealed class VaultUnlockedNavBarTab : NavigationItem, Parcelable {
override val iconRes get() = BitwardenDrawable.ic_send
override val labelRes get() = BitwardenString.send
override val contentDescriptionRes get() = BitwardenString.send
override val graphRoute get() = SendGraphRoute.toObjectNavigationRoute()
override val startDestinationRoute get() = SendRoute.toObjectNavigationRoute()
override val graphRoute get() = SendGraphRoute
override val startDestinationRoute get() = SendRoute
override val testTag get() = "SendTab"
override val notificationCount get() = 0
}
@@ -66,8 +65,8 @@ sealed class VaultUnlockedNavBarTab : NavigationItem, Parcelable {
) : VaultUnlockedNavBarTab() {
override val iconResSelected get() = BitwardenDrawable.ic_vault_filled
override val iconRes get() = BitwardenDrawable.ic_vault
override val graphRoute get() = VaultGraphRoute.toObjectNavigationRoute()
override val startDestinationRoute get() = VaultRoute.toObjectNavigationRoute()
override val graphRoute get() = VaultGraphRoute
override val startDestinationRoute get() = VaultRoute
override val testTag get() = "VaultTab"
override val notificationCount get() = 0
}
@@ -83,8 +82,8 @@ sealed class VaultUnlockedNavBarTab : NavigationItem, Parcelable {
override val iconRes get() = BitwardenDrawable.ic_settings
override val labelRes get() = BitwardenString.settings
override val contentDescriptionRes get() = BitwardenString.settings
override val graphRoute get() = SettingsGraphRoute.toObjectNavigationRoute()
override val startDestinationRoute get() = SettingsRoute.Standard.toObjectNavigationRoute()
override val graphRoute get() = SettingsGraphRoute
override val startDestinationRoute get() = SettingsRoute.Standard
override val testTag get() = "SettingsTab"
}
}
@@ -14,8 +14,10 @@ import com.bitwarden.network.model.PolicyTypeJson
import com.bitwarden.ui.platform.base.BackgroundEvent
import com.bitwarden.ui.platform.base.BaseViewModel
import com.bitwarden.ui.platform.components.snackbar.model.BitwardenSnackbarData
import com.bitwarden.ui.platform.resource.BitwardenPlurals
import com.bitwarden.ui.platform.resource.BitwardenString
import com.bitwarden.ui.util.Text
import com.bitwarden.ui.util.asPluralsText
import com.bitwarden.ui.util.asText
import com.bitwarden.vault.CipherView
import com.bitwarden.vault.DecryptCipherListResult
@@ -1945,7 +1947,11 @@ class VaultAddEditViewModel @Inject constructor(
is BreachCountResult.Success -> {
VaultAddEditState.DialogState.Generic(
message = if (result.breachCount > 0) {
BitwardenString.password_exposed.asText(result.breachCount)
BitwardenPlurals.password_exposed
.asPluralsText(
quantity = result.breachCount,
args = arrayOf(result.breachCount),
)
} else {
BitwardenString.password_safe.asText()
},
@@ -13,8 +13,10 @@ import com.bitwarden.ui.platform.base.BackgroundEvent
import com.bitwarden.ui.platform.base.BaseViewModel
import com.bitwarden.ui.platform.components.icon.model.IconData
import com.bitwarden.ui.platform.components.snackbar.model.BitwardenSnackbarData
import com.bitwarden.ui.platform.resource.BitwardenPlurals
import com.bitwarden.ui.platform.resource.BitwardenString
import com.bitwarden.ui.util.Text
import com.bitwarden.ui.util.asPluralsText
import com.bitwarden.ui.util.asText
import com.bitwarden.ui.util.concat
import com.bitwarden.vault.CipherView
@@ -978,7 +980,10 @@ class VaultItemViewModel @Inject constructor(
is BreachCountResult.Success -> {
VaultItemState.DialogState.Generic(
message = if (result.breachCount > 0) {
BitwardenString.password_exposed.asText(result.breachCount)
BitwardenPlurals.password_exposed.asPluralsText(
quantity = result.breachCount,
args = arrayOf(result.breachCount),
)
} else {
BitwardenString.password_safe.asText()
},
@@ -2513,6 +2513,7 @@ class VaultItemListingViewModel @Inject constructor(
decryptCipherListResult = vaultData.decryptCipherListResult.copy(
successes = vaultData.decryptCipherListResult.successes
.filter { it.type is CipherListViewType.Card },
failures = emptyList(),
),
)
}
@@ -2530,6 +2531,7 @@ class VaultItemListingViewModel @Inject constructor(
cipherListViews = vaultData.decryptCipherListResult.successes,
matchUri = matchUri,
),
failures = emptyList(),
),
)
}
@@ -2553,6 +2555,7 @@ class VaultItemListingViewModel @Inject constructor(
cipherListViews = vaultData.decryptCipherListResult.successes,
matchUri = matchUri,
),
failures = emptyList(),
),
)
}
@@ -2574,6 +2577,7 @@ class VaultItemListingViewModel @Inject constructor(
searchTypeData = SearchTypeData.Vault.Logins,
searchTerm = query,
),
failures = emptyList(),
),
)
}
@@ -913,7 +913,9 @@ class VaultViewModel @Inject constructor(
updateVaultState(
vaultData = vaultData.data,
dialog = if (shouldShowDecryptionAlert) {
dialog = if (shouldShowDecryptionAlert ||
state.dialog is VaultState.DialogState.VaultLoadCipherDecryptionError
) {
VaultState.DialogState.VaultLoadCipherDecryptionError(
title = BitwardenString.decryption_error.asText(),
cipherCount = vaultData.data.decryptCipherListResult.failures.size,
@@ -237,6 +237,7 @@ class PushManagerTest {
pushManager.onMessageReceived(SYNC_CIPHER_DELETE_NOTIFICATION_MAP)
assertEquals(
SyncCipherDeleteData(
userId = "078966a2-93c2-4618-ae2a-0a2394c88d37",
cipherId = "aab5cdcc-f4a7-4e65-bf6d-5e0eab052321",
),
awaitItem(),
@@ -285,6 +286,7 @@ class PushManagerTest {
pushManager.onMessageReceived(SYNC_FOLDER_DELETE_NOTIFICATION_MAP)
assertEquals(
SyncFolderDeleteData(
userId = "078966a2-93c2-4618-ae2a-0a2394c88d37",
folderId = "aab5cdcc-f4a7-4e65-bf6d-5e0eab052321",
),
awaitItem(),
@@ -315,6 +317,7 @@ class PushManagerTest {
pushManager.onMessageReceived(SYNC_LOGIN_DELETE_NOTIFICATION_MAP)
assertEquals(
SyncCipherDeleteData(
userId = "078966a2-93c2-4618-ae2a-0a2394c88d37",
cipherId = "aab5cdcc-f4a7-4e65-bf6d-5e0eab052321",
),
awaitItem(),
@@ -343,6 +346,7 @@ class PushManagerTest {
pushManager.onMessageReceived(SYNC_SEND_DELETE_NOTIFICATION_MAP)
assertEquals(
SyncSendDeleteData(
userId = "078966a2-93c2-4618-ae2a-0a2394c88d37",
sendId = "aab5cdcc-f4a7-4e65-bf6d-5e0eab052321",
),
awaitItem(),
@@ -403,7 +407,13 @@ class PushManagerTest {
fun `onMessageReceived with sync cipher delete does nothing`() = runTest {
pushManager.syncCipherDeleteFlow.test {
pushManager.onMessageReceived(SYNC_CIPHER_DELETE_NOTIFICATION_MAP)
expectNoEvents()
assertEquals(
SyncCipherDeleteData(
userId = "078966a2-93c2-4618-ae2a-0a2394c88d37",
cipherId = "aab5cdcc-f4a7-4e65-bf6d-5e0eab052321",
),
awaitItem(),
)
}
}
@@ -424,12 +434,19 @@ class PushManagerTest {
}
@Test
fun `onMessageReceived with sync folder delete does nothing`() = runTest {
pushManager.syncFolderDeleteFlow.test {
pushManager.onMessageReceived(SYNC_FOLDER_DELETE_NOTIFICATION_MAP)
expectNoEvents()
fun `onMessageReceived with sync folder delete emits to syncFolderDeleteFlow`() =
runTest {
pushManager.syncFolderDeleteFlow.test {
pushManager.onMessageReceived(SYNC_FOLDER_DELETE_NOTIFICATION_MAP)
assertEquals(
SyncFolderDeleteData(
userId = "078966a2-93c2-4618-ae2a-0a2394c88d37",
folderId = "aab5cdcc-f4a7-4e65-bf6d-5e0eab052321",
),
awaitItem(),
)
}
}
}
@Test
fun `onMessageReceived with sync folder update does nothing`() = runTest {
@@ -440,12 +457,19 @@ class PushManagerTest {
}
@Test
fun `onMessageReceived with sync login delete does nothing`() = runTest {
pushManager.syncCipherDeleteFlow.test {
pushManager.onMessageReceived(SYNC_LOGIN_DELETE_NOTIFICATION_MAP)
expectNoEvents()
fun `onMessageReceived with sync login delete emits to syncCipherDeleteFlow`() =
runTest {
pushManager.syncCipherDeleteFlow.test {
pushManager.onMessageReceived(SYNC_LOGIN_DELETE_NOTIFICATION_MAP)
assertEquals(
SyncCipherDeleteData(
userId = "078966a2-93c2-4618-ae2a-0a2394c88d37",
cipherId = "aab5cdcc-f4a7-4e65-bf6d-5e0eab052321",
),
awaitItem(),
)
}
}
}
@Test
fun `onMessageReceived with sync send create does nothing`() = runTest {
@@ -456,10 +480,16 @@ class PushManagerTest {
}
@Test
fun `onMessageReceived with sync send delete does nothing`() = runTest {
fun `onMessageReceived with sync send delete emits to syncSendDeleteFlow`() = runTest {
pushManager.syncSendDeleteFlow.test {
pushManager.onMessageReceived(SYNC_SEND_DELETE_NOTIFICATION_MAP)
expectNoEvents()
assertEquals(
SyncSendDeleteData(
userId = "078966a2-93c2-4618-ae2a-0a2394c88d37",
sendId = "aab5cdcc-f4a7-4e65-bf6d-5e0eab052321",
),
awaitItem(),
)
}
}
@@ -105,6 +105,22 @@ class VaultDiskSourceTest {
assertEquals(ciphers, result2)
}
@Test
fun `getSelectedCiphers should return selected CiphersDao ciphers`() = runTest {
val cipherEntities = listOf(
CIPHER_ENTITY,
CIPHER_ENTITY.copy(id = "otherCipherId"),
)
val ciphers = listOf(CIPHER_1)
val cipherIds = listOf("mockId-1")
val result1 = vaultDiskSource.getSelectedCiphers(USER_ID, cipherIds)
assertEquals(emptyList<SyncResponseJson.Cipher>(), result1)
ciphersDao.insertCiphers(cipherEntities)
val result2 = vaultDiskSource.getSelectedCiphers(USER_ID, cipherIds)
assertEquals(ciphers, result2)
}
@Test
fun `getTotpCiphers should return all CiphersDao totp ciphers`() = runTest {
val cipherEntities = listOf(
@@ -41,6 +41,12 @@ class FakeCiphersDao : CiphersDao {
override suspend fun getAllCiphers(userId: String): List<CipherEntity> =
storedCiphers.filter { it.userId == userId }
override suspend fun getSelectedCiphers(
userId: String,
cipherIds: List<String>,
): List<CipherEntity> =
storedCiphers.filter { it.userId == userId && it.id in cipherIds }
override suspend fun getAllTotpCiphers(userId: String): List<CipherEntity> =
storedCiphers.filter { it.userId == userId && it.hasTotp }
@@ -15,6 +15,7 @@ import com.bitwarden.core.data.util.asSuccess
import com.bitwarden.crypto.Kdf
import com.bitwarden.crypto.TrustDeviceResponse
import com.bitwarden.data.datasource.disk.base.FakeDispatcherManager
import com.bitwarden.exporters.Account
import com.bitwarden.exporters.ExportFormat
import com.bitwarden.fido.ClientData
import com.bitwarden.fido.Fido2CredentialAutofillView
@@ -1135,6 +1136,69 @@ class VaultSdkSourceTest {
)
}
@Test
fun `exportVaultDataToCxf should call SDK and return a Result with the correct data`() =
runTest {
val userId = "userId"
val account = mockk<Account>()
val ciphers = listOf(createMockSdkCipher(1))
val expected = "TestResult"
coEvery {
clientExporters.exportCxf(
account = account,
ciphers = ciphers,
)
} returns expected
val result = vaultSdkSource.exportVaultDataToCxf(
userId = userId,
account = account,
ciphers = ciphers,
)
coVerify {
clientExporters.exportCxf(
account = account,
ciphers = ciphers,
)
}
assertEquals(
expected.asSuccess(),
result,
)
}
@Test
fun `importCxf should call SDK and return a Result with the correct data`() = runTest {
val userId = "userId"
val expected = listOf(createMockSdkCipher(number = 1))
val cxf = "cxf"
coEvery {
clientExporters.importCxf(
payload = cxf,
)
} returns expected
val result = vaultSdkSource.importCxf(
userId = userId,
payload = cxf,
)
coVerify {
clientExporters.importCxf(
payload = cxf,
)
}
assertEquals(
expected.asSuccess(),
result,
)
}
@Suppress("MaxLineLength")
@Test
fun `registerFido2Credential should return attestation response when registration completes`() =
@@ -0,0 +1,16 @@
package com.x8bit.bitwarden.data.vault.datasource.sdk.model
import com.bitwarden.exporters.Account
/**
* Creates a mock [com.bitwarden.exporters.Account] for testing purposes
*/
fun createMockAccount(
number: Int,
email: String = "mockEmail-$number",
name: String? = "mockName-$number",
): Account = Account(
id = "mockId-$number",
email = email,
name = name,
)
@@ -71,6 +71,8 @@ import com.x8bit.bitwarden.data.platform.manager.model.SyncSendUpsertData
import com.x8bit.bitwarden.data.vault.datasource.disk.VaultDiskSource
import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.InitializeCryptoResult
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockAccount
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.createMockCollectionView
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockDecryptCipherListResult
@@ -92,6 +94,7 @@ import com.x8bit.bitwarden.data.vault.repository.model.DeleteSendResult
import com.x8bit.bitwarden.data.vault.repository.model.DomainsData
import com.x8bit.bitwarden.data.vault.repository.model.ExportVaultDataResult
import com.x8bit.bitwarden.data.vault.repository.model.GenerateTotpResult
import com.x8bit.bitwarden.data.vault.repository.model.ImportCxfPayloadResult
import com.x8bit.bitwarden.data.vault.repository.model.RemovePasswordSendResult
import com.x8bit.bitwarden.data.vault.repository.model.SendData
import com.x8bit.bitwarden.data.vault.repository.model.SyncVaultDataResult
@@ -2834,46 +2837,26 @@ class VaultRepositoryTest {
fun `DeleteFolder with folderService Delete success should return DeleteFolderResult Success and update ciphers`() =
runTest {
fakeAuthDiskSource.userState = MOCK_USER_STATE
val userId = MOCK_USER_STATE.activeUserId
val folderId = "mockFolderId-1"
val mockCipher = createMockCipher(number = 1)
val ciphers = listOf(mockCipher, createMockCipher(number = 2))
coEvery { folderService.deleteFolder(folderId) } returns Unit.asSuccess()
coEvery {
vaultDiskSource.deleteFolder(
MOCK_USER_STATE.activeUserId,
folderId,
)
} just runs
val mockCipher = createMockCipher(1)
val mutableCiphersStateFlow =
MutableStateFlow(
listOf(
mockCipher,
createMockCipher(2),
),
)
coEvery {
vaultDiskSource.getCiphersFlow(MOCK_USER_STATE.activeUserId)
} returns mutableCiphersStateFlow
coEvery { vaultDiskSource.deleteFolder(userId = userId, folderId = folderId) } just runs
coEvery { vaultDiskSource.getCiphers(userId = userId) } returns ciphers
coEvery {
vaultDiskSource.saveCipher(
MOCK_USER_STATE.activeUserId,
mockCipher.copy(
folderId = null,
),
userId = userId,
cipher = mockCipher.copy(folderId = null),
)
} just runs
val result = vaultRepository.deleteFolder(folderId)
val result = vaultRepository.deleteFolder(folderId = folderId)
coVerify(exactly = 1) {
vaultDiskSource.saveCipher(
MOCK_USER_STATE.activeUserId,
mockCipher.copy(
folderId = null,
),
userId = userId,
cipher = mockCipher.copy(folderId = null),
)
}
@@ -3337,11 +3320,10 @@ class VaultRepositoryTest {
val userId = "mockId-1"
val cipherId = "mockId-1"
fakeAuthDiskSource.userState = MOCK_USER_STATE
coEvery { vaultDiskSource.deleteCipher(userId = userId, cipherId = cipherId) } just runs
mutableSyncCipherDeleteFlow.tryEmit(
SyncCipherDeleteData(cipherId = cipherId),
SyncCipherDeleteData(userId = userId, cipherId = cipherId),
)
coVerify { vaultDiskSource.deleteCipher(userId = userId, cipherId = cipherId) }
@@ -3679,13 +3661,9 @@ class VaultRepositoryTest {
fun `syncSendDeleteFlow should delete send from disk`() {
val userId = "mockId-1"
val sendId = "mockId-1"
fakeAuthDiskSource.userState = MOCK_USER_STATE
coEvery { vaultDiskSource.deleteSend(userId = userId, sendId = sendId) } just runs
mutableSyncSendDeleteFlow.tryEmit(
SyncSendDeleteData(sendId = sendId),
)
mutableSyncSendDeleteFlow.tryEmit(SyncSendDeleteData(userId = userId, sendId = sendId))
coVerify { vaultDiskSource.deleteSend(userId = userId, sendId = sendId) }
}
@@ -3813,53 +3791,37 @@ class VaultRepositoryTest {
fun `syncSendUpsertFlow update failure with 404 code should make a request for a send and then delete it`() =
runTest {
val number = 1
val userId = MOCK_USER_STATE.activeUserId
val sendId = "mockId-$number"
fakeAuthDiskSource.userState = MOCK_USER_STATE
val response: HttpException = mockk {
every { code() } returns 404
}
coEvery { sendsService.getSend(sendId = sendId) } returns response.asFailure()
coEvery {
sendsService.getSend(sendId)
} returns response.asFailure()
coEvery {
vaultDiskSource.deleteSend(any(), any())
vaultDiskSource.deleteSend(userId = userId, sendId = sendId)
} just runs
fakeAuthDiskSource.userState = MOCK_USER_STATE
setVaultToUnlocked(userId = MOCK_USER_STATE.activeUserId)
val sendView = createMockSendView(number = number)
val sendView = createMockSend(
number = number,
revisionDate = ZonedDateTime.now(clock).minus(5, ChronoUnit.MINUTES),
)
coEvery {
vaultSdkSource.decryptSendList(
userId = MOCK_USER_STATE.activeUserId,
sendList = listOf(createMockSdkSend(number = number)),
)
} returns listOf(sendView).asSuccess()
vaultDiskSource.getSends(userId = userId)
} returns MutableStateFlow(listOf(sendView))
val sendsFlow = bufferedMutableSharedFlow<List<SyncResponseJson.Send>>()
setupVaultDiskSourceFlows(sendsFlow = sendsFlow)
vaultRepository.sendDataStateFlow.test {
// Populate and consume items related to the sends flow
awaitItem()
sendsFlow.tryEmit(listOf(createMockSend(number = number)))
awaitItem()
mutableSyncSendUpsertFlow.tryEmit(
SyncSendUpsertData(
sendId = sendId,
revisionDate = ZonedDateTime.now(),
isUpdate = true,
),
)
}
mutableSyncSendUpsertFlow.tryEmit(
SyncSendUpsertData(
sendId = sendId,
revisionDate = ZonedDateTime.now(clock),
isUpdate = true,
),
)
coVerify(exactly = 1) {
sendsService.getSend(sendId)
vaultDiskSource.deleteSend(
userId = MOCK_USER_STATE.activeUserId,
sendId = sendId,
)
sendsService.getSend(sendId = sendId)
vaultDiskSource.deleteSend(userId = userId, sendId = sendId)
}
}
@@ -3867,51 +3829,31 @@ class VaultRepositoryTest {
@Test
fun `syncSendUpsertFlow create failure with 404 code should make a request for a send and do nothing`() =
runTest {
val userId = MOCK_USER_STATE.activeUserId
val sendId = "mockId-1"
fakeAuthDiskSource.userState = MOCK_USER_STATE
setVaultToUnlocked(userId = MOCK_USER_STATE.activeUserId)
val response: HttpException = mockk {
every { code() } returns 404
}
coEvery { sendsService.getSend(sendId = sendId) } returns response.asFailure()
coEvery {
sendsService.getSend(sendId)
} returns response.asFailure()
vaultDiskSource.getSends(userId = userId)
} returns MutableStateFlow(emptyList())
coEvery {
vaultSdkSource.decryptSendList(
userId = MOCK_USER_STATE.activeUserId,
sendList = listOf(),
)
} returns emptyList<SendView>().asSuccess()
val sendsFlow = bufferedMutableSharedFlow<List<SyncResponseJson.Send>>()
setupVaultDiskSourceFlows(sendsFlow = sendsFlow)
vaultRepository.sendDataStateFlow.test {
// Populate and consume items related to the sends flow
awaitItem()
sendsFlow.tryEmit(emptyList())
awaitItem()
mutableSyncSendUpsertFlow.tryEmit(
SyncSendUpsertData(
sendId = sendId,
revisionDate = ZonedDateTime.now(),
isUpdate = false,
),
)
}
mutableSyncSendUpsertFlow.tryEmit(
SyncSendUpsertData(
sendId = sendId,
revisionDate = ZonedDateTime.now(clock),
isUpdate = false,
),
)
coVerify(exactly = 1) {
sendsService.getSend(sendId)
sendsService.getSend(sendId = sendId)
}
coVerify(exactly = 0) {
vaultDiskSource.deleteSend(
userId = MOCK_USER_STATE.activeUserId,
sendId = sendId,
)
vaultDiskSource.deleteSend(userId = userId, sendId = sendId)
}
}
@@ -3920,50 +3862,28 @@ class VaultRepositoryTest {
fun `syncSendUpsertFlow valid create success should make a request for a send and then store it`() =
runTest {
val number = 1
val userId = MOCK_USER_STATE.activeUserId
val sendId = "mockId-$number"
fakeAuthDiskSource.userState = MOCK_USER_STATE
setVaultToUnlocked(userId = MOCK_USER_STATE.activeUserId)
coEvery {
vaultSdkSource.decryptSendList(
userId = MOCK_USER_STATE.activeUserId,
sendList = listOf(),
)
} returns listOf<SendView>().asSuccess()
vaultDiskSource.getSends(userId = userId)
} returns MutableStateFlow(emptyList())
val send = mockk<SyncResponseJson.Send>()
coEvery { sendsService.getSend(sendId = sendId) } returns send.asSuccess()
coEvery { vaultDiskSource.saveSend(userId = userId, send = send) } just runs
val sendsFlow = bufferedMutableSharedFlow<List<SyncResponseJson.Send>>()
setupVaultDiskSourceFlows(sendsFlow = sendsFlow)
val send: SyncResponseJson.Send = mockk()
coEvery {
sendsService.getSend(sendId)
} returns send.asSuccess()
coEvery {
vaultDiskSource.saveSend(any(), any())
} just runs
vaultRepository.sendDataStateFlow.test {
// Populate and consume items related to the sends flow
awaitItem()
sendsFlow.tryEmit(listOf())
awaitItem()
mutableSyncSendUpsertFlow.tryEmit(
SyncSendUpsertData(
sendId = sendId,
revisionDate = ZonedDateTime.now(),
isUpdate = false,
),
)
}
mutableSyncSendUpsertFlow.tryEmit(
SyncSendUpsertData(
sendId = sendId,
revisionDate = ZonedDateTime.now(clock),
isUpdate = false,
),
)
coVerify(exactly = 1) {
sendsService.getSend(sendId)
vaultDiskSource.saveSend(
userId = MOCK_USER_STATE.activeUserId,
send = send,
)
sendsService.getSend(sendId = sendId)
vaultDiskSource.saveSend(userId = userId, send = send)
}
}
@@ -3972,51 +3892,33 @@ class VaultRepositoryTest {
fun `syncSendUpsertFlow valid update success should make a request for a send and then store it`() =
runTest {
val number = 1
val userId = MOCK_USER_STATE.activeUserId
val sendId = "mockId-$number"
fakeAuthDiskSource.userState = MOCK_USER_STATE
setVaultToUnlocked(userId = MOCK_USER_STATE.activeUserId)
val sendView = createMockSendView(number = number)
val sendView = createMockSend(
number = number,
revisionDate = ZonedDateTime.now(clock).minus(5, ChronoUnit.MINUTES),
)
coEvery {
vaultSdkSource.decryptSendList(
userId = MOCK_USER_STATE.activeUserId,
sendList = listOf(createMockSdkSend(number = number)),
)
} returns listOf(sendView).asSuccess()
vaultDiskSource.getSends(userId = userId)
} returns MutableStateFlow(listOf(sendView))
val sendsFlow = bufferedMutableSharedFlow<List<SyncResponseJson.Send>>()
setupVaultDiskSourceFlows(sendsFlow = sendsFlow)
val send = mockk<SyncResponseJson.Send>()
coEvery { sendsService.getSend(sendId = sendId) } returns send.asSuccess()
coEvery { vaultDiskSource.saveSend(userId = userId, send = send) } just runs
val send: SyncResponseJson.Send = mockk()
coEvery {
sendsService.getSend(sendId)
} returns send.asSuccess()
coEvery {
vaultDiskSource.saveSend(any(), any())
} just runs
vaultRepository.sendDataStateFlow.test {
// Populate and consume items related to the sends flow
awaitItem()
sendsFlow.tryEmit(listOf(createMockSend(number = number)))
awaitItem()
mutableSyncSendUpsertFlow.tryEmit(
SyncSendUpsertData(
sendId = sendId,
revisionDate = ZonedDateTime.now(),
isUpdate = true,
),
)
}
mutableSyncSendUpsertFlow.tryEmit(
SyncSendUpsertData(
sendId = sendId,
revisionDate = ZonedDateTime.now(clock),
isUpdate = true,
),
)
coVerify(exactly = 1) {
sendsService.getSend(sendId)
vaultDiskSource.saveSend(
userId = MOCK_USER_STATE.activeUserId,
send = send,
)
sendsService.getSend(sendId = sendId)
vaultDiskSource.saveSend(userId = userId, send = send)
}
}
@@ -4024,20 +3926,21 @@ class VaultRepositoryTest {
fun `syncFolderDeleteFlow should delete folder from disk and update ciphers`() {
val userId = "mockId-1"
val folderId = "mockId-1"
val cipher = createMockCipher(number = 1, folderId = folderId)
val updatedCipher = createMockCipher(number = 1, folderId = null)
fakeAuthDiskSource.userState = MOCK_USER_STATE
coEvery { vaultDiskSource.deleteFolder(userId = userId, folderId = folderId) } just runs
coEvery {
vaultDiskSource.getCiphersFlow(userId)
} returns flowOf()
coEvery { vaultDiskSource.getCiphers(userId = userId) } returns listOf(cipher)
coEvery { vaultDiskSource.saveCipher(userId = userId, cipher = updatedCipher) } just runs
mutableSyncFolderDeleteFlow.tryEmit(
SyncFolderDeleteData(folderId = folderId),
SyncFolderDeleteData(userId = userId, folderId = folderId),
)
coVerify {
coVerify(exactly = 1) {
vaultDiskSource.deleteFolder(userId = userId, folderId = folderId)
vaultDiskSource.getCiphersFlow(userId)
vaultDiskSource.getCiphers(userId = userId)
vaultDiskSource.saveCipher(userId = userId, cipher = updatedCipher)
}
}
@@ -4164,50 +4067,28 @@ class VaultRepositoryTest {
fun `syncFolderUpsertFlow valid create success should make a request for a folder and then store it`() =
runTest {
val number = 1
val userId = MOCK_USER_STATE.activeUserId
val folderId = "mockId-$number"
fakeAuthDiskSource.userState = MOCK_USER_STATE
setVaultToUnlocked(userId = MOCK_USER_STATE.activeUserId)
coEvery {
vaultSdkSource.decryptFolderList(
userId = MOCK_USER_STATE.activeUserId,
folderList = listOf(),
)
} returns listOf<FolderView>().asSuccess()
vaultDiskSource.getFolders(userId = userId)
} returns MutableStateFlow(emptyList())
val folder = mockk<SyncResponseJson.Folder>()
coEvery { folderService.getFolder(folderId = folderId) } returns folder.asSuccess()
coEvery { vaultDiskSource.saveFolder(userId = userId, folder = folder) } just runs
val foldersFlow = bufferedMutableSharedFlow<List<SyncResponseJson.Folder>>()
setupVaultDiskSourceFlows(foldersFlow = foldersFlow)
val folder: SyncResponseJson.Folder = mockk()
coEvery {
folderService.getFolder(folderId)
} returns folder.asSuccess()
coEvery {
vaultDiskSource.saveFolder(any(), any())
} just runs
vaultRepository.foldersStateFlow.test {
// Populate and consume items related to the folders flow
awaitItem()
foldersFlow.tryEmit(listOf())
awaitItem()
mutableSyncFolderUpsertFlow.tryEmit(
SyncFolderUpsertData(
folderId = folderId,
revisionDate = ZonedDateTime.now(),
isUpdate = false,
),
)
}
mutableSyncFolderUpsertFlow.tryEmit(
SyncFolderUpsertData(
folderId = folderId,
revisionDate = ZonedDateTime.now(clock),
isUpdate = false,
),
)
coVerify(exactly = 1) {
folderService.getFolder(folderId)
vaultDiskSource.saveFolder(
userId = MOCK_USER_STATE.activeUserId,
folder = folder,
)
folderService.getFolder(folderId = folderId)
vaultDiskSource.saveFolder(userId = userId, folder = folder)
}
}
@@ -4216,51 +4097,32 @@ class VaultRepositoryTest {
fun `syncFolderUpsertFlow valid update success should make a request for a folder and then store it`() =
runTest {
val number = 1
val userId = MOCK_USER_STATE.activeUserId
val folderId = "mockId-$number"
fakeAuthDiskSource.userState = MOCK_USER_STATE
setVaultToUnlocked(userId = MOCK_USER_STATE.activeUserId)
val folderView = createMockFolderView(number = number)
val folderView = createMockFolder(
number = number,
revisionDate = ZonedDateTime.now(clock).minus(5, ChronoUnit.MINUTES),
)
coEvery {
vaultSdkSource.decryptFolderList(
userId = MOCK_USER_STATE.activeUserId,
folderList = listOf(createMockSdkFolder(number = number)),
)
} returns listOf(folderView).asSuccess()
vaultDiskSource.getFolders(userId = userId)
} returns MutableStateFlow(listOf(folderView))
val folder = mockk<SyncResponseJson.Folder>()
coEvery { folderService.getFolder(folderId = folderId) } returns folder.asSuccess()
coEvery { vaultDiskSource.saveFolder(userId = userId, folder = folder) } just runs
val foldersFlow = bufferedMutableSharedFlow<List<SyncResponseJson.Folder>>()
setupVaultDiskSourceFlows(foldersFlow = foldersFlow)
val folder: SyncResponseJson.Folder = mockk()
coEvery {
folderService.getFolder(folderId)
} returns folder.asSuccess()
coEvery {
vaultDiskSource.saveFolder(any(), any())
} just runs
vaultRepository.foldersStateFlow.test {
// Populate and consume items related to the folders flow
awaitItem()
foldersFlow.tryEmit(listOf(createMockFolder(number = number)))
awaitItem()
mutableSyncFolderUpsertFlow.tryEmit(
SyncFolderUpsertData(
folderId = folderId,
revisionDate = ZonedDateTime.now(),
isUpdate = true,
),
)
}
mutableSyncFolderUpsertFlow.tryEmit(
SyncFolderUpsertData(
folderId = folderId,
revisionDate = ZonedDateTime.now(clock),
isUpdate = true,
),
)
coVerify(exactly = 1) {
folderService.getFolder(folderId)
vaultDiskSource.saveFolder(
userId = MOCK_USER_STATE.activeUserId,
folder = folder,
)
vaultDiskSource.saveFolder(userId = userId, folder = folder)
}
}
@@ -4396,6 +4258,104 @@ class VaultRepositoryTest {
)
}
@Test
fun `importCxfPayload should return success result`() = runTest {
val userId = "mockId-1"
val payload = "payload"
val ciphers = listOf(createMockSdkCipher(number = 1))
fakeAuthDiskSource.userState = MOCK_USER_STATE
coEvery {
vaultSdkSource.importCxf(
userId = userId,
payload = payload,
)
} returns ciphers.asSuccess()
val result = vaultRepository.importCxfPayload(payload)
assertEquals(
ImportCxfPayloadResult.Success(ciphers),
result,
)
}
@Test
fun `importCxfPayload should return error result`() = runTest {
val userId = "mockId-1"
val payload = "payload"
val expected = Throwable()
fakeAuthDiskSource.userState = MOCK_USER_STATE
coEvery {
vaultSdkSource.importCxf(
userId = userId,
payload = payload,
)
} returns expected.asFailure()
val result = vaultRepository.importCxfPayload(payload)
assertEquals(
ImportCxfPayloadResult.Error(expected),
result,
)
}
@Test
fun `exportVaultDataToCxf should return success result`() = runTest {
val userId = "mockId-1"
val account = createMockAccount(number = 1, email = "email", name = null)
val cipherListViews = listOf(createMockCipherListView(number = 1))
fakeAuthDiskSource.userState = MOCK_USER_STATE
coEvery {
vaultSdkSource.exportVaultDataToCxf(
userId = userId,
account = account,
ciphers = any(),
)
} returns "TestResult".asSuccess()
coEvery {
vaultDiskSource.getSelectedCiphers(
userId = userId,
cipherIds = cipherListViews.mapNotNull { it.id },
)
} returns listOf(createMockCipher(number = 1))
val result = vaultRepository.exportVaultDataToCxf(ciphers = cipherListViews)
assertEquals("TestResult".asSuccess(), result)
}
@Test
fun `exportVaultDataToCxf should return error result when exportVaultDataToCxf fails`() =
runTest {
val userId = "mockId-1"
val account = createMockAccount(number = 1, email = "email", name = null)
val cipherListViews = listOf(createMockCipherListView(number = 1))
val throwable = Throwable()
fakeAuthDiskSource.userState = MOCK_USER_STATE
coEvery {
vaultSdkSource.exportVaultDataToCxf(
userId = userId,
account = account,
ciphers = any(),
)
} returns throwable.asFailure()
coEvery {
vaultDiskSource.getSelectedCiphers(
userId = userId,
cipherIds = cipherListViews.mapNotNull { it.id },
)
} returns listOf(createMockCipher(number = 1))
val result = vaultRepository.exportVaultDataToCxf(ciphers = cipherListViews)
assertEquals(throwable.asFailure(), result)
}
@Test
fun `silentlyDiscoverCredentials should return result`() = runTest {
val userId = "userId"
@@ -0,0 +1,68 @@
package com.x8bit.bitwarden.data.vault.repository.model
import com.bitwarden.network.model.KdfTypeJson
import com.bitwarden.network.model.UserDecryptionOptionsJson
import com.x8bit.bitwarden.data.auth.datasource.disk.model.AccountJson
import com.x8bit.bitwarden.data.auth.datasource.disk.model.AccountTokensJson
import com.x8bit.bitwarden.data.auth.datasource.disk.model.ForcePasswordResetReason
import java.time.ZonedDateTime
/**
* Creates a mock [AccountJson.Profile] for testing purposes.
*/
@Suppress("LongParameterList")
fun createMockAccountJsonProfile(
number: Int,
userId: String = "mockId-$number",
email: String = "mockEmail-$number",
isEmailVerified: Boolean = true,
name: String? = "mockName-$number",
stamp: String = "mockSecurityStamp-$number",
organizationId: String? = "mockOrganizationId-$number",
avatarColorHex: String? = "mockAvatarColorHex-$number",
hasPremium: Boolean = false,
forcePasswordResetReason: ForcePasswordResetReason? = null,
kdfType: KdfTypeJson? = null,
kdfIterations: Int? = null,
kdfMemory: Int? = null,
kdfParallelism: Int? = null,
userDecryptionOptions: UserDecryptionOptionsJson? = null,
isTwoFactorEnabled: Boolean = false,
creationDate: ZonedDateTime = ZonedDateTime.parse("2024-09-13T01:00:00.00Z"),
): AccountJson.Profile = AccountJson.Profile(
userId = userId,
email = email,
isEmailVerified = isEmailVerified,
name = name,
stamp = stamp,
organizationId = organizationId,
avatarColorHex = avatarColorHex,
hasPremium = hasPremium,
forcePasswordResetReason = forcePasswordResetReason,
kdfType = kdfType,
kdfIterations = kdfIterations,
kdfMemory = kdfMemory,
kdfParallelism = kdfParallelism,
userDecryptionOptions = userDecryptionOptions,
isTwoFactorEnabled = isTwoFactorEnabled,
creationDate = creationDate,
)
/**
* Creates a mock [AccountJson] for testing purposes.
*/
fun createMockAccountJson(
number: Int,
profile: AccountJson.Profile = createMockAccountJsonProfile(number),
tokens: AccountTokensJson = AccountTokensJson(
accessToken = "accessToken-$number",
refreshToken = "refreshToken-$number",
),
settings: AccountJson.Settings = AccountJson.Settings(
environmentUrlData = null,
),
): AccountJson = AccountJson(
profile = profile,
tokens = tokens,
settings = settings,
)
@@ -0,0 +1,22 @@
package com.x8bit.bitwarden.data.vault.repository.util
import com.bitwarden.exporters.Account
import com.x8bit.bitwarden.data.vault.repository.model.createMockAccountJson
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
class AccountJsonExtensionsTest {
@Test
fun `toAccountData returns populated AccountData when account is non-null`() {
val account = createMockAccountJson(number = 1)
assertEquals(
Account(
id = "mockId-1",
email = "mockEmail-1",
name = "mockName-1",
),
account.toSdkAccount(),
)
}
}
@@ -4,6 +4,7 @@ import com.bitwarden.collections.Collection
import com.bitwarden.collections.CollectionType
import com.bitwarden.network.model.CollectionTypeJson
import com.bitwarden.network.model.SyncResponseJson
import com.bitwarden.network.model.createMockOrganization
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCollectionView
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
@@ -103,7 +104,7 @@ class VaultSdkCollectionExtensionsTest {
@Suppress("MaxLineLength")
@Test
fun `toSortAlphabetically should sort collections by type and name`() {
fun `toSortAlphabeticallyByTypeAndOrganization should sort collections by type and name`() {
val list = listOf(
createMockCollectionView(1).copy(name = "c"),
createMockCollectionView(1).copy(name = "B"),
@@ -111,16 +112,28 @@ class VaultSdkCollectionExtensionsTest {
createMockCollectionView(1).copy(name = "4"),
createMockCollectionView(1).copy(name = "A"),
createMockCollectionView(1).copy(name = "#"),
createMockCollectionView(1).copy(
name = "D",
createMockCollectionView(2).copy(
name = "Org2 items",
type = CollectionType.DEFAULT_USER_COLLECTION,
organizationId = "mockId-2",
),
createMockCollectionView(1).copy(
name = "Org1 items",
type = CollectionType.DEFAULT_USER_COLLECTION,
organizationId = "mockId-1",
),
)
val expected = listOf(
createMockCollectionView(1).copy(
name = "D",
name = "Org1 items",
type = CollectionType.DEFAULT_USER_COLLECTION,
organizationId = "mockId-1",
),
createMockCollectionView(2).copy(
name = "Org2 items",
type = CollectionType.DEFAULT_USER_COLLECTION,
organizationId = "mockId-2",
),
createMockCollectionView(1).copy(name = "#"),
createMockCollectionView(1).copy(name = "4"),
@@ -132,7 +145,12 @@ class VaultSdkCollectionExtensionsTest {
assertEquals(
expected,
list.sortAlphabeticallyByType(),
list.sortAlphabeticallyByTypeAndOrganization(
userOrganizations = listOf(
createMockOrganization(number = 1),
createMockOrganization(number = 2),
),
),
)
}
@@ -5,7 +5,9 @@ import app.cash.turbine.test
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.data.datasource.disk.base.FakeDispatcherManager
import com.bitwarden.ui.platform.base.BaseViewModelTest
import com.bitwarden.ui.platform.resource.BitwardenPlurals
import com.bitwarden.ui.platform.resource.BitwardenString
import com.bitwarden.ui.util.asPluralsText
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus
import com.x8bit.bitwarden.data.auth.datasource.sdk.model.PasswordStrength.LEVEL_0
@@ -590,7 +592,10 @@ class CompleteRegistrationViewModelTest : BaseViewModelTest() {
passwordInput = input,
dialog = CompleteRegistrationDialog.Error(
title = BitwardenString.an_error_has_occurred.asText(),
message = BitwardenString.master_password_length_val_message_x.asText(12),
message = BitwardenPlurals.master_password_length_val_message_x.asPluralsText(
quantity = 12,
args = arrayOf(12),
),
),
)
viewModel.trySendAction(CompleteRegistrationAction.CallToActionClick)
@@ -3,7 +3,9 @@ package com.x8bit.bitwarden.ui.auth.feature.resetPassword
import androidx.lifecycle.SavedStateHandle
import app.cash.turbine.test
import com.bitwarden.ui.platform.base.BaseViewModelTest
import com.bitwarden.ui.platform.resource.BitwardenPlurals
import com.bitwarden.ui.platform.resource.BitwardenString
import com.bitwarden.ui.util.asPluralsText
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.data.auth.datasource.disk.model.ForcePasswordResetReason
import com.x8bit.bitwarden.data.auth.datasource.sdk.model.PasswordStrength
@@ -133,8 +135,10 @@ class ResetPasswordViewModelTest : BaseViewModelTest() {
resetReason = ForcePasswordResetReason.ADMIN_FORCE_PASSWORD_RESET,
dialogState = ResetPasswordState.DialogState.Error(
title = BitwardenString.an_error_has_occurred.asText(),
message = BitwardenString.master_password_length_val_message_x
.asText(MIN_PASSWORD_LENGTH),
message = BitwardenPlurals.master_password_length_val_message_x.asPluralsText(
quantity = MIN_PASSWORD_LENGTH,
args = arrayOf(MIN_PASSWORD_LENGTH),
),
),
passwordInput = password,
passwordStrengthState = PasswordStrengthState.WEAK_1,
@@ -3,7 +3,9 @@ package com.x8bit.bitwarden.ui.auth.feature.setpassword
import androidx.lifecycle.SavedStateHandle
import app.cash.turbine.test
import com.bitwarden.ui.platform.base.BaseViewModelTest
import com.bitwarden.ui.platform.resource.BitwardenPlurals
import com.bitwarden.ui.platform.resource.BitwardenString
import com.bitwarden.ui.util.asPluralsText
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.data.auth.repository.AuthRepository
import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason
@@ -87,8 +89,10 @@ class SetPasswordViewModelTest : BaseViewModelTest() {
DEFAULT_STATE.copy(
dialogState = SetPasswordState.DialogState.Error(
title = BitwardenString.an_error_has_occurred.asText(),
message = BitwardenString.master_password_length_val_message_x
.asText(MIN_PASSWORD_LENGTH),
message = BitwardenPlurals.master_password_length_val_message_x.asPluralsText(
quantity = MIN_PASSWORD_LENGTH,
args = arrayOf(MIN_PASSWORD_LENGTH),
),
),
passwordInput = password,
retypePasswordInput = password,
@@ -46,7 +46,7 @@ class FlightRecorderDataSetExtensionsTest {
),
)
val result = dataset.getStopsLoggingStringForActiveLog(clock = FIXED_CLOCK)
assertEquals(BitwardenString.stops_logging_on.asText("1/21/70", "4:27 AM"), result)
assertEquals(BitwardenString.stops_logging_on.asText("1/21/70", "4:27\u202FAM"), result)
}
}
@@ -195,7 +195,7 @@ class LoginApprovalViewModelTest : BaseViewModelTest() {
email = EMAIL,
fingerprint = AUTH_REQUEST.fingerprint,
ipAddress = AUTH_REQUEST.ipAddress,
time = "9/13/24, 12:00 AM",
time = "9/13/24, 12:00\u202FAM",
),
)
val viewModel = createViewModel()
@@ -124,7 +124,7 @@ class FlightRecorderDataSetExtensionsTest {
id = "51",
title = "2015-10-10T02:55:52 – 2015-10-10T03:55:52".asText(),
subtextStart = "1.00 KB".asText(),
subtextEnd = BitwardenString.expires_at.asText("10:15 PM"),
subtextEnd = BitwardenString.expires_at.asText("10:15\u202FPM"),
isDeletedEnabled = true,
),
RecordedLogsState.DisplayItem(
@@ -157,7 +157,7 @@ class OtherViewModelTest : BaseViewModelTest() {
mutableVaultLastSyncStateFlow.tryEmit(newSyncTime)
assertEquals(
DEFAULT_STATE.copy(
lastSyncTime = "Oct 27, 2023, 12:00 PM",
lastSyncTime = "Oct 27, 2023, 12:00\u202FPM",
dialogState = null,
),
awaitItem(),
@@ -236,6 +236,6 @@ private val DEFAULT_STATE = OtherState(
allowScreenCapture = false,
allowSyncOnRefresh = false,
clearClipboardFrequency = ClearClipboardFrequency.NEVER,
lastSyncTime = "Oct 26, 2023, 12:00 PM",
lastSyncTime = "Oct 26, 2023, 12:00\u202FPM",
dialogState = null,
)
@@ -172,7 +172,7 @@ class PasswordHistoryViewModelTest : BaseViewModelTest() {
passwords = listOf(
PasswordHistoryState.GeneratedPassword(
password = "mockPassword-1",
date = "10/27/23, 12:00 PM",
date = "10/27/23, 12:00\u202FPM",
),
),
),
@@ -78,7 +78,7 @@ class SendDataExtensionsTest {
SendState.ViewState.Content.SendItem(
id = "mockId-1",
name = "mockName-1",
deletionDate = "Oct 27, 2023, 12:00 PM",
deletionDate = "Oct 27, 2023, 12:00\u202FPM",
type = SendState.ViewState.Content.SendItem.Type.FILE,
iconList = DEFAULT_SEND_STATUS_ICONS,
shareUrl = "www.test.com/#/send/mockAccessId-1/mockKey-1",
@@ -87,7 +87,7 @@ class SendDataExtensionsTest {
SendState.ViewState.Content.SendItem(
id = "mockId-2",
name = "mockName-2",
deletionDate = "Oct 27, 2023, 12:00 PM",
deletionDate = "Oct 27, 2023, 12:00\u202FPM",
type = SendState.ViewState.Content.SendItem.Type.TEXT,
iconList = DEFAULT_SEND_STATUS_ICONS,
shareUrl = "www.test.com/#/send/mockAccessId-2/mockKey-2",
@@ -48,7 +48,7 @@ class SendViewExtensionsTest {
),
shareLink = sendUrl,
sendName = "mockName-1",
deletionDate = "Oct 27, 2023, 12:00 PM",
deletionDate = "Oct 27, 2023, 12:00\u202FPM",
maxAccessCount = 1,
currentAccessCount = 1,
notes = "mockNotes-1",
@@ -76,7 +76,7 @@ class SendViewExtensionsTest {
),
shareLink = sendUrl,
sendName = "mockName-2",
deletionDate = "Oct 27, 2023, 12:00 PM",
deletionDate = "Oct 27, 2023, 12:00\u202FPM",
maxAccessCount = 1,
currentAccessCount = 1,
notes = "mockNotes-2",
@@ -20,8 +20,10 @@ import com.bitwarden.network.model.SyncResponseJson
import com.bitwarden.send.SendView
import com.bitwarden.ui.platform.base.BaseViewModelTest
import com.bitwarden.ui.platform.components.snackbar.model.BitwardenSnackbarData
import com.bitwarden.ui.platform.resource.BitwardenPlurals
import com.bitwarden.ui.platform.resource.BitwardenString
import com.bitwarden.ui.util.Text
import com.bitwarden.ui.util.asPluralsText
import com.bitwarden.ui.util.asText
import com.bitwarden.vault.CipherListView
import com.bitwarden.vault.CipherView
@@ -2439,7 +2441,10 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
assertEquals(
loginState.copy(
dialog = VaultAddEditState.DialogState.Generic(
message = BitwardenString.password_exposed.asText(breachCount),
message = BitwardenPlurals.password_exposed.asPluralsText(
quantity = breachCount,
args = arrayOf(breachCount),
),
),
),
awaitItem(),
@@ -217,7 +217,7 @@ class CipherViewExtensionsTest {
totp = "otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example",
canViewPassword = false,
fido2CredentialCreationDateTime = BitwardenString.created_x.asText(
"Oct 27, 2023, 12:00 PM",
"Oct 27, 2023, 12:00\u202FPM",
),
),
),
@@ -278,7 +278,7 @@ class CipherViewExtensionsTest {
totp = totp,
canViewPassword = false,
fido2CredentialCreationDateTime = BitwardenString.created_x.asText(
"Oct 27, 2023, 12:00 PM",
"Oct 27, 2023, 12:00\u202FPM",
),
),
),
@@ -353,7 +353,7 @@ class ImportLoginsScreenTest : BitwardenComposeTest() {
it.copy(dialogState = ImportLoginsState.DialogState.Syncing)
}
composeTestRule
.onNodeWithText(text = "Syncing logins...")
.onNodeWithText(text = "Syncing logins…")
.assertIsDisplayed()
.assert(hasAnyAncestor(isDialog()))
}
@@ -431,7 +431,7 @@ class VaultItemScreenTest : BitwardenComposeTest() {
// Verify only the first collection name is shown
composeTestRule
.onNodeWithText("My collection...")
.onNodeWithText("My collection…")
.assertIsDisplayed()
// Verify other collection names are not shown by default.
@@ -13,8 +13,10 @@ import com.bitwarden.ui.platform.base.BaseViewModelTest
import com.bitwarden.ui.platform.components.icon.model.IconData
import com.bitwarden.ui.platform.components.snackbar.model.BitwardenSnackbarData
import com.bitwarden.ui.platform.resource.BitwardenDrawable
import com.bitwarden.ui.platform.resource.BitwardenPlurals
import com.bitwarden.ui.platform.resource.BitwardenString
import com.bitwarden.ui.util.Text
import com.bitwarden.ui.util.asPluralsText
import com.bitwarden.ui.util.asText
import com.bitwarden.ui.util.concat
import com.bitwarden.vault.CipherView
@@ -1289,7 +1291,10 @@ class VaultItemViewModelTest : BaseViewModelTest() {
assertEquals(
loginState.copy(
dialog = VaultItemState.DialogState.Generic(
message = BitwardenString.password_exposed.asText(breachCount),
message = BitwardenPlurals.password_exposed.asPluralsText(
quantity = breachCount,
args = arrayOf(breachCount),
),
),
),
awaitItem(),
@@ -170,8 +170,8 @@ fun createCommonContent(
if (isEmpty) {
VaultItemState.ViewState.Content.Common(
name = "mockName",
created = BitwardenString.created.asText("Jan 1, 1970, 12:16 AM"),
lastUpdated = BitwardenString.last_edited.asText("Jan 1, 1970, 12:16 AM"),
created = BitwardenString.created.asText("Jan 1, 1970, 12:16\u202FAM"),
lastUpdated = BitwardenString.last_edited.asText("Jan 1, 1970, 12:16\u202FAM"),
notes = null,
customFields = emptyList(),
requiresCloneConfirmation = false,
@@ -188,8 +188,8 @@ fun createCommonContent(
} else {
VaultItemState.ViewState.Content.Common(
name = "mockName",
created = BitwardenString.created.asText("Jan 1, 1970, 12:16 AM"),
lastUpdated = BitwardenString.last_edited.asText("Jan 1, 1970, 12:16 AM"),
created = BitwardenString.created.asText("Jan 1, 1970, 12:16\u202FAM"),
lastUpdated = BitwardenString.last_edited.asText("Jan 1, 1970, 12:16\u202FAM"),
notes = "Lots of notes",
customFields = listOf(
FieldView(
@@ -271,7 +271,7 @@ fun createLoginContent(isEmpty: Boolean): VaultItemState.ViewState.Content.ItemT
)
},
passwordRevisionDate = BitwardenString.password_last_updated
.asText("Jan 1, 1970, 12:16 AM")
.asText("Jan 1, 1970, 12:16\u202FAM")
.takeUnless { isEmpty },
isPremiumUser = true,
totpCodeItemData = TotpCodeItemData(
@@ -281,7 +281,7 @@ fun createLoginContent(isEmpty: Boolean): VaultItemState.ViewState.Content.ItemT
)
.takeUnless { isEmpty },
fido2CredentialCreationDateText = BitwardenString.created_x
.asText("Oct 27, 2023, 12:00 PM")
.asText("Oct 27, 2023, 12:00\u202FPM")
.takeUnless { isEmpty },
canViewTotpCode = true,
)
@@ -878,7 +878,7 @@ class VaultScreenTest : BitwardenComposeTest() {
}
composeTestRule
.onNodeWithText("Syncing...")
.onNodeWithText("Syncing…")
.assertIsDisplayed()
.assert(hasAnyAncestor(isDialog()))
}
@@ -69,7 +69,7 @@ class FlightRecorderDataSetExtensionsTest {
assertEquals(
BitwardenSnackbarData(
message = BitwardenString.flight_recorder_banner_message
.asText("4/12/25", "9:15 AM"),
.asText("4/12/25", "9:15\u202FAM"),
messageHeader = BitwardenString.flight_recorder_banner_title.asText(),
actionLabel = BitwardenString.go_to_settings.asText(),
withDismissAction = true,
+2
View File
@@ -24,6 +24,7 @@ dependencies {
kover(project(":authenticator"))
kover(project(":authenticatorbridge"))
kover(project(":core"))
kover(project(":cxf"))
kover(project(":data"))
kover(project(":network"))
kover(project(":ui"))
@@ -38,6 +39,7 @@ detekt {
"authenticator/src",
"authenticatorbridge/src",
"core/src",
"cxf/src",
"data/src",
"network/src",
"ui/src",
@@ -102,7 +102,7 @@ class TemporalAccessorExtensionsTest {
// US locale
assertEquals(
"3:30 PM",
"3:30\u202FPM",
instant.toFormattedTimeStyle(
timeStyle = FormatStyle.SHORT,
locale = Locale.US,
@@ -110,7 +110,7 @@ class TemporalAccessorExtensionsTest {
),
)
assertEquals(
"3:30:00 PM",
"3:30:00\u202FPM",
instant.toFormattedTimeStyle(
timeStyle = FormatStyle.MEDIUM,
locale = Locale.US,
@@ -118,7 +118,7 @@ class TemporalAccessorExtensionsTest {
),
)
assertEquals(
"3:30:00 PM Z",
"3:30:00\u202FPM Z",
instant.toFormattedTimeStyle(
timeStyle = FormatStyle.LONG,
locale = Locale.US,
@@ -126,7 +126,7 @@ class TemporalAccessorExtensionsTest {
),
)
assertEquals(
"3:30:00 PM Z",
"3:30:00\u202FPM Z",
instant.toFormattedTimeStyle(
timeStyle = FormatStyle.FULL,
locale = Locale.US,
@@ -175,7 +175,7 @@ class TemporalAccessorExtensionsTest {
// US locale
assertEquals(
"12/10/23, 3:30 PM",
"12/10/23, 3:30\u202FPM",
instant.toFormattedDateTimeStyle(
dateStyle = FormatStyle.SHORT,
timeStyle = FormatStyle.SHORT,
@@ -184,7 +184,7 @@ class TemporalAccessorExtensionsTest {
),
)
assertEquals(
"Dec 10, 2023, 3:30:00 PM",
"Dec 10, 2023, 3:30:00\u202FPM",
instant.toFormattedDateTimeStyle(
dateStyle = FormatStyle.MEDIUM,
timeStyle = FormatStyle.MEDIUM,
@@ -193,7 +193,7 @@ class TemporalAccessorExtensionsTest {
),
)
assertEquals(
"December 10, 2023 at 3:30:00 PM Z",
"December 10, 2023, 3:30:00\u202FPM Z",
instant.toFormattedDateTimeStyle(
dateStyle = FormatStyle.LONG,
timeStyle = FormatStyle.LONG,
@@ -202,7 +202,7 @@ class TemporalAccessorExtensionsTest {
),
)
assertEquals(
"Sunday, December 10, 2023 at 3:30:00 PM Z",
"Sunday, December 10, 2023, 3:30:00\u202FPM Z",
instant.toFormattedDateTimeStyle(
dateStyle = FormatStyle.FULL,
timeStyle = FormatStyle.FULL,
@@ -231,7 +231,7 @@ class TemporalAccessorExtensionsTest {
),
)
assertEquals(
"10 December 2023 at 15:30:00 Z",
"10 December 2023, 15:30:00 Z",
instant.toFormattedDateTimeStyle(
dateStyle = FormatStyle.LONG,
timeStyle = FormatStyle.LONG,
@@ -240,7 +240,7 @@ class TemporalAccessorExtensionsTest {
),
)
assertEquals(
"Sunday, 10 December 2023 at 15:30:00 Z",
"Sunday, 10 December 2023, 15:30:00 Z",
instant.toFormattedDateTimeStyle(
dateStyle = FormatStyle.FULL,
timeStyle = FormatStyle.FULL,
+1
View File
@@ -0,0 +1 @@
/build
+71
View File
@@ -0,0 +1,71 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.google.services)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.parcelize)
}
android {
namespace = "com.bitwarden.cxf"
compileSdk = libs.versions.compileSdk.get().toInt()
defaultConfig {
minSdk = libs.versions.minSdkBwa.get().toInt()
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles("consumer-rules.pro")
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro",
)
}
}
compileOptions {
sourceCompatibility(libs.versions.jvmTarget.get())
targetCompatibility(libs.versions.jvmTarget.get())
}
}
kotlin {
compilerOptions {
jvmTarget = JvmTarget.fromTarget(libs.versions.jvmTarget.get())
}
}
dependencies {
implementation(project(":annotation"))
implementation(project(":core"))
implementation(project(":ui"))
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.androidx.compose.runtime)
implementation(libs.androidx.credentials)
implementation(libs.androidx.credentials.providerevents)
implementation(libs.androidx.credentials.providerevents.play.services)
implementation(libs.kotlinx.coroutines.android)
testImplementation(platform(libs.junit.bom))
testRuntimeOnly(libs.junit.platform.launcher)
testImplementation(libs.junit.junit5)
testImplementation(libs.junit.vintage)
testImplementation(libs.kotlinx.coroutines.test)
testImplementation(libs.mockk.mockk)
}
tasks {
withType<Test> {
useJUnitPlatform()
maxHeapSize = "2g"
maxParallelForks = Runtime.getRuntime().availableProcessors()
jvmArgs = jvmArgs.orEmpty() + "-XX:+UseParallelGC"
}
}
View File
Whitespace-only changes.
+21
View File
@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
+4
View File
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest>
</manifest>
@@ -0,0 +1,65 @@
package androidx.credentials.providerevents
import android.annotation.SuppressLint
import android.content.Context
import androidx.credentials.provider.CallingAppInfo
import androidx.credentials.providerevents.transfer.ImportCredentialsRequest
import androidx.credentials.providerevents.transfer.ImportCredentialsResponse
import androidx.credentials.providerevents.transfer.ProviderImportCredentialsResponse
import androidx.credentials.providerevents.transfer.RegisterExportRequest
import com.bitwarden.annotation.OmitFromCoverage
/**
* Placeholder interface representing a provider events manager.
*/
interface ProviderEventsManager {
/**
* Register as a credential export source.
*/
fun registerExport(request: RegisterExportRequest): Boolean
/**
* Begin the process of importing credentials.
*/
fun importCredentials(
context: Context,
request: ImportCredentialsRequest,
): ProviderImportCredentialsResponse
@OmitFromCoverage
@Suppress("UndocumentedPublicClass")
companion object {
/**
* Create a new instance of [ProviderEventsManager].
*/
fun create(context: Context): ProviderEventsManager = StubProviderEventsManager()
}
}
/**
* Stub implementation of [ProviderEventsManager].
*/
@OmitFromCoverage
internal class StubProviderEventsManager : ProviderEventsManager {
override fun registerExport(request: RegisterExportRequest): Boolean {
return true
}
override fun importCredentials(
context: Context,
request: ImportCredentialsRequest,
): ProviderImportCredentialsResponse {
@SuppressLint("VisibleForTests")
return ProviderImportCredentialsResponse(
response = ImportCredentialsResponse(
responseJson = "",
),
callingAppInfo = CallingAppInfo(
packageName = "",
signatures = emptyList(),
origin = null,
),
)
}
}
@@ -0,0 +1,6 @@
package androidx.credentials.providerevents.exception
/**
* Placeholder class representing a cancellation exception for importing credentials.
*/
class ImportCredentialsCancellationException : Exception()
@@ -0,0 +1,45 @@
@file:Suppress("unused")
package androidx.credentials.providerevents.playservices
import android.app.Activity
import android.content.Intent
import android.net.Uri
import androidx.credentials.providerevents.exception.ImportCredentialsException
import androidx.credentials.providerevents.transfer.ImportCredentialsResponse
import androidx.credentials.providerevents.transfer.ProviderImportCredentialsRequest
/**
* A stub implementation of the Credential Provider Events IntentHandler class.
*/
object IntentHandler {
/**
* Stub implementation of the setImportCredentialsException method.
*/
fun setImportCredentialsException(intent: Intent, exception: ImportCredentialsException) {
// Stub implementation
}
/**
* Stub implementation of the setImportCredentialsResponse method.
*/
fun setImportCredentialsResponse(
context: Activity,
uri: Uri,
response: ImportCredentialsResponse,
) {
// Stub implementation
}
/**
* Stub implementation of the retrieveImportCredentialsException method.
*/
@Suppress("FunctionOnlyReturningConstant")
fun retrieveProviderImportCredentialsRequest(
intent: Intent,
): ProviderImportCredentialsRequest? {
// Stub implementation
return null
}
}
@@ -0,0 +1,14 @@
package androidx.credentials.providerevents.transfer
import android.graphics.Bitmap
/**
* Placeholder class representing an entry in the export request.
*/
data class ExportEntry(
val id: String,
val accountDisplayName: CharSequence?,
val userDisplayName: CharSequence,
val icon: Bitmap,
val supportedCredentialTypes: Set<String>,
)
@@ -0,0 +1,6 @@
package androidx.credentials.providerevents.transfer
/**
* Placeholder class representing a request to import credentials.
*/
data class ImportCredentialsRequest(val requestJson: String)
@@ -0,0 +1,15 @@
package androidx.credentials.providerevents.transfer
import android.net.Uri
import androidx.credentials.provider.CallingAppInfo
/**
* Placeholder class for the request received by the provider after the query phase of the import
* flow is complete i.e. the user was presented with a list of entries, and the user has now made
* a selection from the list of [ExportEntry] presented on the selector UI.
*/
data class ProviderImportCredentialsRequest(
val request: ImportCredentialsRequest,
val callingAppInfo: CallingAppInfo,
val uri: Uri,
)
@@ -0,0 +1,11 @@
package androidx.credentials.providerevents.transfer
import androidx.credentials.provider.CallingAppInfo
/**
* Placeholder class representing the response to an import request.
*/
data class ProviderImportCredentialsResponse(
val response: ImportCredentialsResponse,
val callingAppInfo: CallingAppInfo,
)
@@ -0,0 +1,8 @@
package androidx.credentials.providerevents.transfer
/**
* Placeholder class representing a request to register as a credential export source.
*/
data class RegisterExportRequest(
val entries: List<ExportEntry>,
)
@@ -0,0 +1,17 @@
package com.bitwarden.cxf.model
import android.net.Uri
import androidx.credentials.provider.CallingAppInfo
/**
* A request to import the provider's credentials.
*
* @property uri the FileProvider uri that the importer will read the response from.
* @property requestJson the request to import the provider's credentials.
* @property callingAppInfo the caller's app info.
*/
data class BitwardenImportCredentialsRequest(
val uri: Uri,
val requestJson: String,
val callingAppInfo: CallingAppInfo,
)
@@ -0,0 +1,21 @@
@file:OmitFromCoverage
package com.bitwarden.cxf.util
import android.content.Intent
import androidx.credentials.providerevents.playservices.IntentHandler
import com.bitwarden.annotation.OmitFromCoverage
import com.bitwarden.cxf.model.BitwardenImportCredentialsRequest
/**
* Retrieves the [BitwardenImportCredentialsRequest] from the intent.
*/
fun Intent.getProviderImportCredentialsRequest(): BitwardenImportCredentialsRequest? = IntentHandler
.retrieveProviderImportCredentialsRequest(this)
?.let {
BitwardenImportCredentialsRequest(
uri = it.uri,
requestJson = it.request.requestJson,
callingAppInfo = it.callingAppInfo,
)
}
+11 -8
View File
@@ -3,7 +3,7 @@
# App version
appVersionCode = "1"
appVersionName = "2025.7.0"
appVersionName = "2025.9.1"
# SDK Versions
compileSdk = "36"
@@ -22,6 +22,7 @@ androidxCamera = "1.4.2"
androidxComposeBom = "2025.08.01"
androidxCore = "1.17.0"
androidxCredentials = "1.5.0"
androidxCredentialsProviderEvents = "1.0.0-alpha02"
androidxHiltNavigationCompose = "1.2.0"
androidxLifecycle = "2.9.3"
androidxNavigation = "2.9.3"
@@ -29,26 +30,26 @@ androidxRoom = "2.7.2"
androidxSecurityCrypto = "1.1.0"
androidxSplash = "1.1.0-rc01"
androidxWork = "2.10.3"
bitwardenSdk = "1.0.0-2825-e05ba6eb"
bitwardenSdk = "1.0.0-2944-8447df0c"
crashlytics = "3.0.6"
detekt = "1.23.8"
firebaseBom = "34.1.0"
firebaseBom = "34.2.0"
glide = "1.0.0-beta01"
googleGuava = "33.4.8-jre"
googleProtoBufJava = "4.31.1"
googleProtoBufJava = "4.32.0"
googleProtoBufPlugin = "0.9.5"
googleServices = "4.4.3"
googleReview = "2.0.2"
hilt = "2.57"
hilt = "2.57.1"
junit5 = "5.13.4"
jvmTarget = "17"
jvmTarget = "21"
# kotlin and ksp **must** use compatible versions, do not update either without the other.
kotlin = "2.2.0"
kotlin = "2.2.10"
kotlinxCollectionsImmutable = "0.4.0"
kotlinxCoroutines = "1.10.2"
kotlinxSerialization = "1.9.0"
kotlinxKover = "0.9.1"
ksp = "2.2.0-2.0.2"
ksp = "2.2.10-2.0.2"
mockk = "1.14.5"
okhttp = "5.1.0"
retrofitBom = "3.0.0"
@@ -83,6 +84,8 @@ androidx-compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling
androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidxCore" }
#noinspection CredentialDependency - Used for Passkey support, which is not available below Android 14
androidx-credentials = { module = "androidx.credentials:credentials", version.ref = "androidxCredentials" }
androidx-credentials-providerevents = { module = "androidx.credentials.providerevents:providerevents", version.ref = "androidxCredentialsProviderEvents" }
androidx-credentials-providerevents-play-services = { module = "androidx.credentials.providerevents:providerevents-play-services", version.ref = "androidxCredentialsProviderEvents" }
androidx-hilt-navigation-compose = { module = "androidx.hilt:hilt-navigation-compose", version.ref = "androidxHiltNavigationCompose" }
androidx-lifecycle-process = { module = "androidx.lifecycle:lifecycle-process", version.ref = "androidxLifecycle" }
androidx-lifecycle-runtime-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "androidxLifecycle" }
+1
View File
@@ -53,6 +53,7 @@ include(
":authenticator",
":authenticatorbridge",
":core",
":cxf",
":data",
":network",
":ui",
@@ -27,12 +27,12 @@ interface NavigationItem {
/**
* Route of the tab's graph.
*/
val graphRoute: String
val graphRoute: Any
/**
* Route of the tab's start destination.
*/
val startDestinationRoute: String
val startDestinationRoute: Any
/**
* The test tag of the tab.
@@ -115,3 +115,11 @@ fun @receiver:StringRes Int.asText(): Text = ResText(this)
* Convert a resource Id to [Text] with format args.
*/
fun @receiver:StringRes Int.asText(vararg args: Any): Text = ResArgsText(this, args.asList())
/**
* Convert a resource Id to [Text] with quantity and format args.
*/
fun @receiver:PluralsRes Int.asPluralsText(
quantity: Int,
vararg args: Any,
): Text = PluralsText(id = this, quantity = quantity, args = args.asList())
+23 -14
View File
@@ -12,7 +12,7 @@
<string name="copy_password">Kopieer wagwoord</string>
<string name="copy_username">Kopieer gebruikersnaam</string>
<string name="delete">Skrap</string>
<string name="deleting">Skrap tans…</string>
<string name="deleting">Deleting…</string>
<string name="do_you_really_want_to_delete">Wil u dit regtig skrap? Dit kan nie ontdaan word nie.</string>
<string name="edit">Wysig</string>
<string name="edit_folder">Wysig vouer</string>
@@ -55,7 +55,7 @@
<string name="password">Wagwoord</string>
<string name="save">Bewaar</string>
<string name="move">Skuif</string>
<string name="saving">Bewaar tans…</string>
<string name="saving">Saving…</string>
<string name="settings">Instellings</string>
<string name="show">Toon</string>
<string name="item_deleted">Item is geskrap.</string>
@@ -104,13 +104,16 @@
<string name="immediately">Onmiddellik</string>
<string name="vault_timeout_log_out_confirmation_title">Set session timeout to \"Log out\"?</string>
<string name="vault_timeout_log_out_confirmation_message">After the timeout period, you will be logged out. You will need to be connected to the internet to log in and access your vault again. Your settings and PIN saved on this device won\'t change.</string>
<string name="logging_in">Teken tans aan…</string>
<string name="logging_in">Logging in…</string>
<string name="login_to_bitwarden">Log in to Bitwarden</string>
<string name="master_password_confirmation_val_message">Wagwoordbevestiging is verkeerd.</string>
<string name="master_password_description">Die hoofwagwoord is die wagwoord wat u gebruik vir toegang tot die kluis. Dit is baie belangrik dat u dit onthou. Dit kan op geen manier teruggevind word indien u dit vergeet nie.</string>
<string name="master_password_hint">Hoofwagwoordwenk (opsioneel)</string>
<string name="master_password_hint_description">’n Hoofwagwoordwenk kan u help om u wagwoord te onthou indien u dit sou vergeet.</string>
<string name="master_password_length_val_message_x">Die hoofwagwoord moet ten minste %1$s karakters lank wees.</string>
<plurals name="master_password_length_val_message_x">
<item quantity="one">Master password must be at least %d character long.</item>
<item quantity="other">Master password must be at least %d characters long.</item>
</plurals>
<string name="min_numbers">Min. aantal syfers</string>
<string name="min_special">Min. aantal spesiaal</string>
<string name="never">Nooit</string>
@@ -143,8 +146,8 @@
<string name="select">Kies</string>
<string name="item_details">Item details</string>
<string name="item_updated">Item bygewerk.</string>
<string name="submitting">Word ingedien…</string>
<string name="syncing">Sinkroniseer...</string>
<string name="submitting">Submitting…</string>
<string name="syncing">Syncing…</string>
<string name="syncing_complete">Klaar gesinchroniseer.</string>
<string name="two_step_login">Tweestapaantekening</string>
<string name="unlock_with_biometrics">Unlock with Biometrics</string>
@@ -163,7 +166,7 @@
<string name="search_for_a_login_or_add_a_new_login">Search for a login or add a new login</string>
<string name="disabled">Gedeaktiveer</string>
<string name="bitwarden_autofill_service_alert2">Die eenvoudigste manier om nuwe aantekeninge tot u kluis toe te voeg is vanuit die Bitwarden-outovuldiens. Leer meer oor die gebruik van die Bitwarden-outovuldiens in “Instellings”.</string>
<string name="autofill">Outovul</string>
<string name="autofill_title">Autofill</string>
<string name="autofill_or_view">Wil u hierdie item outovul of bekyk?</string>
<string name="search">Soek</string>
<string name="learn_org">Meer oor organisasies</string>
@@ -182,7 +185,7 @@
<string name="add_new_attachment">Voeg nuwe aanhegsel toe</string>
<string name="attachments">Aanhegsels</string>
<string name="unable_to_download_file">Kan nie lêer aflaai nie.</string>
<string name="downloading">Laai tans af…</string>
<string name="downloading">Downloading…</string>
<string name="attachment_large_warning">Hierdie aanhegsel is %1$s groot. Is u seker u wil dit op u toestel aflaai?</string>
<string name="authenticator_key">Waarmerkkode (TOTP)</string>
<string name="verification_code_totp">Bevestigingskode (TOTP)</string>
@@ -309,7 +312,10 @@ Skandering gebeur outomaties.</string>
<string name="personal_details">Personal Details</string>
<string name="contact_info">Contact Info</string>
<string name="check_password_for_data_breaches">Check password for data breaches</string>
<string name="password_exposed">Hierdie wagwoord is %1$s keer in databreuke blootgestel. U behoort dit te verander.</string>
<plurals name="password_exposed">
<item quantity="one">This password has been exposed %d time in data breaches. You should change it.</item>
<item quantity="other">This password has been exposed %d times in data breaches. You should change it.</item>
</plurals>
<string name="password_safe">Hierdie wagwoord is in geen bekende databreuke gevind nie. Dit behoort veilig vir gebruik te wees.</string>
<string name="identity_name">Identiteitnaam</string>
<string name="value">Waarde</string>
@@ -393,10 +399,10 @@ Skandering gebeur outomaties.</string>
<string name="save_attachment_success">Aanhegsel suksesvol bewaar</string>
<string name="autofill_tile_accessibility_required">Aktiveer asb. “Outovultoeganklikheidsdiens” in Bitwarden-instellings om die outovulteël te gebruik.</string>
<string name="autofill_tile_uri_not_found">Geen wagwoordvelde bespeur</string>
<string name="soft_deleting">Stuur na die asblik…</string>
<string name="soft_deleting">Sending to trash…</string>
<string name="item_soft_deleted">Item is na asblik verstuur.</string>
<string name="restore">Stel terug</string>
<string name="restoring">Stel tans terug…</string>
<string name="restoring">Restoring…</string>
<string name="item_restored">Item is teruggestel.</string>
<string name="trash">Asblik</string>
<string name="do_you_really_want_to_permanently_delete_cipher">Wil u dit regtig permanent skrap? Dit kan nie ontdaan word nie.</string>
@@ -749,7 +755,10 @@ Wil u na die rekening omskakel?</string>
<string name="bitwarden_cannot_reset_a_lost_or_forgotten_master_password">Bitwarden cannot reset a lost or forgotten master password.</string>
<string name="choose_your_master_password">Choose your master password</string>
<string name="choose_a_unique_and_strong_password_to_keep_your_information_safe">Choose a unique and strong password to keep your information safe.</string>
<string name="minimum_characters">%1$s characters</string>
<plurals name="minimum_characters">
<item quantity="one">%d character</item>
<item quantity="other">%d characters</item>
</plurals>
<string name="expired_link">Expired link</string>
<string name="please_restart_registration_or_try_logging_in">Please restart registration or try logging in. You may already have an account.</string>
<string name="restart_registration">Restart registration</string>
@@ -802,7 +811,7 @@ Wil u na die rekening omskakel?</string>
<string name="need_help_check_out_import_help">Need help? Check out <annotation link="importHelp">import help</annotation>.</string>
<string name="save_the_exported_file_somewhere_on_your_computer_you_can_find_easily"><annotation emphasis="bold">Save the exported file</annotation> somewhere on your computer you can find easily.</string>
<string name="this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server">This is not a recognized Bitwarden server. You may need to check with your provider or update your server.</string>
<string name="syncing_logins_loading_message">Syncing logins...</string>
<string name="syncing_logins_loading_message">Syncing logins…</string>
<string name="download_the_browser_extension">Download the browser extension</string>
<string name="go_to_bitwarden_com_download_to_integrate_bitwarden_into_browser">Go to bitwarden.com/download to integrate Bitwarden into your favorite browser for a seamless experience.</string>
<string name="use_the_web_app">Use the web app</string>
@@ -911,7 +920,7 @@ Wil u na die rekening omskakel?</string>
<string name="no_folder">No folder</string>
<string name="show_less">Show less</string>
<string name="add_field">Add field</string>
<string name="x_ellipses">%s...</string>
<string name="x_ellipses">%s…</string>
<string name="share_error_details">Share error details</string>
<string name="flight_recorder">Flight recorder</string>
<string name="flight_recorder_help">Flight recorder help</string>
+35 -14
View File
@@ -12,7 +12,7 @@
<string name="copy_password">نسخ كلمة المرور</string>
<string name="copy_username">انسخ اسم المستخدم</string>
<string name="delete">حذف</string>
<string name="deleting">جارِ الحذف...</string>
<string name="deleting">Deleting…</string>
<string name="do_you_really_want_to_delete">هل تريد حقا أن تحذف؟ هذا لا يمكن التراجع عنها.</string>
<string name="edit">تعديل</string>
<string name="edit_folder">تحرير المجلد</string>
@@ -55,7 +55,7 @@
<string name="password">كلمة المرور</string>
<string name="save">حفظ</string>
<string name="move">نقل</string>
<string name="saving">جارِ حفظ...</string>
<string name="saving">Saving…</string>
<string name="settings">الإعدادات</string>
<string name="show">إظهار</string>
<string name="item_deleted">تم حذف العنصر.</string>
@@ -104,13 +104,20 @@
<string name="immediately">فورًا</string>
<string name="vault_timeout_log_out_confirmation_title">Set session timeout to \"Log out\"?</string>
<string name="vault_timeout_log_out_confirmation_message">After the timeout period, you will be logged out. You will need to be connected to the internet to log in and access your vault again. Your settings and PIN saved on this device won\'t change.</string>
<string name="logging_in">جارِ تسجيل الدخول...</string>
<string name="logging_in">Logging in…</string>
<string name="login_to_bitwarden">تسجيل الدخول إلى بت واردن</string>
<string name="master_password_confirmation_val_message">تأكيد كلمة المرور غير صحيح.</string>
<string name="master_password_description">كلمة المرور الرئيسية هي كلمة المرور المستخدمة للوصول إلى الخزنة الخاصة بك. من المهم جدا ً ألا تنسى ذلك. لا توجد طريقة للعثور عليها إذا نسيت.</string>
<string name="master_password_hint">فهرس كلمة المرور الرئيسية (اختياري)</string>
<string name="master_password_hint_description">يمكن أن تساعدك فكرة كلمة المرور الرئيسية على تذكر كلمة المرور الخاصة بك إذا نسيت.</string>
<string name="master_password_length_val_message_x">كلمة المرور الرئيسية يجب أن تكون على الأقل %1$s حرفاً.</string>
<plurals name="master_password_length_val_message_x">
<item quantity="zero">Master password must be at least %d characters long.</item>
<item quantity="one">Master password must be at least %d character long.</item>
<item quantity="two">Master password must be at least %d characters long.</item>
<item quantity="few">Master password must be at least %d characters long.</item>
<item quantity="many">Master password must be at least %d characters long.</item>
<item quantity="other">Master password must be at least %d characters long.</item>
</plurals>
<string name="min_numbers">الحد الأدنى للأرقام</string>
<string name="min_special">الحد الأدنى من الأحرف الخاصة</string>
<string name="never">أبداً</string>
@@ -143,8 +150,8 @@
<string name="select">تحديد</string>
<string name="item_details">تفاصيل العنصر</string>
<string name="item_updated">تم تحديث العنصر</string>
<string name="submitting">جارِ الإرسال...</string>
<string name="syncing">جارِ المزامنة...</string>
<string name="submitting">Submitting…</string>
<string name="syncing">Syncing…</string>
<string name="syncing_complete">اكتمال المزامنة.</string>
<string name="two_step_login">تحديد المصادقة الثنائية</string>
<string name="unlock_with_biometrics">Unlock with Biometrics</string>
@@ -163,7 +170,7 @@
<string name="search_for_a_login_or_add_a_new_login">البحث عن تسجيل الدخول أو إضافة تسجيل دخول جديد</string>
<string name="disabled">تعطيل</string>
<string name="bitwarden_autofill_service_alert2">أسهل طريقة لإضافة تسجيلات دخول جديدة إلى خزانتك هي من خدمة التعبئة التلقائية بت واردن تعرف على المزيد حول استخدام خدمة الملء التلقائي لـ بت واردن عن طريق الانتقال إلى شاشة \"إعدادات\".</string>
<string name="autofill">التعبئة التلقائية</string>
<string name="autofill_title">Autofill</string>
<string name="autofill_or_view">هل تريد الملأ التلقائي أو رؤية هذا المعرّف؟</string>
<string name="search">بحث</string>
<string name="learn_org">تعرف على المؤسسات</string>
@@ -182,7 +189,7 @@
<string name="add_new_attachment">إضافة مرفق جديد</string>
<string name="attachments">مرفقات</string>
<string name="unable_to_download_file">تعذر تنزيل الملف.</string>
<string name="downloading">جارِ التحميل...</string>
<string name="downloading">Downloading…</string>
<string name="attachment_large_warning">حجم هذا المرفق %1$s. هل أنت متأكد أنك تريد تنزيله على جهازك؟</string>
<string name="authenticator_key">مفتاح المصادقة (TOTP)</string>
<string name="verification_code_totp">رمز التحقق (TOTP)</string>
@@ -309,7 +316,14 @@
<string name="personal_details">التفاصيل الشخصية</string>
<string name="contact_info">معلومات الاتصال</string>
<string name="check_password_for_data_breaches">تحقق من كلمة المرور لخروقات البيانات</string>
<string name="password_exposed">تم كشف كلمة المرور هذه %1$s مرة (مرات) في عمليات اختراق البيانات. يجب عليك تغييرها.</string>
<plurals name="password_exposed">
<item quantity="zero">This password has been exposed %d times in data breaches. You should change it.</item>
<item quantity="one">This password has been exposed %d time in data breaches. You should change it.</item>
<item quantity="two">This password has been exposed %d times in data breaches. You should change it.</item>
<item quantity="few">This password has been exposed %d times in data breaches. You should change it.</item>
<item quantity="many">This password has been exposed %d times in data breaches. You should change it.</item>
<item quantity="other">This password has been exposed %d times in data breaches. You should change it.</item>
</plurals>
<string name="password_safe">لم يتم العثور على كلمة المرور هذه في أي عمليات اختراق معروفة للبيانات. يجب أن تكون آمنة للاستخدام.</string>
<string name="identity_name">اسم الهوية</string>
<string name="value">القيمة</string>
@@ -393,10 +407,10 @@
<string name="save_attachment_success">تم حفظ المرفق بنجاح</string>
<string name="autofill_tile_accessibility_required">الرجاء تمكين \"خدمة الوصول إلى الملء التلقائي\" من إعدادات بت واردن لاستخدام الملء التلقائي.</string>
<string name="autofill_tile_uri_not_found">لم يتم العثور على حقول كلمة المرور</string>
<string name="soft_deleting">إرسال إلى سلة المهملات...</string>
<string name="soft_deleting">Sending to trash…</string>
<string name="item_soft_deleted">تم إرسال العنصر إلى سلة المهملات.</string>
<string name="restore">استعادة</string>
<string name="restoring">إستعادة...</string>
<string name="restoring">Restoring…</string>
<string name="item_restored">تم استعادة العنصر.</string>
<string name="trash">سلة المهملات</string>
<string name="do_you_really_want_to_permanently_delete_cipher">هل تريد حقاً الحذف نهائيًا؟ لا يمكن التراجع عن ذلك.</string>
@@ -749,7 +763,14 @@
<string name="bitwarden_cannot_reset_a_lost_or_forgotten_master_password">لا يمكن لبت واردن إعادة تعيين كلمة مرور رئيسية مفقودة أو منسية.</string>
<string name="choose_your_master_password">اختر كلمة المرور الرئيسية</string>
<string name="choose_a_unique_and_strong_password_to_keep_your_information_safe">اختر كلمة مرور فريدة وقوية للحفاظ على سلامة معلوماتك.</string>
<string name="minimum_characters">%1$s أحرف</string>
<plurals name="minimum_characters">
<item quantity="zero">%d characters</item>
<item quantity="one">%d character</item>
<item quantity="two">%d characters</item>
<item quantity="few">%d characters</item>
<item quantity="many">%d characters</item>
<item quantity="other">%d characters</item>
</plurals>
<string name="expired_link">رابط منتهي الصلاحية</string>
<string name="please_restart_registration_or_try_logging_in">الرجاء إعادة تشغيل التسجيل أو محاولة تسجيل الدخول. قد يكون لديك حساب بالفعل.</string>
<string name="restart_registration">إعادة تشغيل التسجيل</string>
@@ -802,7 +823,7 @@
<string name="need_help_check_out_import_help">بحاجة إلى مساعدة؟ تحقق من مساعدة الاستيراد.</string>
<string name="save_the_exported_file_somewhere_on_your_computer_you_can_find_easily">حفظ الملف المصدّر في مكان ما على جهاز الكمبيوتر الخاص بك يمكنك العثور عليه بسهولة.</string>
<string name="this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server">هذا ليس خادم بت واردن المعترف به. قد تحتاج إلى التحقق مع المزود الخاص بك أو تحديث الخادم الخاص بك.</string>
<string name="syncing_logins_loading_message">مزامنة تسجيلات الدخول...</string>
<string name="syncing_logins_loading_message">Syncing logins…</string>
<string name="download_the_browser_extension">تحميل ملحق المتصفح</string>
<string name="go_to_bitwarden_com_download_to_integrate_bitwarden_into_browser">اذهب إلى bitwarden.com/download لدمج بت واردن في المتصفح المفضل لديك للحصول على تجربة سلسة.</string>
<string name="use_the_web_app">استخدام تطبيق الويب</string>
@@ -911,7 +932,7 @@
<string name="no_folder">لا يوجد مجلد</string>
<string name="show_less">عرض أقل</string>
<string name="add_field">إضافة حقل</string>
<string name="x_ellipses">%s...</string>
<string name="x_ellipses">%s…</string>
<string name="share_error_details">مشاركة تفاصيل الخطأ</string>
<string name="flight_recorder">مسجل الرحلة</string>
<string name="flight_recorder_help">مساعدة مسجل الطيران</string>
+23 -14
View File
@@ -12,7 +12,7 @@
<string name="copy_password">Parolu kopyala</string>
<string name="copy_username">İstifadəçi adını kopyala</string>
<string name="delete">Sil</string>
<string name="deleting">Silinir...</string>
<string name="deleting">Deleting…</string>
<string name="do_you_really_want_to_delete">Həqiqətən silmək istəyirsiniz? Bunun geri dönüşü yoxdur.</string>
<string name="edit">Düzəliş et</string>
<string name="edit_folder">Qovluğa düzəliş et</string>
@@ -55,7 +55,7 @@
<string name="password">Parol</string>
<string name="save">Saxla</string>
<string name="move">Daşı</string>
<string name="saving">Saxlanılır...</string>
<string name="saving">Saving…</string>
<string name="settings">Ayarlar</string>
<string name="show">Göstər</string>
<string name="item_deleted">Element silindi.</string>
@@ -104,13 +104,16 @@
<string name="immediately">Dərhal</string>
<string name="vault_timeout_log_out_confirmation_title">Seans vaxt bitməsi \"Çıxış et\" olaraq təyin edilsin?</string>
<string name="vault_timeout_log_out_confirmation_message">Vaxt bitdikdən sonra hesabdan çıxış ediləcək. Seyfinizə təkrar giriş edib erişmək üçün internetə bağlanmalısınız. Bu cihazdakı saxlanılmış ayarlarınız və PIN dəyişməyəcək.</string>
<string name="logging_in">Giriş edilir...</string>
<string name="logging_in">Logging in…</string>
<string name="login_to_bitwarden">Bitwarden-ə giriş edin</string>
<string name="master_password_confirmation_val_message">Parol təsdiqləmə doğru deyil.</string>
<string name="master_password_description">Ana parol, seyfinizə erişmək üçün istifadə edəcəyiniz paroldur. Ana parolu yadda saxlamaq çox vacibdir. Unutsanız, parolu bərpa etməyin heç bir yolu yoxdur.</string>
<string name="master_password_hint">Ana parol məsləhəti (ixtiyari)</string>
<string name="master_password_hint_description">Ana parol məsləhəti, unutduğunuz parolu xatırlamağınıza kömək edir.</string>
<string name="master_password_length_val_message_x">Ana parol ən azı %1$s simvol uzunluğunda olmalıdır.</string>
<plurals name="master_password_length_val_message_x">
<item quantity="one">Ana parol ən azı %d xarakter uzunluğunda olmalıdır.</item>
<item quantity="other">Ana parol ən azı %d xarakter uzunluğunda olmalıdır.</item>
</plurals>
<string name="min_numbers">Minimum rəqəm</string>
<string name="min_special">Minimum simvol</string>
<string name="never">Heç vaxt</string>
@@ -143,8 +146,8 @@
<string name="select">Seçin</string>
<string name="item_details">Element detalları</string>
<string name="item_updated">Element güncəlləndi.</string>
<string name="submitting">Göndərilir...</string>
<string name="syncing">Sinxronlaşdırılır...</string>
<string name="submitting">Submitting…</string>
<string name="syncing">Syncing…</string>
<string name="syncing_complete">Sinxr tamamlandı</string>
<string name="two_step_login">İki mərhələli giriş</string>
<string name="unlock_with_biometrics">Kilidi biometriklə aç</string>
@@ -163,7 +166,7 @@
<string name="search_for_a_login_or_add_a_new_login">Bir giriş axtar və ya yenisini əlavə et</string>
<string name="disabled">Sıradan çıxarıldı</string>
<string name="bitwarden_autofill_service_alert2">Seyfinizə yeni bir giriş əlavə etməyin ən asan yolu, Bitwarden Avto-doldurma Xidmətidir. Bitwarden Avto-doldurma Xidmətini istifadə etməklə bağlı daha ətraflı məlumat üçün \"Ayarlar\" ekranına gedin.</string>
<string name="autofill">Avto-doldurma</string>
<string name="autofill_title">Avto-doldur</string>
<string name="autofill_or_view">Avto-doldurmaq və ya bu elementə baxmaq istəyirsiniz?</string>
<string name="search">Axtar</string>
<string name="learn_org">Təşkilatlar barədə daha ətraflı</string>
@@ -182,7 +185,7 @@
<string name="add_new_attachment">Yeni qoşma əlavə et</string>
<string name="attachments">Qoşmalar</string>
<string name="unable_to_download_file">Fayl endirilə bilmir.</string>
<string name="downloading">Endirilir...</string>
<string name="downloading">Downloading…</string>
<string name="attachment_large_warning">Bu qoşmanın həcmi %1$s. Faylı cihazınıza endirmək istədiyinizə əminsiniz?</string>
<string name="authenticator_key">Kimlik doğrulayıcı açarı (TOTP)</string>
<string name="verification_code_totp">Doğrulama kodu (TOTP)</string>
@@ -309,7 +312,10 @@ Skan prosesi avtomatik baş tutacaq.</string>
<string name="personal_details">Fərdi detallar</string>
<string name="contact_info">Əlaqə məlumatı</string>
<string name="check_password_for_data_breaches">Parolları veri pozuntularına qarşı yoxla</string>
<string name="password_exposed">Bu parol, veri pozuntularında %1$s dəfə üzə çıxıb. Onu dəyişdirməlisiniz.</string>
<plurals name="password_exposed">
<item quantity="one">Bu parol, veri pozuntularında %d dəfə üzə çıxıb. Onu dəyişdirməlisiniz.</item>
<item quantity="other">Bu parol, veri pozuntularında %d dəfə üzə çıxıb. Onu dəyişdirməlisiniz.</item>
</plurals>
<string name="password_safe">Bu parol, veri pozuntularında tapılmayıb. Rahatlıqla istifadə edə bilərsiniz.</string>
<string name="identity_name">Kimlik adı</string>
<string name="value">Dəyər</string>
@@ -393,10 +399,10 @@ Skan prosesi avtomatik baş tutacaq.</string>
<string name="save_attachment_success">Qoşma uğurla saxlanıldı</string>
<string name="autofill_tile_accessibility_required">Avto-doldurma qutusunu istifadə etmək üçün lütfən Bitwarden ayarlarında \"Avto-doldurma Erişiləbilənlik Xidməti\"ni işə salın.</string>
<string name="autofill_tile_uri_not_found">Heç bir parol sahəsi aşkarlanmadı</string>
<string name="soft_deleting">Tullantı qutusuna göndərilir...</string>
<string name="soft_deleting">Sending to trash…</string>
<string name="item_soft_deleted">Element tullantı qutusuna göndərildi.</string>
<string name="restore">Bərpa et</string>
<string name="restoring">Bərpa edilid...</string>
<string name="restoring">Restoring…</string>
<string name="item_restored">Element bərpa edildi.</string>
<string name="trash">Tullantı qutusu</string>
<string name="do_you_really_want_to_permanently_delete_cipher">Həqiqətən birdəfəlik silmək istəyirsiniz? Bunun geri dönüşü yoxdur.</string>
@@ -748,7 +754,10 @@ Bu hesaba keçmək istəyirsiniz?</string>
<string name="bitwarden_cannot_reset_a_lost_or_forgotten_master_password">Bitwarden itmiş və ya unutulmuş ana parolu sıfırlaya bilməz.</string>
<string name="choose_your_master_password">Ana parolunuzu seçin</string>
<string name="choose_a_unique_and_strong_password_to_keep_your_information_safe">Məlumatlarınızı təhlükəsiz saxlamaq üçün unikal və güclü bir parol seçin.</string>
<string name="minimum_characters">%1$s xarakter</string>
<plurals name="minimum_characters">
<item quantity="one">%d xarakter</item>
<item quantity="other">%d xarakter</item>
</plurals>
<string name="expired_link">Vaxtı bitmiş keçid</string>
<string name="please_restart_registration_or_try_logging_in">Lütfən qeydiyyatı yenidən başladın və ya giriş etməyə çalışın. Artıq bir hesabınız ola bilər.</string>
<string name="restart_registration">Qeydiyyatı yenidən başlat</string>
@@ -801,7 +810,7 @@ Bu hesaba keçmək istəyirsiniz?</string>
<string name="need_help_check_out_import_help">Kömək lazımdır? Daxilə köçürmə üzrə kömək səhifəmizə baxın.</string>
<string name="save_the_exported_file_somewhere_on_your_computer_you_can_find_easily">Xaricə köçürdüyünüz faylı kompüterinizdə rahatlıqla tapa biləcəyiniz yerdə saxlayın.</string>
<string name="this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server">Bu, bilinən Bitwarden serveri deyil. Provayderinizi yoxlamağınız və ya serverinizi güncəlləməyiniz lazım gələ bilər.</string>
<string name="syncing_logins_loading_message">Girişlər sinxronlaşdırılır...</string>
<string name="syncing_logins_loading_message">Syncing logins…</string>
<string name="download_the_browser_extension">Brauzer uzantısını endir</string>
<string name="go_to_bitwarden_com_download_to_integrate_bitwarden_into_browser">Daha problemsiz bir təcrübə üçün Bitwarden-i sevimli brauzerinizə inteqrasiya etmək üçün bitwarden.com/download ünvanına gedin. </string>
<string name="use_the_web_app">Veb tətbiqi istifadə et</string>
@@ -910,7 +919,7 @@ Bu hesaba keçmək istəyirsiniz?</string>
<string name="no_folder">Qovluq yoxdur</string>
<string name="show_less">Daha az göstər</string>
<string name="add_field">Xana əlavə et</string>
<string name="x_ellipses">%s...</string>
<string name="x_ellipses">%s…</string>
<string name="share_error_details">Xəta detallarını paylaş</string>
<string name="flight_recorder">Uçuş yazıcısı</string>
<string name="flight_recorder_help">Uçuş yazıcısı üzrə kömək</string>
+29 -14
View File
@@ -12,7 +12,7 @@
<string name="copy_password">Скапіяваць пароль</string>
<string name="copy_username">Скапіяваць імя карыстальніка</string>
<string name="delete">Выдаліць</string>
<string name="deleting">Выдаленне...</string>
<string name="deleting">Deleting…</string>
<string name="do_you_really_want_to_delete">Вы сапраўды хочаце выдаліць? Гэта дзеянне немагчыма адрабіць.</string>
<string name="edit">Рэдагаваць</string>
<string name="edit_folder">Рэдагаваць папку</string>
@@ -55,7 +55,7 @@
<string name="password">Пароль</string>
<string name="save">Захаваць</string>
<string name="move">Перамясціць</string>
<string name="saving">Захаванне...</string>
<string name="saving">Saving…</string>
<string name="settings">Налады</string>
<string name="show">Паказаць</string>
<string name="item_deleted">Элемент быў выдалены.</string>
@@ -104,13 +104,18 @@
<string name="immediately">Адразу</string>
<string name="vault_timeout_log_out_confirmation_title">Set session timeout to \"Log out\"?</string>
<string name="vault_timeout_log_out_confirmation_message">After the timeout period, you will be logged out. You will need to be connected to the internet to log in and access your vault again. Your settings and PIN saved on this device won\'t change.</string>
<string name="logging_in">Уваход...</string>
<string name="logging_in">Logging in…</string>
<string name="login_to_bitwarden">Log in to Bitwarden</string>
<string name="master_password_confirmation_val_message">Няправільна пацвярджэнне пароля.</string>
<string name="master_password_description">Асноўны пароль — гэта ключ, які выкарыстоўваецца для доступу да вашага сховішча. Ён вельмі важны, таму не забывайце яго. Аднавіць асноўны пароль немагчыма ў выпадку, калі вы яго забылі.</string>
<string name="master_password_hint">Падказка да асноўнага пароля (неабавязкова)</string>
<string name="master_password_hint_description">Падказка да асноўнага пароля можа дапамагчы вам успомніць яго, калі вы яго забылі.</string>
<string name="master_password_length_val_message_x">Асноўны пароль павінен змяшчаць прынамсі %1$s сімвалаў.</string>
<plurals name="master_password_length_val_message_x">
<item quantity="one">Master password must be at least %d character long.</item>
<item quantity="few">Master password must be at least %d characters long.</item>
<item quantity="many">Master password must be at least %d characters long.</item>
<item quantity="other">Master password must be at least %d characters long.</item>
</plurals>
<string name="min_numbers">Мінімум лічбаў</string>
<string name="min_special">Мінімум спецыяльных сімвалаў</string>
<string name="never">Ніколі</string>
@@ -143,8 +148,8 @@
<string name="select">Выбраць</string>
<string name="item_details">Item details</string>
<string name="item_updated">Элемент абноўлены.</string>
<string name="submitting">Адпраўка...</string>
<string name="syncing">Сінхранізацыя...</string>
<string name="submitting">Submitting…</string>
<string name="syncing">Syncing…</string>
<string name="syncing_complete">Сінхранізацыя завершана.</string>
<string name="two_step_login">Двухэтапны ўваход</string>
<string name="unlock_with_biometrics">Unlock with Biometrics</string>
@@ -163,7 +168,7 @@
<string name="search_for_a_login_or_add_a_new_login">Search for a login or add a new login</string>
<string name="disabled">Адключана</string>
<string name="bitwarden_autofill_service_alert2">Самым простым спосаб дадаць новыя лагіны ў ваша сховішча з\'яўляецца выкарыстанне службы аўтазапаўнення Bitwarden. Дадатковыя звесткі пра выкарыстанне гэтага пашырэння можна знайсці ў раздзеле \"Налады\".</string>
<string name="autofill">Аўтазапаўненне</string>
<string name="autofill_title">Autofill</string>
<string name="autofill_or_view">Вы сапраўды хочаце аўтазапоўніць або паглядзець гэты элемент?</string>
<string name="search">Пошук</string>
<string name="learn_org">Даведацца пра арганізацыі</string>
@@ -182,7 +187,7 @@
<string name="add_new_attachment">Дадаць новае далучэнне</string>
<string name="attachments">Далучэнні</string>
<string name="unable_to_download_file">Немагчыма спампаваць файл.</string>
<string name="downloading">Спампоўванне...</string>
<string name="downloading">Downloading…</string>
<string name="attachment_large_warning">Гэта далучэнне мае памер %1$s. Вы сапраўды хочаце спампаваць яго на сваю прыладу?</string>
<string name="authenticator_key">Ключ аўтэнтыфікацыі (TOTP)</string>
<string name="verification_code_totp">Праверачны код (TOTP)</string>
@@ -308,7 +313,12 @@
<string name="personal_details">Personal Details</string>
<string name="contact_info">Contact Info</string>
<string name="check_password_for_data_breaches">Check password for data breaches</string>
<string name="password_exposed">Гэты пароль быў скампраметаваны наступную колькасць разоў: %1$s. Вы павінны змяніць яго.</string>
<plurals name="password_exposed">
<item quantity="one">This password has been exposed %d time in data breaches. You should change it.</item>
<item quantity="few">This password has been exposed %d times in data breaches. You should change it.</item>
<item quantity="many">This password has been exposed %d times in data breaches. You should change it.</item>
<item quantity="other">This password has been exposed %d times in data breaches. You should change it.</item>
</plurals>
<string name="password_safe">Гэты пароль не быў знойдзены ў вядомых базах уцечак. Можна працягваць яго выкарыстоўваць.</string>
<string name="identity_name">Імя пасведчання</string>
<string name="value">Значэнне</string>
@@ -392,10 +402,10 @@
<string name="save_attachment_success">Далучэнне паспяхова захавана</string>
<string name="autofill_tile_accessibility_required">Уключыце \"Службу спецыяльных магчымасцей аўтазапаўнення\" ў наладах Bitwarden для выкарыстання панэлі аўтазапаўнення.</string>
<string name="autofill_tile_uri_not_found">Палі для пароляў не знойдзены</string>
<string name="soft_deleting">Адпраўляем у сметніцу...</string>
<string name="soft_deleting">Sending to trash…</string>
<string name="item_soft_deleted">Элемент быў адпраўлены ў сметніцу.</string>
<string name="restore">Аднавіць</string>
<string name="restoring">Аднаўленне...</string>
<string name="restoring">Restoring…</string>
<string name="item_restored">Элемент быў адноўлены.</string>
<string name="trash">Сметніца</string>
<string name="do_you_really_want_to_permanently_delete_cipher">Вы сапраўды хочаце выдаліць назаўсёды? Гэтае дзеянне немагчыма адрабіць.</string>
@@ -748,7 +758,12 @@
<string name="bitwarden_cannot_reset_a_lost_or_forgotten_master_password">Bitwarden cannot reset a lost or forgotten master password.</string>
<string name="choose_your_master_password">Choose your master password</string>
<string name="choose_a_unique_and_strong_password_to_keep_your_information_safe">Choose a unique and strong password to keep your information safe.</string>
<string name="minimum_characters">%1$s characters</string>
<plurals name="minimum_characters">
<item quantity="one">%d character</item>
<item quantity="few">%d characters</item>
<item quantity="many">%d characters</item>
<item quantity="other">%d characters</item>
</plurals>
<string name="expired_link">Expired link</string>
<string name="please_restart_registration_or_try_logging_in">Please restart registration or try logging in. You may already have an account.</string>
<string name="restart_registration">Restart registration</string>
@@ -801,7 +816,7 @@
<string name="need_help_check_out_import_help">Need help? Check out <annotation link="importHelp">import help</annotation>.</string>
<string name="save_the_exported_file_somewhere_on_your_computer_you_can_find_easily"><annotation emphasis="bold">Save the exported file</annotation> somewhere on your computer you can find easily.</string>
<string name="this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server">This is not a recognized Bitwarden server. You may need to check with your provider or update your server.</string>
<string name="syncing_logins_loading_message">Syncing logins...</string>
<string name="syncing_logins_loading_message">Syncing logins…</string>
<string name="download_the_browser_extension">Download the browser extension</string>
<string name="go_to_bitwarden_com_download_to_integrate_bitwarden_into_browser">Go to bitwarden.com/download to integrate Bitwarden into your favorite browser for a seamless experience.</string>
<string name="use_the_web_app">Use the web app</string>
@@ -910,7 +925,7 @@
<string name="no_folder">No folder</string>
<string name="show_less">Show less</string>
<string name="add_field">Add field</string>
<string name="x_ellipses">%s...</string>
<string name="x_ellipses">%s…</string>
<string name="share_error_details">Share error details</string>
<string name="flight_recorder">Flight recorder</string>
<string name="flight_recorder_help">Flight recorder help</string>
+15 -6
View File
@@ -110,7 +110,10 @@
<string name="master_password_description">С главната парола получавате достъп до трезора си, не я губете! Ако я забравите, не съществува никакъв начин за нейното възстановяване.</string>
<string name="master_password_hint">Подсказка за главната парола (по избор)</string>
<string name="master_password_hint_description">Подсказката помага да си спомните паролата, ако сте я забравили.</string>
<string name="master_password_length_val_message_x">Главната парола трябва да е дълга поне %1$s знака.</string>
<plurals name="master_password_length_val_message_x">
<item quantity="one">Главната парола трябва да е с дължина поне %d знак.</item>
<item quantity="other">Главната парола трябва да е с дължина поне %d знака.</item>
</plurals>
<string name="min_numbers">Минимален брой цифри</string>
<string name="min_special">Минимален брой специални знаци</string>
<string name="never">Никога</string>
@@ -163,7 +166,7 @@
<string name="search_for_a_login_or_add_a_new_login">Търсене на елемент за вписване или добавяне на нов такъв</string>
<string name="disabled">Изключено</string>
<string name="bitwarden_autofill_service_alert2">Най-лесният начин да добавяте нови записи към трезора си е с услугата за автоматично дописване на Битуорден. Може да научите повече как да я ползвате от екрана за настройки.</string>
<string name="autofill">Автоматично дописване</string>
<string name="autofill_title">Автоматично попълване</string>
<string name="autofill_or_view">Искате да разгледате записа или да го ползвате за дописване?</string>
<string name="search">Търсене</string>
<string name="learn_org">Разберете повече за организациите</string>
@@ -182,7 +185,7 @@
<string name="add_new_attachment">Прикачване на файл</string>
<string name="attachments">Прикачени файлове</string>
<string name="unable_to_download_file">Файлът не може да се изтегли.</string>
<string name="downloading">Изтегляне…</string>
<string name="downloading">Сваляне…</string>
<string name="attachment_large_warning">Размерът на прикачения файл е %1$s. Сигурни ли сте, че искате да го свалите на устройството си?</string>
<string name="authenticator_key">Удостоверителен ключ (TOTP)</string>
<string name="verification_code_totp">Код за потвърждаване (TOTP)</string>
@@ -309,7 +312,10 @@
<string name="personal_details">Лични данни</string>
<string name="contact_info">Информация за връзка</string>
<string name="check_password_for_data_breaches">Проверка дали паролата е засегната от пробиви</string>
<string name="password_exposed">Паролата е била разкрита поне %1$s път/и в пробиви. Непременно я сменете.</string>
<plurals name="password_exposed">
<item quantity="one">Тази парола е била разкрита %d път в пробиви. Непременно я сменете.</item>
<item quantity="other">Тази парола е била разкрита %d пъти в пробиви. Непременно я сменете.</item>
</plurals>
<string name="password_safe">Паролата не е била разкрита в известните пробиви. Засега ползването ѝ изглежда безопасно.</string>
<string name="identity_name">Име на самоличността</string>
<string name="value">Стойност</string>
@@ -396,7 +402,7 @@
<string name="soft_deleting">Преместване в кошчето…</string>
<string name="item_soft_deleted">Записът е преместен в кошчето.</string>
<string name="restore">Възстановяване</string>
<string name="restoring">Възстановяване...</string>
<string name="restoring">Възстановяване…</string>
<string name="item_restored">Записът бе възстановен.</string>
<string name="trash">Кошче</string>
<string name="do_you_really_want_to_permanently_delete_cipher">Наистина ли искате да го изтриете? Действието не може да бъде отменено.</string>
@@ -749,7 +755,10 @@
<string name="bitwarden_cannot_reset_a_lost_or_forgotten_master_password">Битуорден не може да нулира загубена или забравена парола.</string>
<string name="choose_your_master_password">Изберете главна парола</string>
<string name="choose_a_unique_and_strong_password_to_keep_your_information_safe">Изберете уникална и сложна парола, за да запазите информацията си защитена.</string>
<string name="minimum_characters">%1$s знака</string>
<plurals name="minimum_characters">
<item quantity="one">%d знак</item>
<item quantity="other">%d знака</item>
</plurals>
<string name="expired_link">Връзка с изтекла давност</string>
<string name="please_restart_registration_or_try_logging_in">Моля, рестартирайте процеса на регистрация или опитайте да се впишете. Може вече да имате регистрация.</string>
<string name="restart_registration">Рестартиране на регистрацията</string>
+23 -14
View File
@@ -12,7 +12,7 @@
<string name="copy_password">পাসওয়ার্ড অনুলিপিত করুন</string>
<string name="copy_username">ব্যবহারকারীর নাম অনুলিপিত করুন</string>
<string name="delete">মুছুন</string>
<string name="deleting">মোছা হচ্ছে...</string>
<string name="deleting">Deleting…</string>
<string name="do_you_really_want_to_delete">আপনি কি সত্যিই মুছে ফেলতে চান? এটিকে পূর্বের মত করা যাবে না।.</string>
<string name="edit">সম্পাদনা</string>
<string name="edit_folder">ফোল্ডার সম্পাদনা</string>
@@ -55,7 +55,7 @@
<string name="password">পাসওয়ার্ড</string>
<string name="save">সংরক্ষণ করুন</string>
<string name="move">স্থানান্তর করুন</string>
<string name="saving">Saving...</string>
<string name="saving">Saving…</string>
<string name="settings">সেটিংস</string>
<string name="show">দেখান</string>
<string name="item_deleted">Item deleted</string>
@@ -104,13 +104,16 @@
<string name="immediately">সঙ্গে সঙ্গে</string>
<string name="vault_timeout_log_out_confirmation_title">Set session timeout to \"Log out\"?</string>
<string name="vault_timeout_log_out_confirmation_message">After the timeout period, you will be logged out. You will need to be connected to the internet to log in and access your vault again. Your settings and PIN saved on this device won\'t change.</string>
<string name="logging_in">লগইন হচ্ছে...</string>
<string name="logging_in">Logging in…</string>
<string name="login_to_bitwarden">Log in to Bitwarden</string>
<string name="master_password_confirmation_val_message">Password confirmation is not correct.</string>
<string name="master_password_description">প্রধান পাসওয়ার্ড হল সেই পাসওয়ার্ডটি যা আপনি নিজের ভল্ট ব্যাবহার করতে ব্যবহার করেন। এটি খুব গুরুত্বপূর্ণ যে আপনি নিজের প্রধান পাসওয়ার্ডটি ভুলে যাবেন না। আপনি যদি ভুলে গিয়ে থাকেন তবে পাসওয়ার্ডটি পুনরুদ্ধার করার কোনও উপায় নেই।</string>
<string name="master_password_hint">প্রধান পাসওয়ার্ড ইঙ্গিত (ঐচ্ছিক)</string>
<string name="master_password_hint_description">যদি আপনি আপনার পাসওয়ার্ড ভুলে যান তাহলে একটি প্রধান পাসওয়ার্ডের ইঙ্গিতটি আপনাকে মনে করাতে সাহায্য করতে পারে।</string>
<string name="master_password_length_val_message_x">মাস্টার পাসওয়ার্ড কমপক্ষে %1$s অক্ষরের হতে হবে।</string>
<plurals name="master_password_length_val_message_x">
<item quantity="one">Master password must be at least %d character long.</item>
<item quantity="other">Master password must be at least %d characters long.</item>
</plurals>
<string name="min_numbers">সর্বনিম্ন সংখ্যা</string>
<string name="min_special">ন্যূনতম বিশেষ</string>
<string name="never">কখনই না</string>
@@ -143,8 +146,8 @@
<string name="select">নির্বাচন করুন</string>
<string name="item_details">Item details</string>
<string name="item_updated">Item saved</string>
<string name="submitting">জমা দেওয়া হচ্ছে...</string>
<string name="syncing">Syncing...</string>
<string name="submitting">Submitting…</string>
<string name="syncing">Syncing…</string>
<string name="syncing_complete">Syncing complete</string>
<string name="two_step_login">Two-step login</string>
<string name="unlock_with_biometrics">Unlock with Biometrics</string>
@@ -163,7 +166,7 @@
<string name="search_for_a_login_or_add_a_new_login">Search for a login or add a new login</string>
<string name="disabled">নিষ্ক্রিয়</string>
<string name="bitwarden_autofill_service_alert2">The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the \"Settings\" screen.</string>
<string name="autofill">Autofill</string>
<string name="autofill_title">Autofill</string>
<string name="autofill_or_view">Do you want to autofill or view this item?</string>
<string name="search">অনুসন্ধান</string>
<string name="learn_org">Learn about organizations</string>
@@ -182,7 +185,7 @@
<string name="add_new_attachment">নতুন সংযুক্তি জুড়ুন</string>
<string name="attachments">সংযুক্তি</string>
<string name="unable_to_download_file">Unable to download file.</string>
<string name="downloading">ডাউনলোড হচ্ছে...</string>
<string name="downloading">Downloading…</string>
<string name="attachment_large_warning">This attachment is %1$s in size. Are you sure you want to download it onto your device?</string>
<string name="authenticator_key">Authenticator key</string>
<string name="verification_code_totp">Verification code (TOTP)</string>
@@ -309,7 +312,10 @@ Scanning will happen automatically.</string>
<string name="personal_details">Personal Details</string>
<string name="contact_info">Contact Info</string>
<string name="check_password_for_data_breaches">Check password for data breaches</string>
<string name="password_exposed">This password has been exposed %1$s time(s) in data breaches. You should change it.</string>
<plurals name="password_exposed">
<item quantity="one">This password has been exposed %d time in data breaches. You should change it.</item>
<item quantity="other">This password has been exposed %d times in data breaches. You should change it.</item>
</plurals>
<string name="password_safe">এই পাসওয়ার্ডটি কোনও পরিচিত তথ্য লঙ্ঘনে পাওয়া যায় নি। এটি ব্যবহার করা নিরাপদ হওয়া উচিত।</string>
<string name="identity_name">পরিচয়ের নাম</string>
<string name="value">মান</string>
@@ -393,10 +399,10 @@ Scanning will happen automatically.</string>
<string name="save_attachment_success">Attachment saved successfully</string>
<string name="autofill_tile_accessibility_required">Please turn on \"Autofill Accessibility Service\" from Bitwarden Settings to use the Autofill tile.</string>
<string name="autofill_tile_uri_not_found">No password fields detected</string>
<string name="soft_deleting">Sending to trash...</string>
<string name="soft_deleting">Sending to trash…</string>
<string name="item_soft_deleted">Item has been sent to trash.</string>
<string name="restore">Restore</string>
<string name="restoring">Restoring...</string>
<string name="restoring">Restoring…</string>
<string name="item_restored">Item restored</string>
<string name="trash">Trash</string>
<string name="do_you_really_want_to_permanently_delete_cipher">Do you really want to permanently delete? This cannot be undone.</string>
@@ -749,7 +755,10 @@ Do you want to switch to this account?</string>
<string name="bitwarden_cannot_reset_a_lost_or_forgotten_master_password">Bitwarden cannot reset a lost or forgotten master password.</string>
<string name="choose_your_master_password">Choose your master password</string>
<string name="choose_a_unique_and_strong_password_to_keep_your_information_safe">Choose a unique and strong password to keep your information safe.</string>
<string name="minimum_characters">%1$s characters</string>
<plurals name="minimum_characters">
<item quantity="one">%d character</item>
<item quantity="other">%d characters</item>
</plurals>
<string name="expired_link">Expired link</string>
<string name="please_restart_registration_or_try_logging_in">Please restart registration or try logging in. You may already have an account.</string>
<string name="restart_registration">Restart registration</string>
@@ -802,7 +811,7 @@ Do you want to switch to this account?</string>
<string name="need_help_check_out_import_help">Need help? Check out <annotation link="importHelp">import help</annotation>.</string>
<string name="save_the_exported_file_somewhere_on_your_computer_you_can_find_easily"><annotation emphasis="bold">Save the exported file</annotation> somewhere on your computer you can find easily.</string>
<string name="this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server">This is not a recognized Bitwarden server. You may need to check with your provider or update your server.</string>
<string name="syncing_logins_loading_message">Syncing logins...</string>
<string name="syncing_logins_loading_message">Syncing logins…</string>
<string name="download_the_browser_extension">Download the browser extension</string>
<string name="go_to_bitwarden_com_download_to_integrate_bitwarden_into_browser">Go to bitwarden.com/download to integrate Bitwarden into your favorite browser for a seamless experience.</string>
<string name="use_the_web_app">Use the web app</string>
@@ -911,7 +920,7 @@ Do you want to switch to this account?</string>
<string name="no_folder">No folder</string>
<string name="show_less">Show less</string>
<string name="add_field">Add field</string>
<string name="x_ellipses">%s...</string>
<string name="x_ellipses">%s…</string>
<string name="share_error_details">Share error details</string>
<string name="flight_recorder">Flight recorder</string>
<string name="flight_recorder_help">Flight recorder help</string>
+26 -14
View File
@@ -12,7 +12,7 @@
<string name="copy_password">Kopirajte lozinku</string>
<string name="copy_username">Kopirajte korisničko ime</string>
<string name="delete">Izbriši</string>
<string name="deleting">Brisanje...</string>
<string name="deleting">Deleting…</string>
<string name="do_you_really_want_to_delete">Da li stvarno želite da izbrišete? Ovo se ne može poništiti.</string>
<string name="edit">Uredi</string>
<string name="edit_folder">Uredite folder</string>
@@ -55,7 +55,7 @@
<string name="password">Lozinka</string>
<string name="save">Spremi</string>
<string name="move">Premjesti</string>
<string name="saving">Spremanje...</string>
<string name="saving">Saving…</string>
<string name="settings">Postavke</string>
<string name="show">Prikaži</string>
<string name="item_deleted">Stavka je izbrisana.</string>
@@ -104,13 +104,17 @@
<string name="immediately">Odmah</string>
<string name="vault_timeout_log_out_confirmation_title">Set session timeout to \"Log out\"?</string>
<string name="vault_timeout_log_out_confirmation_message">After the timeout period, you will be logged out. You will need to be connected to the internet to log in and access your vault again. Your settings and PIN saved on this device won\'t change.</string>
<string name="logging_in">Prijavljivanje…</string>
<string name="logging_in">Logging in…</string>
<string name="login_to_bitwarden">Log in to Bitwarden</string>
<string name="master_password_confirmation_val_message">Potvrda lozinke nije tačna.</string>
<string name="master_password_description">Glavna lozinka je lozinka koju koristite za pristup Vašem trezoru. Veoma je važno da ne zaboravite glavnu lozinku. Ne postoji način da povratite lozinku u slučaju da je zaboravite.</string>
<string name="master_password_hint">Nagoveštaj za glavnu lozinku (opcionalno)</string>
<string name="master_password_hint_description">Nagoveštaj glavne lozinke može Vam pomoći da zapamtite lozinku ako je zaboravite.</string>
<string name="master_password_length_val_message_x">Master password must be at least %1$s characters long.</string>
<plurals name="master_password_length_val_message_x">
<item quantity="one">Master password must be at least %d character long.</item>
<item quantity="few">Master password must be at least %d characters long.</item>
<item quantity="other">Master password must be at least %d characters long.</item>
</plurals>
<string name="min_numbers">Minimalno brojeva</string>
<string name="min_special">Minimalno posebnih</string>
<string name="never">Nikad</string>
@@ -143,8 +147,8 @@
<string name="select">Izaberite</string>
<string name="item_details">Item details</string>
<string name="item_updated">Stavka je ažurirana.</string>
<string name="submitting">Potvrđivanje...</string>
<string name="syncing">Sinhronizacija...</string>
<string name="submitting">Submitting…</string>
<string name="syncing">Syncing…</string>
<string name="syncing_complete">Sinhronizacija je završena.</string>
<string name="two_step_login">Prijava u dva koraka</string>
<string name="unlock_with_biometrics">Unlock with Biometrics</string>
@@ -163,7 +167,7 @@
<string name="search_for_a_login_or_add_a_new_login">Search for a login or add a new login</string>
<string name="disabled">Onemogućeno</string>
<string name="bitwarden_autofill_service_alert2">Najlakši način za dodavanje novih prijava u Vaš trezor je iz dodatka Bitwarden aplikacije. Saznajte više o korišćenju dodatka Bitwarden aplikacije u „Podešavanjima“.</string>
<string name="autofill">Popunite automatski</string>
<string name="autofill_title">Autofill</string>
<string name="autofill_or_view">Da li želite da automatski popunite ili pogledate ovu stavku?</string>
<string name="search">Pretraga</string>
<string name="learn_org">Naučite o Organizacijama</string>
@@ -182,7 +186,7 @@
<string name="add_new_attachment">Dodajte novi prilog</string>
<string name="attachments">Prilozi</string>
<string name="unable_to_download_file">Nije moguće preuzeti datoteku.</string>
<string name="downloading">Preuzimanje...</string>
<string name="downloading">Downloading…</string>
<string name="attachment_large_warning">Veličina ovog priloga je %1$s. Da li ste sigurni da ga želite preuzeti na svom uređaju?</string>
<string name="authenticator_key">Ključ autentifikatora (TOTP)</string>
<string name="verification_code_totp">Verifikacioni kod (TOTP)</string>
@@ -309,7 +313,11 @@ Skeniranje će biti izvršeno automatski.</string>
<string name="personal_details">Personal Details</string>
<string name="contact_info">Contact Info</string>
<string name="check_password_for_data_breaches">Check password for data breaches</string>
<string name="password_exposed">Ova lozinka je kompromitovana %1$s puta tijekom malicioznih napada. Savjetujemo njenu promjenu.</string>
<plurals name="password_exposed">
<item quantity="one">This password has been exposed %d time in data breaches. You should change it.</item>
<item quantity="few">This password has been exposed %d times in data breaches. You should change it.</item>
<item quantity="other">This password has been exposed %d times in data breaches. You should change it.</item>
</plurals>
<string name="password_safe">Ova lozinka nije pronađena ni u jednoj kompromitovanoj bazi podataka. Trebala bi biti sigurna sa korištenje.</string>
<string name="identity_name">Ime identiteta</string>
<string name="value">Vrijednost</string>
@@ -393,10 +401,10 @@ Skeniranje će biti izvršeno automatski.</string>
<string name="save_attachment_success">Prilog uspješno spremljen</string>
<string name="autofill_tile_accessibility_required">U Bitwarden postavkama -&gt; „Usluga auto-ispune kroz pristupačnost” uključi opciju „Koristi pristupačnost”.</string>
<string name="autofill_tile_uri_not_found">Nema pronađenih polja za unos lozinke</string>
<string name="soft_deleting">Slanje u smeće...</string>
<string name="soft_deleting">Sending to trash…</string>
<string name="item_soft_deleted">Stavka je poslana u smeće.</string>
<string name="restore">Vrati</string>
<string name="restoring">Vraćanje...</string>
<string name="restoring">Restoring…</string>
<string name="item_restored">Stavka je vraćena.</string>
<string name="trash">Smeće</string>
<string name="do_you_really_want_to_permanently_delete_cipher">Doista želite zauvijek izbrisati? To se ne može poništiti.</string>
@@ -748,7 +756,11 @@ Skeniranje će biti izvršeno automatski.</string>
<string name="bitwarden_cannot_reset_a_lost_or_forgotten_master_password">Bitwarden cannot reset a lost or forgotten master password.</string>
<string name="choose_your_master_password">Choose your master password</string>
<string name="choose_a_unique_and_strong_password_to_keep_your_information_safe">Choose a unique and strong password to keep your information safe.</string>
<string name="minimum_characters">%1$s characters</string>
<plurals name="minimum_characters">
<item quantity="one">%d character</item>
<item quantity="few">%d characters</item>
<item quantity="other">%d characters</item>
</plurals>
<string name="expired_link">Expired link</string>
<string name="please_restart_registration_or_try_logging_in">Please restart registration or try logging in. You may already have an account.</string>
<string name="restart_registration">Restart registration</string>
@@ -801,7 +813,7 @@ Skeniranje će biti izvršeno automatski.</string>
<string name="need_help_check_out_import_help">Need help? Check out <annotation link="importHelp">import help</annotation>.</string>
<string name="save_the_exported_file_somewhere_on_your_computer_you_can_find_easily"><annotation emphasis="bold">Save the exported file</annotation> somewhere on your computer you can find easily.</string>
<string name="this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server">This is not a recognized Bitwarden server. You may need to check with your provider or update your server.</string>
<string name="syncing_logins_loading_message">Syncing logins...</string>
<string name="syncing_logins_loading_message">Syncing logins…</string>
<string name="download_the_browser_extension">Download the browser extension</string>
<string name="go_to_bitwarden_com_download_to_integrate_bitwarden_into_browser">Go to bitwarden.com/download to integrate Bitwarden into your favorite browser for a seamless experience.</string>
<string name="use_the_web_app">Use the web app</string>
@@ -910,7 +922,7 @@ Skeniranje će biti izvršeno automatski.</string>
<string name="no_folder">No folder</string>
<string name="show_less">Show less</string>
<string name="add_field">Add field</string>
<string name="x_ellipses">%s...</string>
<string name="x_ellipses">%s…</string>
<string name="share_error_details">Share error details</string>
<string name="flight_recorder">Flight recorder</string>
<string name="flight_recorder_help">Flight recorder help</string>
+23 -14
View File
@@ -12,7 +12,7 @@
<string name="copy_password">Copia contrasenya</string>
<string name="copy_username">Copia el nom d\'usuari</string>
<string name="delete">Suprimeix</string>
<string name="deleting">S\'està suprimint...</string>
<string name="deleting">Deleting…</string>
<string name="do_you_really_want_to_delete">Eseu segur que voleu suprimir? Això no es pot desfer.</string>
<string name="edit">Edita</string>
<string name="edit_folder">Edita la carpeta</string>
@@ -55,7 +55,7 @@
<string name="password">Contrasenya</string>
<string name="save">Guarda</string>
<string name="move">Desplaça</string>
<string name="saving">S\'està guardant...</string>
<string name="saving">Saving…</string>
<string name="settings">Configuració</string>
<string name="show">Mostra</string>
<string name="item_deleted">S\'ha suprimit l\'element.</string>
@@ -104,13 +104,16 @@
<string name="immediately">Immediatament</string>
<string name="vault_timeout_log_out_confirmation_title">Set session timeout to \"Log out\"?</string>
<string name="vault_timeout_log_out_confirmation_message">After the timeout period, you will be logged out. You will need to be connected to the internet to log in and access your vault again. Your settings and PIN saved on this device won\'t change.</string>
<string name="logging_in">S\'està iniciant sessió...</string>
<string name="logging_in">Logging in…</string>
<string name="login_to_bitwarden">Inicia sessió a Bitwarden</string>
<string name="master_password_confirmation_val_message">La confirmació de la contrasenya no és correcta.</string>
<string name="master_password_description">La contrasenya mestra és la clau que utilitzeu per accedir a la vostra caixa forta. És molt important que no la oblideu. No hi ha manera de recuperar-la en cas de perdre-la.</string>
<string name="master_password_hint">Pista de la contrasenya mestra (opcional)</string>
<string name="master_password_hint_description">Una pista de contrasenya mestra pot ajudar-vos a recordar-la si la oblideu.</string>
<string name="master_password_length_val_message_x">La contrasenya mestra ha de contenir almenys %1$s caràcters.</string>
<plurals name="master_password_length_val_message_x">
<item quantity="one">Master password must be at least %d character long.</item>
<item quantity="other">Master password must be at least %d characters long.</item>
</plurals>
<string name="min_numbers">Mínim de caràcters numèrics</string>
<string name="min_special">Mínim de caràcters especials</string>
<string name="never">Mai</string>
@@ -143,8 +146,8 @@
<string name="select">Selecciona</string>
<string name="item_details">Item details</string>
<string name="item_updated">Element guardat</string>
<string name="submitting">S\'està enviant...</string>
<string name="syncing">S\'està sincronitzant...</string>
<string name="submitting">Submitting…</string>
<string name="syncing">Syncing…</string>
<string name="syncing_complete">Sincronització completa.</string>
<string name="two_step_login">Inici de sessió en dues passes</string>
<string name="unlock_with_biometrics">Unlock with Biometrics</string>
@@ -163,7 +166,7 @@
<string name="search_for_a_login_or_add_a_new_login">Search for a login or add a new login</string>
<string name="disabled">No</string>
<string name="bitwarden_autofill_service_alert2">La forma més senzilla d\'afegir nous inicis de sessió a la caixa forta és amb el servei d\'emplenament automàtic de Bitwarden. Obteniu més informació sobre com utilitzar el servei en la pantalla \"Eines\".</string>
<string name="autofill">Emplenament automàtic</string>
<string name="autofill_title">Autofill</string>
<string name="autofill_or_view">Voleu omplir automàticament o visualitzar aquest element?</string>
<string name="search">Cerca</string>
<string name="learn_org">Més informació sobre les organitzacions</string>
@@ -182,7 +185,7 @@
<string name="add_new_attachment">Afegeix un adjunt nou</string>
<string name="attachments">Adjunts</string>
<string name="unable_to_download_file">No es pot descarregar el fitxer.</string>
<string name="downloading">S\'està baixant...</string>
<string name="downloading">Downloading…</string>
<string name="attachment_large_warning">Aquest fitxer adjunt ocupa %1$s. Esteu segur que voleu descarregar-lo al vostre dispositiu?</string>
<string name="authenticator_key">Clau d\'autenticació (TOTP)</string>
<string name="verification_code_totp">Codi de verificació (TOTP)</string>
@@ -309,7 +312,10 @@ L\'escaneig es farà automàticament.</string>
<string name="personal_details">Personal Details</string>
<string name="contact_info">Contact Info</string>
<string name="check_password_for_data_breaches">Check password for data breaches</string>
<string name="password_exposed">Aquesta contrasenya ha estat exposada %1$s vegades en filtracions de seguretat de dades. Heu de canviar-la.</string>
<plurals name="password_exposed">
<item quantity="one">This password has been exposed %d time in data breaches. You should change it.</item>
<item quantity="other">This password has been exposed %d times in data breaches. You should change it.</item>
</plurals>
<string name="password_safe">Aquesta contrasenya no s\'ha trobat en cap filtració de dades coneguda. Hauries de poder utilitzar-la de manera segura.</string>
<string name="identity_name">Nom d\'identitat</string>
<string name="value">Valor</string>
@@ -393,10 +399,10 @@ L\'escaneig es farà automàticament.</string>
<string name="save_attachment_success">L\'adjunt s\'ha guardat correctament</string>
<string name="autofill_tile_accessibility_required">Activeu \"Servei d\'accessibilitat d\'emplenament automàtic\" de la configuració de Bitwarden per utilitzar el mosaic d\'emplenament automàtic.</string>
<string name="autofill_tile_uri_not_found">No s\'han detectat camps de contrasenya</string>
<string name="soft_deleting">S\'està enviant a la paperera...</string>
<string name="soft_deleting">Sending to trash…</string>
<string name="item_soft_deleted">L\'element s\'ha enviat a la paperera.</string>
<string name="restore">Restaura</string>
<string name="restoring">S\'està restaurant...</string>
<string name="restoring">Restoring…</string>
<string name="item_restored">L\'element s\'ha restaurat</string>
<string name="trash">Paperera</string>
<string name="do_you_really_want_to_permanently_delete_cipher">Esteu segur que voleu suprimir-ho definitivament? Això no es pot desfer.</string>
@@ -749,7 +755,10 @@ Voleu canviar a aquest compte?</string>
<string name="bitwarden_cannot_reset_a_lost_or_forgotten_master_password">Bitwarden cannot reset a lost or forgotten master password.</string>
<string name="choose_your_master_password">Trieu la contrasenya mestra</string>
<string name="choose_a_unique_and_strong_password_to_keep_your_information_safe">Choose a unique and strong password to keep your information safe.</string>
<string name="minimum_characters">%1$s characters</string>
<plurals name="minimum_characters">
<item quantity="one">%d character</item>
<item quantity="other">%d characters</item>
</plurals>
<string name="expired_link">Enllaç caducat</string>
<string name="please_restart_registration_or_try_logging_in">Please restart registration or try logging in. You may already have an account.</string>
<string name="restart_registration">Restart registration</string>
@@ -802,7 +811,7 @@ Voleu canviar a aquest compte?</string>
<string name="need_help_check_out_import_help">Need help? Check out <annotation link="importHelp">import help</annotation>.</string>
<string name="save_the_exported_file_somewhere_on_your_computer_you_can_find_easily"><annotation emphasis="bold">Save the exported file</annotation> somewhere on your computer you can find easily.</string>
<string name="this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server">This is not a recognized Bitwarden server. You may need to check with your provider or update your server.</string>
<string name="syncing_logins_loading_message">Syncing logins...</string>
<string name="syncing_logins_loading_message">Syncing logins…</string>
<string name="download_the_browser_extension">Download the browser extension</string>
<string name="go_to_bitwarden_com_download_to_integrate_bitwarden_into_browser">Go to bitwarden.com/download to integrate Bitwarden into your favorite browser for a seamless experience.</string>
<string name="use_the_web_app">Use the web app</string>
@@ -911,7 +920,7 @@ Voleu canviar a aquest compte?</string>
<string name="no_folder">No folder</string>
<string name="show_less">Show less</string>
<string name="add_field">Add field</string>
<string name="x_ellipses">%s...</string>
<string name="x_ellipses">%s…</string>
<string name="share_error_details">Share error details</string>
<string name="flight_recorder">Registrador al vol</string>
<string name="flight_recorder_help">Ajuda del Registrador al vol</string>
+21 -6
View File
@@ -110,7 +110,12 @@
<string name="master_password_description">Hlavní heslo je heslo, které používáte k přístupu do Vašeho trezoru. Je velmi důležité, abyste jej nezapomněli. Neexistuje totiž žádný způsob, jak heslo obnovit v případě, že jste jej zapomněli.</string>
<string name="master_password_hint">Nápověda k hlavnímu heslu (volitelné)</string>
<string name="master_password_hint_description">Nápověda k hlavnímu heslu Vám pomůže vzpomenout si heslo, pokud ho zapomenete.</string>
<string name="master_password_length_val_message_x">Hlavní heslo musí obsahovat alespoň %1$s znaků.</string>
<plurals name="master_password_length_val_message_x">
<item quantity="one">Hlavní heslo musí obsahovat alespoň %d znak.</item>
<item quantity="few">Hlavní heslo musí obsahovat alespoň %d znaky.</item>
<item quantity="many">Hlavní heslo musí obsahovat alespoň %d znaků.</item>
<item quantity="other">Hlavní heslo musí obsahovat alespoň %d znaků.</item>
</plurals>
<string name="min_numbers">Minimální počet číslic</string>
<string name="min_special">Minimální počet speciálních znaků</string>
<string name="never">Nikdy</string>
@@ -163,7 +168,7 @@
<string name="search_for_a_login_or_add_a_new_login">Hledat přhlášení nebo přidat nové přihlášení</string>
<string name="disabled">Zakázáno</string>
<string name="bitwarden_autofill_service_alert2">Nejjednodušší způsob, jak přidat nové přihlašovací údaje do Vašeho trezoru, je služba automatického vyplňování Bitwarden. Další informace o použití této služby naleznete na obrazovce \"Nastavení\".</string>
<string name="autofill">Automatické vyplňování</string>
<string name="autofill_title">Automatické vyplňování</string>
<string name="autofill_or_view">Chcete automaticky vyplnit nebo zobrazit tyto přihlašovací údaje?</string>
<string name="search">Hledat</string>
<string name="learn_org">Více o organizacích</string>
@@ -309,7 +314,12 @@ Načtení proběhne automaticky.</string>
<string name="personal_details">Osobní údaje</string>
<string name="contact_info">Kontaktní informace</string>
<string name="check_password_for_data_breaches">Kontrola hesla pro případ narušení bezpečnosti dat</string>
<string name="password_exposed">K úniku tohoto hesla došlo celkem %1$sx. Měli byste jej změnit.</string>
<plurals name="password_exposed">
<item quantity="one">K úniku tohoto hesla došlo celkem %dx. Měli byste jej změnit.</item>
<item quantity="few">K úniku tohoto hesla došlo celkem %dx. Měli byste jej změnit.</item>
<item quantity="many">K úniku tohoto hesla došlo celkem %dx. Měli byste jej změnit.</item>
<item quantity="other">K úniku tohoto hesla došlo celkem %dx. Měli byste jej změnit.</item>
</plurals>
<string name="password_safe">V žádném ze známých případů nedošlo k úniku tohoto hesla. Mělo by být bezpečné používat jej i nadále.</string>
<string name="identity_name">Název identity</string>
<string name="value">Hodnota</string>
@@ -748,7 +758,12 @@ Chcete se přepnout na tento účet?</string>
<string name="bitwarden_cannot_reset_a_lost_or_forgotten_master_password">Bitwarden nemůže obnovit ztracené nebo zapomenuté hlavní heslo.</string>
<string name="choose_your_master_password">Zvolte hlavní heslo</string>
<string name="choose_a_unique_and_strong_password_to_keep_your_information_safe">Zvolte jedinečné a silné heslo pro zabezpečení Vašich informací.</string>
<string name="minimum_characters">%1$s znaků</string>
<plurals name="minimum_characters">
<item quantity="one">%d znak</item>
<item quantity="few">%d znaky</item>
<item quantity="many">%d znaků</item>
<item quantity="other">%d znaků</item>
</plurals>
<string name="expired_link">Platnost odkazu vypršela</string>
<string name="please_restart_registration_or_try_logging_in">Restartujte registraci nebo se zkuste přihlásit. Možná již máte účet.</string>
<string name="restart_registration">Restartovat registraci</string>
@@ -801,7 +816,7 @@ Chcete se přepnout na tento účet?</string>
<string name="need_help_check_out_import_help">Potřebujete pomoc? Podívejte se na <annotation link="importHelp">nápovědu pro import</annotation>.</string>
<string name="save_the_exported_file_somewhere_on_your_computer_you_can_find_easily"><annotation emphasis="bold">Uložte exportovaný soubor</annotation> někde na Vašem počítači, kde jej můžete snadno najít.</string>
<string name="this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server">Nejedná se o rozpoznaný server Bitwarden. Možná budete muset zkontrolovat svého poskytovatele nebo aktualizovat svůj server.</string>
<string name="syncing_logins_loading_message">Synchronizování přihlášení...</string>
<string name="syncing_logins_loading_message">Synchronizování přihlašovacích údajů...</string>
<string name="download_the_browser_extension">Stáhnout rozšíření prohlížeče</string>
<string name="go_to_bitwarden_com_download_to_integrate_bitwarden_into_browser">Přejděte na bitwarden.com/download a integrujte Bitwarden do svého oblíbeného prohlížeče pro bezproblémové používání.</string>
<string name="use_the_web_app">Použít webovou aplikaci</string>
@@ -1073,7 +1088,7 @@ při opakování problémů.</string>
<string name="copy_error_report">Zpráva o chybě kopírování</string>
<string name="bitwarden_could_not_decrypt_this_vault_item_description_long">Bitwarden nemohl dešifrovat tuto položku trezoru. Zkopírujte a sdílejte tuto zprávu o chybě s oddělením zákaznické podpory, abyste předešli další ztrátě dat.</string>
<plurals name="bitwarden_could_not_decrypt_x_vault_item_copy_and_share_description_long">
<item quantity="one">Bitwarden nemohl dešifrovat 1 položku trezoru. Zkopírujte a sdílejte tuto zprávu o chybě s oddělením zákaznické podpory, abyste předešli další ztrátě dat.</item>
<item quantity="one">Bitwarden nemohl dešifrovat %1$d položku trezoru. Zkopírujte a sdílejte tuto zprávu o chybě s oddělením zákaznické podpory, abyste předešli další ztrátě dat.</item>
<item quantity="few">Bitwarden nemohl dešifrovat %1$d položky trezoru. Zkopírujte a sdílejte tuto zprávu o chybě s oddělením zákaznické podpory, abyste předešli další ztrátě dat.</item>
<item quantity="many">Bitwarden nemohl dešifrovat %1$d položek trezoru. Zkopírujte a sdílejte tuto zprávu o chybě s oddělením zákaznické podpory, abyste předešli další ztrátě dat.</item>
<item quantity="other">Bitwarden nemohl dešifrovat %1$d položek trezoru. Zkopírujte a sdílejte tuto zprávu o chybě s oddělením zákaznické podpory, abyste předešli další ztrátě dat.</item>
+35 -14
View File
@@ -12,7 +12,7 @@
<string name="copy_password">Copïo\'r cyfrinair</string>
<string name="copy_username">Copïo\'r enw defnyddiwr</string>
<string name="delete">Dileu</string>
<string name="deleting">Wrthi\'n dileu...</string>
<string name="deleting">Deleting…</string>
<string name="do_you_really_want_to_delete">Ydych chi wir eisiau dileu? Allwch chi ddim dadwneud hyn.</string>
<string name="edit">Golygu</string>
<string name="edit_folder">Golygu\'r ffolder</string>
@@ -55,7 +55,7 @@
<string name="password">Cyfrinair</string>
<string name="save">Cadw</string>
<string name="move">Symud</string>
<string name="saving">Yn cadw...</string>
<string name="saving">Saving…</string>
<string name="settings">Gosodiadau</string>
<string name="show">Dangos</string>
<string name="item_deleted">Eitem wedi\'i dileu</string>
@@ -104,13 +104,20 @@
<string name="immediately">ar unwaith</string>
<string name="vault_timeout_log_out_confirmation_title">Set session timeout to \"Log out\"?</string>
<string name="vault_timeout_log_out_confirmation_message">After the timeout period, you will be logged out. You will need to be connected to the internet to log in and access your vault again. Your settings and PIN saved on this device won\'t change.</string>
<string name="logging_in">Wrthi\'n mewngofnodi...</string>
<string name="logging_in">Logging in…</string>
<string name="login_to_bitwarden">Log in to Bitwarden</string>
<string name="master_password_confirmation_val_message">Password confirmation is not correct.</string>
<string name="master_password_description">The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it.</string>
<string name="master_password_hint">Awgrym o\'ch prif gyfrinair (dewisol)</string>
<string name="master_password_hint_description">Gall awgrym o\'ch prif gyfrinair eich helpu i\'w gofio os ydych chi\'n ei anghofio.</string>
<string name="master_password_length_val_message_x">Rhaid i\'ch prif gyfrinair gynnwys o leiaf %1$s nod.</string>
<plurals name="master_password_length_val_message_x">
<item quantity="zero">Master password must be at least %d characters long.</item>
<item quantity="one">Master password must be at least %d character long.</item>
<item quantity="two">Master password must be at least %d characters long.</item>
<item quantity="few">Master password must be at least %d characters long.</item>
<item quantity="many">Master password must be at least %d characters long.</item>
<item quantity="other">Master password must be at least %d characters long.</item>
</plurals>
<string name="min_numbers">Isafswm rhifau</string>
<string name="min_special">Isafswm nodau arbennig</string>
<string name="never">byth</string>
@@ -143,8 +150,8 @@
<string name="select">Dewis</string>
<string name="item_details">Item details</string>
<string name="item_updated">Eitem wedi\'i chadw</string>
<string name="submitting">Yn cyflwyno...</string>
<string name="syncing">Yn cysoni...</string>
<string name="submitting">Submitting…</string>
<string name="syncing">Syncing…</string>
<string name="syncing_complete">Cysoni wedi\'i gwblhau</string>
<string name="two_step_login">Mewngofnodi dau gam</string>
<string name="unlock_with_biometrics">Unlock with Biometrics</string>
@@ -163,7 +170,7 @@
<string name="search_for_a_login_or_add_a_new_login">Search for a login or add a new login</string>
<string name="disabled">Wedi diffodd</string>
<string name="bitwarden_autofill_service_alert2">The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the \"Settings\" screen.</string>
<string name="autofill">Llenwi\'n awtomatig</string>
<string name="autofill_title">Autofill</string>
<string name="autofill_or_view">Hoffech chi lenwi\'n awtomatig neu weld yr eitem hon?</string>
<string name="search">Chwilio</string>
<string name="learn_org">Dysgu am sefydliadau</string>
@@ -182,7 +189,7 @@
<string name="add_new_attachment">Ychwanegu atodiad newydd</string>
<string name="attachments">Atodiadau</string>
<string name="unable_to_download_file">Methu lawrlwytho\'r ffeil.</string>
<string name="downloading">Yn lawrlwytho...</string>
<string name="downloading">Downloading…</string>
<string name="attachment_large_warning">Mae\'r atodiad hwn yn %1$s. Ydych chi wir eisiau ei lawrlwytho i\'ch dyfais?</string>
<string name="authenticator_key">Authenticator key</string>
<string name="verification_code_totp">Verification code (TOTP)</string>
@@ -309,7 +316,14 @@ Scanning will happen automatically.</string>
<string name="personal_details">Personal Details</string>
<string name="contact_info">Contact Info</string>
<string name="check_password_for_data_breaches">Check password for data breaches</string>
<string name="password_exposed">Mae\'r cyfrinair hwn wedi cael ei ddatgelu %1$s o weithiau mewn achosion o ddatgelu data. Dylech chi ei newid.</string>
<plurals name="password_exposed">
<item quantity="zero">This password has been exposed %d times in data breaches. You should change it.</item>
<item quantity="one">This password has been exposed %d time in data breaches. You should change it.</item>
<item quantity="two">This password has been exposed %d times in data breaches. You should change it.</item>
<item quantity="few">This password has been exposed %d times in data breaches. You should change it.</item>
<item quantity="many">This password has been exposed %d times in data breaches. You should change it.</item>
<item quantity="other">This password has been exposed %d times in data breaches. You should change it.</item>
</plurals>
<string name="password_safe">Chafodd y cyfrinair hwn mo\'i ganfod mewn unrhyw achos hysbys o ddatgelu data. Dylai fod yn iawn i\'w ddefnyddio.</string>
<string name="identity_name">Identity name</string>
<string name="value">Gwerth</string>
@@ -393,10 +407,10 @@ Scanning will happen automatically.</string>
<string name="save_attachment_success">Cadwyd yr atodiad yn llwyddiannus</string>
<string name="autofill_tile_accessibility_required">Please turn on \"Autofill Accessibility Service\" from Bitwarden Settings to use the Autofill tile.</string>
<string name="autofill_tile_uri_not_found">No password fields detected</string>
<string name="soft_deleting">Yn anfon i\'r bin sbwriel...</string>
<string name="soft_deleting">Sending to trash…</string>
<string name="item_soft_deleted">Anfonwyd yr eitem i\'r bin sbwriel.</string>
<string name="restore">Adfer</string>
<string name="restoring">Yn adfer...</string>
<string name="restoring">Restoring…</string>
<string name="item_restored">Adferwyd yr eitem</string>
<string name="trash">Bin sbwriel</string>
<string name="do_you_really_want_to_permanently_delete_cipher">Ydych chi wir eisiau dileu\'r eitem hon? Allwch chi ddim dadwneud hyn.</string>
@@ -749,7 +763,14 @@ Do you want to switch to this account?</string>
<string name="bitwarden_cannot_reset_a_lost_or_forgotten_master_password">Bitwarden cannot reset a lost or forgotten master password.</string>
<string name="choose_your_master_password">Choose your master password</string>
<string name="choose_a_unique_and_strong_password_to_keep_your_information_safe">Choose a unique and strong password to keep your information safe.</string>
<string name="minimum_characters">%1$s characters</string>
<plurals name="minimum_characters">
<item quantity="zero">%d characters</item>
<item quantity="one">%d character</item>
<item quantity="two">%d characters</item>
<item quantity="few">%d characters</item>
<item quantity="many">%d characters</item>
<item quantity="other">%d characters</item>
</plurals>
<string name="expired_link">Expired link</string>
<string name="please_restart_registration_or_try_logging_in">Please restart registration or try logging in. You may already have an account.</string>
<string name="restart_registration">Restart registration</string>
@@ -802,7 +823,7 @@ Do you want to switch to this account?</string>
<string name="need_help_check_out_import_help">Need help? Check out <annotation link="importHelp">import help</annotation>.</string>
<string name="save_the_exported_file_somewhere_on_your_computer_you_can_find_easily"><annotation emphasis="bold">Save the exported file</annotation> somewhere on your computer you can find easily.</string>
<string name="this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server">This is not a recognized Bitwarden server. You may need to check with your provider or update your server.</string>
<string name="syncing_logins_loading_message">Syncing logins...</string>
<string name="syncing_logins_loading_message">Syncing logins…</string>
<string name="download_the_browser_extension">Download the browser extension</string>
<string name="go_to_bitwarden_com_download_to_integrate_bitwarden_into_browser">Go to bitwarden.com/download to integrate Bitwarden into your favorite browser for a seamless experience.</string>
<string name="use_the_web_app">Use the web app</string>
@@ -911,7 +932,7 @@ Do you want to switch to this account?</string>
<string name="no_folder">No folder</string>
<string name="show_less">Show less</string>
<string name="add_field">Add field</string>
<string name="x_ellipses">%s...</string>
<string name="x_ellipses">%s…</string>
<string name="share_error_details">Share error details</string>
<string name="flight_recorder">Flight recorder</string>
<string name="flight_recorder_help">Flight recorder help</string>
+23 -14
View File
@@ -12,7 +12,7 @@
<string name="copy_password">Kopiér adgangskode</string>
<string name="copy_username">Kopiér brugernavn</string>
<string name="delete">Slet</string>
<string name="deleting">Sletter...</string>
<string name="deleting">Deleting…</string>
<string name="do_you_really_want_to_delete">Slet fortsat, sikker? Dette kan ikke fortrydes.</string>
<string name="edit">Redigér</string>
<string name="edit_folder">Redigér mappe</string>
@@ -55,7 +55,7 @@
<string name="password">Adgangskode</string>
<string name="save">Gem</string>
<string name="move">Flyt</string>
<string name="saving">Gemmer...</string>
<string name="saving">Saving…</string>
<string name="settings">Indstillinger</string>
<string name="show">Vis</string>
<string name="item_deleted">Emne slettet</string>
@@ -104,13 +104,16 @@
<string name="immediately">Straks</string>
<string name="vault_timeout_log_out_confirmation_title">Set session timeout to \"Log out\"?</string>
<string name="vault_timeout_log_out_confirmation_message">After the timeout period, you will be logged out. You will need to be connected to the internet to log in and access your vault again. Your settings and PIN saved on this device won\'t change.</string>
<string name="logging_in">Logger ind...</string>
<string name="logging_in">Logging in…</string>
<string name="login_to_bitwarden">Log ind på Bitwarden</string>
<string name="master_password_confirmation_val_message">Adgangskodebekræftelse er forkert.</string>
<string name="master_password_description">Hovedadgangskoden er den adgangskode, man benytter for at tilgå sin boks. Det er meget vigtigt, at man ikke glemmer sin hovedadgangskode, da der ikke er nogen måde, hvorpå koden kan genoprettes, dersom den glemmes.</string>
<string name="master_password_hint">Hovedadgangskodetip (valgfrit)</string>
<string name="master_password_hint_description">Et hovedeadgangskodentip kan være en hjælpe til at huske adgangskoden, hvis den glemmes.</string>
<string name="master_password_length_val_message_x">Hovedadgangskoden skal udgøre mindst %1$s tegn.</string>
<plurals name="master_password_length_val_message_x">
<item quantity="one">Master password must be at least %d character long.</item>
<item quantity="other">Master password must be at least %d characters long.</item>
</plurals>
<string name="min_numbers">Minnimumsantal cifre</string>
<string name="min_special">Minnimumsantal specialtegn</string>
<string name="never">Aldrig</string>
@@ -143,8 +146,8 @@
<string name="select">Vælg</string>
<string name="item_details">Item details</string>
<string name="item_updated">Emne gemt</string>
<string name="submitting">Indsender...</string>
<string name="syncing">Synker...</string>
<string name="submitting">Submitting…</string>
<string name="syncing">Syncing…</string>
<string name="syncing_complete">Synkning fuldført</string>
<string name="two_step_login">Totrins-login</string>
<string name="unlock_with_biometrics">Unlock with Biometrics</string>
@@ -163,7 +166,7 @@
<string name="search_for_a_login_or_add_a_new_login">Søg efter eller tilføj et nyt login</string>
<string name="disabled">Deaktiveret</string>
<string name="bitwarden_autofill_service_alert2">Den letteste måde at føje nye logins til boksen er fra Bitwarden Autoudfyldningstjeneste. Læs mere om brugen af Bitwarden Autoudfyldningstjeneste ved at gå til skærmen \"Indstillinger\".</string>
<string name="autofill">Autoudfyld</string>
<string name="autofill_title">Autofill</string>
<string name="autofill_or_view">Skal dette emne autoudfyldes eller vises?</string>
<string name="search">Søg</string>
<string name="learn_org">Læs om organisationer</string>
@@ -182,7 +185,7 @@
<string name="add_new_attachment">Tilføj ny vedhæftning</string>
<string name="attachments">Vedhæftninger</string>
<string name="unable_to_download_file">Kunne ikke downloade fil.</string>
<string name="downloading">Downloader...</string>
<string name="downloading">Downloading…</string>
<string name="attachment_large_warning">Størrelsen på denne vedhæftning er %1$s. Sikker på, at den skal downloades på enheden?</string>
<string name="authenticator_key">Godkendelsesnøgle (TOTP)</string>
<string name="verification_code_totp">Bekræftelseskode (TOTP)</string>
@@ -309,7 +312,10 @@ Skanning vil ske automatisk.</string>
<string name="personal_details">Personal Details</string>
<string name="contact_info">Contact Info</string>
<string name="check_password_for_data_breaches">Check password for data breaches</string>
<string name="password_exposed">Denne adgangskode er blevet afsløret %1$s gang(e) i datalæk, hvorfor den straks bør skiftes.</string>
<plurals name="password_exposed">
<item quantity="one">This password has been exposed %d time in data breaches. You should change it.</item>
<item quantity="other">This password has been exposed %d times in data breaches. You should change it.</item>
</plurals>
<string name="password_safe">Denne adgangskode er ikke fundet i nogen kendte datalæk. Den burde være sikker at bruge.</string>
<string name="identity_name">Identitetsnavn</string>
<string name="value">Værdi</string>
@@ -393,10 +399,10 @@ Skanning vil ske automatisk.</string>
<string name="save_attachment_success">Vedhæftning gemt</string>
<string name="autofill_tile_accessibility_required">Aktivér \"Autoudfyld-tilgængelighedstjeneste\" fra Bitwarden-indstillinger for at benytte flisen Autoudfyld.</string>
<string name="autofill_tile_uri_not_found">Ingen adgangskodefelter fundet</string>
<string name="soft_deleting">Sender til papirkurven...</string>
<string name="soft_deleting">Sending to trash…</string>
<string name="item_soft_deleted">Emne er sendt til papirkurven.</string>
<string name="restore">Gendan</string>
<string name="restoring">Gendanner...</string>
<string name="restoring">Restoring…</string>
<string name="item_restored">Emne gendannet</string>
<string name="trash">Papirkurv</string>
<string name="do_you_really_want_to_permanently_delete_cipher">Sikker på, at der skal slettes permanent? Dette kan ikke fortrydes.</string>
@@ -749,7 +755,10 @@ Skift til denne konto?</string>
<string name="bitwarden_cannot_reset_a_lost_or_forgotten_master_password">Bitwarden cannot reset a lost or forgotten master password.</string>
<string name="choose_your_master_password">Vælg hovedadgangskode</string>
<string name="choose_a_unique_and_strong_password_to_keep_your_information_safe">Vælg en unik og stærk adgangskode for at holde brugeroplysningerne sikre.</string>
<string name="minimum_characters">%1$s tegn</string>
<plurals name="minimum_characters">
<item quantity="one">%d character</item>
<item quantity="other">%d characters</item>
</plurals>
<string name="expired_link">Udløbet link</string>
<string name="please_restart_registration_or_try_logging_in">Genstart registreringen eller prøv at logge ind. En konto findes muligvis allerede.</string>
<string name="restart_registration">Genstart registrering</string>
@@ -802,7 +811,7 @@ Skift til denne konto?</string>
<string name="need_help_check_out_import_help">Behov for hjælp? Tjek import-hjælp ud.</string>
<string name="save_the_exported_file_somewhere_on_your_computer_you_can_find_easily">Gem den eksporterede fil et sted på computeren, hvor man nemt kan finde den.</string>
<string name="this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server">Dette er ikke en genkendt Bitwarden-server. Man skal muligvis tjekke med sin udbyder eller opdatere sin server.</string>
<string name="syncing_logins_loading_message">Synker logins...</string>
<string name="syncing_logins_loading_message">Syncing logins…</string>
<string name="download_the_browser_extension">Download webbrowserudvidelsen</string>
<string name="go_to_bitwarden_com_download_to_integrate_bitwarden_into_browser">Gå til bitwarden.com/download for at integrere Bitwarden i den foretrukne webbrowser for en problemfri oplevelse.</string>
<string name="use_the_web_app">Brug web-appen</string>
@@ -911,7 +920,7 @@ Skift til denne konto?</string>
<string name="no_folder">No folder</string>
<string name="show_less">Show less</string>
<string name="add_field">Add field</string>
<string name="x_ellipses">%s...</string>
<string name="x_ellipses">%s…</string>
<string name="share_error_details">Share error details</string>
<string name="flight_recorder">Flight recorder</string>
<string name="flight_recorder_help">Flight recorder help</string>
+25 -16
View File
@@ -12,7 +12,7 @@
<string name="copy_password">Passwort kopieren</string>
<string name="copy_username">Benutzername kopieren</string>
<string name="delete">Löschen</string>
<string name="deleting">Lösche...</string>
<string name="deleting">Deleting…</string>
<string name="do_you_really_want_to_delete">Wirklich löschen? Dieser Vorgang kann nicht rückgängig gemacht werden.</string>
<string name="edit">Bearbeiten</string>
<string name="edit_folder">Ordner bearbeiten</string>
@@ -55,7 +55,7 @@
<string name="password">Passwort</string>
<string name="save">Speichern</string>
<string name="move">Verschieben</string>
<string name="saving">Wird gespeichert...</string>
<string name="saving">Saving…</string>
<string name="settings">Einstellungen</string>
<string name="show">Anzeigen</string>
<string name="item_deleted">Eintrag gelöscht</string>
@@ -104,13 +104,16 @@
<string name="immediately">Sofort</string>
<string name="vault_timeout_log_out_confirmation_title">Sitzungs-Timeout auf \"Abmelden\" setzen?</string>
<string name="vault_timeout_log_out_confirmation_message">Nach dem Timeout wirst du abgemeldet. Du musst mit dem Internet verbunden sein, um dich anzumelden und erneut auf deinen Tresor zuzugreifen. Deine gespeicherten Einstellungen und PIN auf diesem Gerät werden nicht geändert.</string>
<string name="logging_in">Anmeldung läuft...</string>
<string name="logging_in">Logging in…</string>
<string name="login_to_bitwarden">Bei Bitwarden anmelden</string>
<string name="master_password_confirmation_val_message">Passwortbestätigung ist nicht korrekt.</string>
<string name="master_password_description">Das Master-Passwort wird verwendet, um den Tresor zu öffnen. Es ist sehr wichtig, dass du das Passwort nicht vergisst, da es keine Möglichkeit gibt es zurückzusetzen.</string>
<string name="master_password_hint">Master-Passwort-Hinweis (optional)</string>
<string name="master_password_hint_description">Ein Hinweis auf dein Master-Passwort kann dir helfen, dich an das Passwort zu erinnern, solltest du es vergessen.</string>
<string name="master_password_length_val_message_x">Das Master-Passwort muss mindestens %1$s Zeichen lang sein.</string>
<plurals name="master_password_length_val_message_x">
<item quantity="one">Master password must be at least %d character long.</item>
<item quantity="other">Master password must be at least %d characters long.</item>
</plurals>
<string name="min_numbers">Mindestanzahl Ziffern</string>
<string name="min_special">Mindestanzahl Sonderzeichen</string>
<string name="never">Niemals</string>
@@ -143,8 +146,8 @@
<string name="select">Auswählen</string>
<string name="item_details">Eintrag-Details</string>
<string name="item_updated">Eintrag gespeichert</string>
<string name="submitting">Wird übermittelt...</string>
<string name="syncing">Wird synchronisiert...</string>
<string name="submitting">Submitting…</string>
<string name="syncing">Syncing…</string>
<string name="syncing_complete">Synchronisierung abgeschlossen</string>
<string name="two_step_login">Zwei-Faktor-Authentifizierung</string>
<string name="unlock_with_biometrics">Mit Biometrie entsperren</string>
@@ -163,7 +166,7 @@
<string name="search_for_a_login_or_add_a_new_login">Nach Zugangsdaten suchen oder neue Zugangsdaten hinzufügen</string>
<string name="disabled">Deaktiviert</string>
<string name="bitwarden_autofill_service_alert2">Die einfachste Möglichkeit, neue Zugangsdaten zu deinem Tresor hinzuzufügen, ist der Bitwarden Auto-Ausfüllen Dienst. Erfahre mehr über den Bitwarden Auto-Ausfüllen Dienst, indem du zu \"Einstellungen\" wechselst.</string>
<string name="autofill">Automatisches Ausfüllen</string>
<string name="autofill_title">Autofill</string>
<string name="autofill_or_view">Möchtest du diese Zugangsdaten automatisch ausfüllen oder ansehen?</string>
<string name="search">Durchsuchen</string>
<string name="learn_org">Mehr über Organisationen erfahren</string>
@@ -182,7 +185,7 @@
<string name="add_new_attachment">Neuen Anhang hinzufügen</string>
<string name="attachments">Anhänge</string>
<string name="unable_to_download_file">Datei kann nicht heruntergeladen werden.</string>
<string name="downloading">Wird heruntergeladen...</string>
<string name="downloading">Downloading…</string>
<string name="attachment_large_warning">Dieser Anhang ist %1$s groß. Bist du sicher, dass du ihn herunterladen möchtest?</string>
<string name="authenticator_key">Authentifizierungsschlüssel (TOTP)</string>
<string name="verification_code_totp">Verifizierungscode (TOTP)</string>
@@ -309,7 +312,10 @@ Das Scannen erfolgt automatisch.</string>
<string name="personal_details">Persönliche Details</string>
<string name="contact_info">Kontaktinformationen</string>
<string name="check_password_for_data_breaches">Passwort auf Datendiebstahl überprüfen</string>
<string name="password_exposed">Dieses Passwort wurde %1$s-mal in Passwortdiebstahl Datenbanken gefunden. Sie sollten es ändern.</string>
<plurals name="password_exposed">
<item quantity="one">This password has been exposed %d time in data breaches. You should change it.</item>
<item quantity="other">This password has been exposed %d times in data breaches. You should change it.</item>
</plurals>
<string name="password_safe">Dieses Passwort wurde in keiner bekannten Passwortdiebstahl Datenbank gefunden. Es sollte sicher zu verwenden sein.</string>
<string name="identity_name">Identitätsname</string>
<string name="value">Wert</string>
@@ -393,10 +399,10 @@ Das Scannen erfolgt automatisch.</string>
<string name="save_attachment_success">Anhang erfolgreich gespeichert</string>
<string name="autofill_tile_accessibility_required">Bitte aktiviere \"Bedienungshilfen zum automatischen Ausfüllen\" in den Bitwarden-Einstellungen, um die Auto-Ausfüllen-Kachel zu verwenden.</string>
<string name="autofill_tile_uri_not_found">Keine Passwortfelder erkannt</string>
<string name="soft_deleting">Wird in den Papierkorb verschoben…</string>
<string name="soft_deleting">Sending to trash…</string>
<string name="item_soft_deleted">Eintrag wurde in den Papierkorb gelegt.</string>
<string name="restore">Wiederherstellen</string>
<string name="restoring">Wiederherstellen ...</string>
<string name="restoring">Restoring…</string>
<string name="item_restored">Eintrag wiederhergestellt</string>
<string name="trash">Papierkorb</string>
<string name="do_you_really_want_to_permanently_delete_cipher">Möchtest du wirklich dauerhaft löschen? Dies kann nicht rückgängig gemacht werden.</string>
@@ -748,7 +754,10 @@ Möchtest du zu diesem Konto wechseln?</string>
<string name="bitwarden_cannot_reset_a_lost_or_forgotten_master_password">Bitwarden kann kein verlorenes oder vergessenes Master-Passwort zurücksetzen.</string>
<string name="choose_your_master_password">Wähle dein Master-Passwort</string>
<string name="choose_a_unique_and_strong_password_to_keep_your_information_safe">Wähle ein einzigartiges und starkes Passwort, damit deine Informationen sicher sind.</string>
<string name="minimum_characters">%1$s Zeichen</string>
<plurals name="minimum_characters">
<item quantity="one">%d character</item>
<item quantity="other">%d characters</item>
</plurals>
<string name="expired_link">Abgelaufener Link</string>
<string name="please_restart_registration_or_try_logging_in">Bitte starte die Registrierung neu oder versuche dich anzumelden. Möglicherweise hast du bereits ein Konto.</string>
<string name="restart_registration">Registrierung neu starten</string>
@@ -801,7 +810,7 @@ Möchtest du zu diesem Konto wechseln?</string>
<string name="need_help_check_out_import_help">Brauchst du Hilfe? Schau dir die Importhilfe an.</string>
<string name="save_the_exported_file_somewhere_on_your_computer_you_can_find_easily">Speichere die exportierte Datei irgendwo auf deinem Computer, so dass du sie leicht wiederfinden kannst.</string>
<string name="this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server">Dies ist kein anerkannter Bitwarden-Server. Möglicherweise musst du dich bei deinem Anbieter erkundigen oder deinen Server aktualisieren.</string>
<string name="syncing_logins_loading_message">Synchronisiere Zugangsdaten...</string>
<string name="syncing_logins_loading_message">Syncing logins…</string>
<string name="download_the_browser_extension">Die Browser-Erweiterung herunterladen</string>
<string name="go_to_bitwarden_com_download_to_integrate_bitwarden_into_browser">Gehe zu bitwarden.com/download, um Bitwarden für eine nahtlose Benutzererfahrung in deinen bevorzugten Browser zu integrieren.</string>
<string name="use_the_web_app">Verwende die Web-App</string>
@@ -910,7 +919,7 @@ Möchtest du zu diesem Konto wechseln?</string>
<string name="no_folder">Kein Ordner</string>
<string name="show_less">Weniger anzeigen</string>
<string name="add_field">Feld hinzufügen</string>
<string name="x_ellipses">%s...</string>
<string name="x_ellipses">%s…</string>
<string name="share_error_details">Fehlerdetails teilen</string>
<string name="flight_recorder">Flugschreiber</string>
<string name="flight_recorder_help">Flugschreiber-Hilfe</string>
@@ -1067,8 +1076,8 @@ Möchtest du zu diesem Konto wechseln?</string>
<string name="local_items_are_collapsed_click_to_expand">Lokale Einträge sind eingeklappt, klicke zum Ausklappen.</string>
<string name="items_expanded_click_to_collapse">Einträge sind ausgeklappt, klicke zum Einklappen.</string>
<string name="items_are_collapsed_click_to_expand">Einträge sind eingeklappt, klicke zum Ausklappen.</string>
<string name="error_cannot_decrypt">[error: cannot decrypt]</string>
<string name="copy_error_report">Copy error report</string>
<string name="error_cannot_decrypt">[Fehler: kann nicht entschlüsseln]</string>
<string name="copy_error_report">Fehlerbericht kopieren</string>
<string name="bitwarden_could_not_decrypt_this_vault_item_description_long">Bitwarden could not decrypt this vault item. Copy and share this error report with customer success to avoid additional data loss.</string>
<plurals name="bitwarden_could_not_decrypt_x_vault_item_copy_and_share_description_long">
<item quantity="one">Bitwarden could not decrypt %1$d vault item. Copy and share this error report with customer success to avoid additional data loss.</item>
+23 -14
View File
@@ -12,7 +12,7 @@
<string name="copy_password">Αντιγραφή κωδικού</string>
<string name="copy_username">Αντιγραφή ονόματος χρήστη</string>
<string name="delete">Διαγραφή</string>
<string name="deleting">Διαγραφή...</string>
<string name="deleting">Deleting…</string>
<string name="do_you_really_want_to_delete">Είστε σίγουροι για τη διαγραφή; Αυτό δεν μπορεί να αναιρεθεί.</string>
<string name="edit">Επεξεργασία</string>
<string name="edit_folder">Επεξεργασία φακέλου</string>
@@ -55,7 +55,7 @@
<string name="password">Κωδικός</string>
<string name="save">Αποθήκευση</string>
<string name="move">Μετακίνηση</string>
<string name="saving">Αποθήκευση...</string>
<string name="saving">Saving…</string>
<string name="settings">Ρυθμίσεις</string>
<string name="show">Εμφάνιση</string>
<string name="item_deleted">Το στοιχείο διαγράφτηκε</string>
@@ -104,13 +104,16 @@
<string name="immediately">Άμεσα</string>
<string name="vault_timeout_log_out_confirmation_title">Set session timeout to \"Log out\"?</string>
<string name="vault_timeout_log_out_confirmation_message">After the timeout period, you will be logged out. You will need to be connected to the internet to log in and access your vault again. Your settings and PIN saved on this device won\'t change.</string>
<string name="logging_in">Σύνδεση...</string>
<string name="logging_in">Logging in…</string>
<string name="login_to_bitwarden">Σύνδεση στο Bitwarden</string>
<string name="master_password_confirmation_val_message">Η επιβεβαίωση του κύριου κωδικού δεν είναι σωστή.</string>
<string name="master_password_description">Ο κύριος κωδικός χρησιμοποιείται για πρόσβαση στη κρύπτη σας. Είναι πολύ σημαντικό να μην τον ξεχάσετε. Δεν υπάρχει τρόπος να τον ανακτήσετε σε αυτή την περίπτωση.</string>
<string name="master_password_hint">Υπόδειξη κύριου κωδικού (προαιρετικό)</string>
<string name="master_password_hint_description">Η υπόδειξη κύριου κωδικού μπορεί να σας βοηθήσει να θυμηθείτε τον κωδικό σας αν τον ξεχάσετε.</string>
<string name="master_password_length_val_message_x">Ο κύριος κωδικός πρέπει να έχει μήκος τουλάχιστον %1$s χαρακτήρες.</string>
<plurals name="master_password_length_val_message_x">
<item quantity="one">Master password must be at least %d character long.</item>
<item quantity="other">Master password must be at least %d characters long.</item>
</plurals>
<string name="min_numbers">Ελάχιστα αριθμητικά ψηφία</string>
<string name="min_special">Ελάχιστοι ειδικοί χαρακτήρες</string>
<string name="never">Ποτέ</string>
@@ -143,8 +146,8 @@
<string name="select">Επιλογή</string>
<string name="item_details">Item details</string>
<string name="item_updated">Το στοιχείο αποθηκεύτηκε</string>
<string name="submitting">Υποβολή...</string>
<string name="syncing">Συγχρονισμός...</string>
<string name="submitting">Submitting…</string>
<string name="syncing">Syncing…</string>
<string name="syncing_complete">Ο συγχρονισμός ολοκληρώθηκε</string>
<string name="two_step_login">Σύνδεση δύο βημάτων</string>
<string name="unlock_with_biometrics">Unlock with Biometrics</string>
@@ -163,7 +166,7 @@
<string name="search_for_a_login_or_add_a_new_login">Αναζητήστε μια σύνδεση ή προσθέστε μια νέα σύνδεση</string>
<string name="disabled">Απενεργοποιημένο</string>
<string name="bitwarden_autofill_service_alert2">Ο ευκολότερος τρόπος για να προσθέσετε νέες συνδέσεις στο vault σας, είναι με την υπηρεσία αυτόματης συμπλήρωσης του Bitwarden. Μάθετε περισσότερα σχετικά με τη χρήση της, μεταβαίνοντας στις \"Ρυθμίσεις\".</string>
<string name="autofill">Αυτόματη συμπλήρωση</string>
<string name="autofill_title">Autofill</string>
<string name="autofill_or_view">Θέλετε αυτόματη συμπλήρωση ή να δείτε αυτό το στοιχείο;</string>
<string name="search">Αναζήτηση</string>
<string name="learn_org">Μάθετε για τους οργανισμούς</string>
@@ -182,7 +185,7 @@
<string name="add_new_attachment">Προσθήκη συνημμένου</string>
<string name="attachments">Συνημμένα</string>
<string name="unable_to_download_file">Αδυναμία λήψης αρχείου.</string>
<string name="downloading">Λήψη...</string>
<string name="downloading">Downloading…</string>
<string name="attachment_large_warning">Αυτό το συνημμένο έχει μέγεθος %1$s. Είστε βέβαιοι ότι θέλετε να το κατεβάσετε στη συσκευή σας;</string>
<string name="authenticator_key">Κλειδί αυθεντικοποίησης (TOTP)</string>
<string name="verification_code_totp">Κωδικός επαλήθευσης (TOTP)</string>
@@ -309,7 +312,10 @@
<string name="personal_details">Προσωπικά στοιχεία</string>
<string name="contact_info">Στοιχεία επικοινωνίας</string>
<string name="check_password_for_data_breaches">Check password for data breaches</string>
<string name="password_exposed">Ο κωδικός αυτός έχει εκτεθεί %1$s φορά (ες) σε διαρροές δεδομένων. Πρέπει να τον αλλάξετε.</string>
<plurals name="password_exposed">
<item quantity="one">This password has been exposed %d time in data breaches. You should change it.</item>
<item quantity="other">This password has been exposed %d times in data breaches. You should change it.</item>
</plurals>
<string name="password_safe">Ο κωδικός αυτός δεν βρέθηκε σε γνωστές διαρροές δεδομένων. Είναι ασφαλής για χρήση.</string>
<string name="identity_name">Όνομα ταυτότητας</string>
<string name="value">Τιμή</string>
@@ -393,10 +399,10 @@
<string name="save_attachment_success">Το συνημμένο αποθηκεύτηκε με επιτυχία</string>
<string name="autofill_tile_accessibility_required">Ενεργοποιήστε την \"Υπηρεσία αυτόματης συμπλήρωσης προσβασιμότητας\" από τις ρυθμίσεις Bitwarden για να χρησιμοποιήσετε το εικονίδιο αυτόματης συμπλήρωσης.</string>
<string name="autofill_tile_uri_not_found">Δεν εντοπίστηκαν πεδία κωδικού πρόσβασης</string>
<string name="soft_deleting">Αποστολή στον κάδο απορριμμάτων ...</string>
<string name="soft_deleting">Sending to trash…</string>
<string name="item_soft_deleted">Το στοιχείο έχει σταλεί στον κάδο απορριμμάτων.</string>
<string name="restore">Ανάκτηση</string>
<string name="restoring">Γίνεται επαναφορά...</string>
<string name="restoring">Restoring…</string>
<string name="item_restored">Το στοιχείο έχει ανακτηθεί.</string>
<string name="trash">Κάδος</string>
<string name="do_you_really_want_to_permanently_delete_cipher">Θέλετε πραγματικά να διαγράψετε οριστικά; Αυτό δεν μπορεί να αναιρεθεί.</string>
@@ -749,7 +755,10 @@
<string name="bitwarden_cannot_reset_a_lost_or_forgotten_master_password">Bitwarden cannot reset a lost or forgotten master password.</string>
<string name="choose_your_master_password">Επιλέξτε τον κύριο κωδικό πρόσβασης σας</string>
<string name="choose_a_unique_and_strong_password_to_keep_your_information_safe">Επιλέξτε έναν μοναδικό και ισχυρό κωδικό πρόσβασης για να διατηρήσετε τις πληροφορίες σας ασφαλείς.</string>
<string name="minimum_characters">%1$s χαρακτήρες</string>
<plurals name="minimum_characters">
<item quantity="one">%d character</item>
<item quantity="other">%d characters</item>
</plurals>
<string name="expired_link">Ληγμένος σύνδεσμος</string>
<string name="please_restart_registration_or_try_logging_in">Επανεκκινήστε την εγγραφή ή δοκιμάστε να συνδεθείτε. Μπορεί να διαθέτετε ήδη λογαριασμό.</string>
<string name="restart_registration">Επανεκκίνηση εγγραφής</string>
@@ -802,7 +811,7 @@
<string name="need_help_check_out_import_help">Χρειάζεστε βοήθεια; Ρίξτε μια ματιά στο <annotation link="importHelp">βοήθεια για εισαγωγή</annotation>.</string>
<string name="save_the_exported_file_somewhere_on_your_computer_you_can_find_easily"><annotation emphasis="bold">Αποθηκεύστε το εξαγόμενο αρχείο</annotation> κάπου στον υπολογιστή σας όπου μπορείτε να το βρείτε εύκολα.</string>
<string name="this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server">Αυτός δεν είναι αναγνωρισμένος διακομιστής Bitwarden. Μπορεί να χρειαστεί να ελέγξετε με τον πάροχο σας ή να ενημερώσετε τον διακομιστή σας.</string>
<string name="syncing_logins_loading_message">Συγχρονισμός συνδέσεων...</string>
<string name="syncing_logins_loading_message">Syncing logins…</string>
<string name="download_the_browser_extension">Κατεβάστε την επέκταση περιηγητή</string>
<string name="go_to_bitwarden_com_download_to_integrate_bitwarden_into_browser">Πηγαίνετε στο bitwarden.com/download για να ενσωματώσετε το Bitwarden στο αγαπημένο σας πρόγραμμα περιήγησης για μια απρόσκοπτη εμπειρία.</string>
<string name="use_the_web_app">Χρήση της εφαρμογής web</string>
@@ -911,7 +920,7 @@
<string name="no_folder">Χωρίς φάκελο</string>
<string name="show_less">Εμφάνιση λιγότερων</string>
<string name="add_field">Προσθήκη πεδίου</string>
<string name="x_ellipses">%s...</string>
<string name="x_ellipses">%s…</string>
<string name="share_error_details">Share error details</string>
<string name="flight_recorder">Flight recorder</string>
<string name="flight_recorder_help">Flight recorder help</string>
+23 -14
View File
@@ -12,7 +12,7 @@
<string name="copy_password">Copy password</string>
<string name="copy_username">Copy username</string>
<string name="delete">Delete</string>
<string name="deleting">Deleting...</string>
<string name="deleting">Deleting…</string>
<string name="do_you_really_want_to_delete">Do you really want to delete? This cannot be undone.</string>
<string name="edit">Edit</string>
<string name="edit_folder">Edit folder</string>
@@ -55,7 +55,7 @@
<string name="password">Password</string>
<string name="save">Save</string>
<string name="move">Move</string>
<string name="saving">Saving...</string>
<string name="saving">Saving…</string>
<string name="settings">Settings</string>
<string name="show">Show</string>
<string name="item_deleted">Item deleted</string>
@@ -104,13 +104,16 @@
<string name="immediately">Immediately</string>
<string name="vault_timeout_log_out_confirmation_title">Set session timeout to \"Log out\"?</string>
<string name="vault_timeout_log_out_confirmation_message">After the timeout period, you will be logged out. You will need to be connected to the internet to log in and access your vault again. Your settings and PIN saved on this device won\'t change.</string>
<string name="logging_in">Logging in...</string>
<string name="logging_in">Logging in…</string>
<string name="login_to_bitwarden">Log in to Bitwarden</string>
<string name="master_password_confirmation_val_message">Password confirmation is not correct.</string>
<string name="master_password_description">The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it.</string>
<string name="master_password_hint">Master password hint (optional)</string>
<string name="master_password_hint_description">A master password hint can help you remember your password if you forget it.</string>
<string name="master_password_length_val_message_x">Master password must be at least %1$s characters long.</string>
<plurals name="master_password_length_val_message_x">
<item quantity="one">Master password must be at least %d character long.</item>
<item quantity="other">Master password must be at least %d characters long.</item>
</plurals>
<string name="min_numbers">Minimum numbers</string>
<string name="min_special">Minimum special</string>
<string name="never">Never</string>
@@ -143,8 +146,8 @@
<string name="select">Select</string>
<string name="item_details">Item details</string>
<string name="item_updated">Item saved</string>
<string name="submitting">Submitting...</string>
<string name="syncing">Syncing...</string>
<string name="submitting">Submitting…</string>
<string name="syncing">Syncing…</string>
<string name="syncing_complete">Syncing complete</string>
<string name="two_step_login">Two-step login</string>
<string name="unlock_with_biometrics">Unlock with Biometrics</string>
@@ -163,7 +166,7 @@
<string name="search_for_a_login_or_add_a_new_login">Search for a login or add a new login</string>
<string name="disabled">Disabled</string>
<string name="bitwarden_autofill_service_alert2">The easiest way to add new logins to your vault is from the Bitwarden Auto-fill Service. Learn more about using the Bitwarden Auto-fill Service by navigating to the \"Settings\" screen.</string>
<string name="autofill">Auto-fill</string>
<string name="autofill_title">Autofill</string>
<string name="autofill_or_view">Do you want to auto-fill or view this item?</string>
<string name="search">Search</string>
<string name="learn_org">Learn about organisations</string>
@@ -182,7 +185,7 @@
<string name="add_new_attachment">Add new attachment</string>
<string name="attachments">Attachments</string>
<string name="unable_to_download_file">Unable to download file.</string>
<string name="downloading">Downloading...</string>
<string name="downloading">Downloading…</string>
<string name="attachment_large_warning">This attachment is %1$s in size. Are you sure you want to download it onto your device?</string>
<string name="authenticator_key">Authenticator key (TOTP)</string>
<string name="verification_code_totp">Verification code (TOTP)</string>
@@ -309,7 +312,10 @@ Scanning will happen automatically.</string>
<string name="personal_details">Personal Details</string>
<string name="contact_info">Contact Info</string>
<string name="check_password_for_data_breaches">Check password for data breaches</string>
<string name="password_exposed">This password has been exposed %1$s time(s) in data breaches. You should change it.</string>
<plurals name="password_exposed">
<item quantity="one">This password has been exposed %d time in data breaches. You should change it.</item>
<item quantity="other">This password has been exposed %d times in data breaches. You should change it.</item>
</plurals>
<string name="password_safe">This password was not found in any known data breaches. It should be safe to use.</string>
<string name="identity_name">Identity name</string>
<string name="value">Value</string>
@@ -393,10 +399,10 @@ Scanning will happen automatically.</string>
<string name="save_attachment_success">Attachment saved successfully</string>
<string name="autofill_tile_accessibility_required">Please turn on \"Auto-fill Accessibility Service\" from Bitwarden Settings to use the Auto-fill tile.</string>
<string name="autofill_tile_uri_not_found">No password fields detected</string>
<string name="soft_deleting">Sending to bin...</string>
<string name="soft_deleting">Sending to bin…</string>
<string name="item_soft_deleted">Item has been sent to bin.</string>
<string name="restore">Restore</string>
<string name="restoring">Restoring...</string>
<string name="restoring">Restoring…</string>
<string name="item_restored">Item restored</string>
<string name="trash">Bin</string>
<string name="do_you_really_want_to_permanently_delete_cipher">Do you really want to permanently delete? This cannot be undone.</string>
@@ -749,7 +755,10 @@ Do you want to switch to this account?</string>
<string name="bitwarden_cannot_reset_a_lost_or_forgotten_master_password">Bitwarden cannot reset a lost or forgotten master password.</string>
<string name="choose_your_master_password">Choose your master password</string>
<string name="choose_a_unique_and_strong_password_to_keep_your_information_safe">Choose a unique and strong password to keep your information safe.</string>
<string name="minimum_characters">%1$s characters</string>
<plurals name="minimum_characters">
<item quantity="one">%d character</item>
<item quantity="other">%d characters</item>
</plurals>
<string name="expired_link">Expired link</string>
<string name="please_restart_registration_or_try_logging_in">Please restart registration or try logging in. You may already have an account.</string>
<string name="restart_registration">Restart registration</string>
@@ -802,7 +811,7 @@ Do you want to switch to this account?</string>
<string name="need_help_check_out_import_help">Need help? Check out import help.</string>
<string name="save_the_exported_file_somewhere_on_your_computer_you_can_find_easily">Save the exported file somewhere on your computer you can find easily.</string>
<string name="this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server">This is not a recognised Bitwarden server. You may need to check with your provider or update your server.</string>
<string name="syncing_logins_loading_message">Syncing logins...</string>
<string name="syncing_logins_loading_message">Syncing logins…</string>
<string name="download_the_browser_extension">Download the browser extension</string>
<string name="go_to_bitwarden_com_download_to_integrate_bitwarden_into_browser">Go to bitwarden.com/download to integrate Bitwarden into your favourite browser for a seamless experience.</string>
<string name="use_the_web_app">Use the web app</string>
@@ -911,7 +920,7 @@ Do you want to switch to this account?</string>
<string name="no_folder">No folder</string>
<string name="show_less">Show less</string>
<string name="add_field">Add field</string>
<string name="x_ellipses">%s...</string>
<string name="x_ellipses">%s…</string>
<string name="share_error_details">Share error details</string>
<string name="flight_recorder">Flight recorder</string>
<string name="flight_recorder_help">Flight recorder help</string>
+22 -13
View File
@@ -12,7 +12,7 @@
<string name="copy_password">Copy password</string>
<string name="copy_username">Copy username</string>
<string name="delete">Delete</string>
<string name="deleting">Deleting...</string>
<string name="deleting">Deleting…</string>
<string name="do_you_really_want_to_delete">Do you really want to delete? This cannot be undone.</string>
<string name="edit">Edit</string>
<string name="edit_folder">Edit folder</string>
@@ -55,7 +55,7 @@
<string name="password">Password</string>
<string name="save">Save</string>
<string name="move">Move</string>
<string name="saving">Saving...</string>
<string name="saving">Saving…</string>
<string name="settings">Settings</string>
<string name="show">Show</string>
<string name="item_deleted">Item has been deleted.</string>
@@ -104,13 +104,16 @@
<string name="immediately">Immediately</string>
<string name="vault_timeout_log_out_confirmation_title">Set session timeout to \"Log out\"?</string>
<string name="vault_timeout_log_out_confirmation_message">After the timeout period, you will be logged out. You will need to be connected to the internet to log in and access your vault again. Your settings and PIN saved on this device won\'t change.</string>
<string name="logging_in">Logging in...</string>
<string name="logging_in">Logging in…</string>
<string name="login_to_bitwarden">Log in to Bitwarden</string>
<string name="master_password_confirmation_val_message">Password confirmation is not correct.</string>
<string name="master_password_description">The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it.</string>
<string name="master_password_hint">Master password hint (optional)</string>
<string name="master_password_hint_description">A master password hint can help you remember your password if you forget it.</string>
<string name="master_password_length_val_message_x">Master password must be at least %1$s characters long.</string>
<plurals name="master_password_length_val_message_x">
<item quantity="one">Master password must be at least %d character long.</item>
<item quantity="other">Master password must be at least %d characters long.</item>
</plurals>
<string name="min_numbers">Minimum numbers</string>
<string name="min_special">Minimum special</string>
<string name="never">Never</string>
@@ -143,8 +146,8 @@
<string name="select">Select</string>
<string name="item_details">Item details</string>
<string name="item_updated">Item updated.</string>
<string name="submitting">Submitting...</string>
<string name="syncing">Syncing...</string>
<string name="submitting">Submitting…</string>
<string name="syncing">Syncing…</string>
<string name="syncing_complete">Syncing complete.</string>
<string name="two_step_login">Two-step login</string>
<string name="unlock_with_biometrics">Unlock with Biometrics</string>
@@ -163,7 +166,7 @@
<string name="search_for_a_login_or_add_a_new_login">Search for a login or add a new login</string>
<string name="disabled">Disabled</string>
<string name="bitwarden_autofill_service_alert2">The easiest way to add new logins to your vault is from the Bitwarden Auto-fill Service. Learn more about using the Bitwarden Auto-fill Service by navigating to the \"Settings\" screen.</string>
<string name="autofill">Auto-fill</string>
<string name="autofill_title">Autofill</string>
<string name="autofill_or_view">Do you want to auto-fill or view this item?</string>
<string name="search">Search</string>
<string name="learn_org">Learn about organisations</string>
@@ -182,7 +185,7 @@
<string name="add_new_attachment">Add new attachment</string>
<string name="attachments">Attachments</string>
<string name="unable_to_download_file">Unable to download file.</string>
<string name="downloading">Downloading...</string>
<string name="downloading">Downloading…</string>
<string name="attachment_large_warning">This attachment is %1$s in size. Are you sure you want to download it onto your device?</string>
<string name="authenticator_key">Authenticator key (TOTP)</string>
<string name="verification_code_totp">Verification code (TOTP)</string>
@@ -309,7 +312,10 @@ Scanning will happen automatically.</string>
<string name="personal_details">Personal Details</string>
<string name="contact_info">Contact Info</string>
<string name="check_password_for_data_breaches">Check password for data breaches</string>
<string name="password_exposed">This password has been exposed %1$s time(s) in data breaches. You should change it.</string>
<plurals name="password_exposed">
<item quantity="one">This password has been exposed %d time in data breaches. You should change it.</item>
<item quantity="other">This password has been exposed %d times in data breaches. You should change it.</item>
</plurals>
<string name="password_safe">This password was not found in any known data breaches. It should be safe to use.</string>
<string name="identity_name">Identity name</string>
<string name="value">Value</string>
@@ -396,7 +402,7 @@ Scanning will happen automatically.</string>
<string name="soft_deleting">Sending to bin...</string>
<string name="item_soft_deleted">Item has been sent to bin.</string>
<string name="restore">Restore</string>
<string name="restoring">Restoring...</string>
<string name="restoring">Restoring…</string>
<string name="item_restored">Item has been restored.</string>
<string name="trash">Bin</string>
<string name="do_you_really_want_to_permanently_delete_cipher">Do you really want to permanently delete? This cannot be undone.</string>
@@ -749,7 +755,10 @@ Do you want to switch to this account?</string>
<string name="bitwarden_cannot_reset_a_lost_or_forgotten_master_password">Bitwarden cannot reset a lost or forgotten master password.</string>
<string name="choose_your_master_password">Choose your master password</string>
<string name="choose_a_unique_and_strong_password_to_keep_your_information_safe">Choose a unique and strong password to keep your information safe.</string>
<string name="minimum_characters">%1$s characters</string>
<plurals name="minimum_characters">
<item quantity="one">%d character</item>
<item quantity="other">%d characters</item>
</plurals>
<string name="expired_link">Expired link</string>
<string name="please_restart_registration_or_try_logging_in">Please restart registration or try logging in. You may already have an account.</string>
<string name="restart_registration">Restart registration</string>
@@ -802,7 +811,7 @@ Do you want to switch to this account?</string>
<string name="need_help_check_out_import_help">Need help? Check out import help.</string>
<string name="save_the_exported_file_somewhere_on_your_computer_you_can_find_easily">Save the exported file somewhere on your computer you can find easily.</string>
<string name="this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server">This is not a recognised Bitwarden server. You may need to check with your provider or update your server.</string>
<string name="syncing_logins_loading_message">Syncing logins...</string>
<string name="syncing_logins_loading_message">Syncing logins…</string>
<string name="download_the_browser_extension">Download the browser extension</string>
<string name="go_to_bitwarden_com_download_to_integrate_bitwarden_into_browser">Go to bitwarden.com/download to integrate Bitwarden into your favourite browser for a seamless experience.</string>
<string name="use_the_web_app">Use the web app</string>
@@ -911,7 +920,7 @@ Do you want to switch to this account?</string>
<string name="no_folder">No folder</string>
<string name="show_less">Show less</string>
<string name="add_field">Add field</string>
<string name="x_ellipses">%s...</string>
<string name="x_ellipses">%s…</string>
<string name="share_error_details">Share error details</string>
<string name="flight_recorder">Flight recorder</string>
<string name="flight_recorder_help">Flight recorder help</string>
+23 -14
View File
@@ -12,7 +12,7 @@
<string name="copy_password">Copiar contraseña</string>
<string name="copy_username">Copiar nombre de usuario</string>
<string name="delete">Eliminar</string>
<string name="deleting">Eliminando...</string>
<string name="deleting">Deleting…</string>
<string name="do_you_really_want_to_delete">¿Seguro que quieres eliminarlo? Esto no puedes deshacerse.</string>
<string name="edit">Editar</string>
<string name="edit_folder">Editar carpeta</string>
@@ -55,7 +55,7 @@
<string name="password">Contraseña</string>
<string name="save">Guardar</string>
<string name="move">Mover</string>
<string name="saving">Guardando...</string>
<string name="saving">Saving…</string>
<string name="settings">Ajustes</string>
<string name="show">Mostrar</string>
<string name="item_deleted">Elemento eliminado</string>
@@ -104,13 +104,16 @@
<string name="immediately">Inmediatamente</string>
<string name="vault_timeout_log_out_confirmation_title">¿Establecer tiempo de espera de sesión a \"Cerrar sesión\"?</string>
<string name="vault_timeout_log_out_confirmation_message">Tras el tiempo de espera, tu sesión cerrará. Necesitarás estar conectado a internet para iniciar sesión y volver a acceder a tu caja fuerte. Los ajustes y el PIN guardados en este dispositivo no cambiarán.</string>
<string name="logging_in">Iniciando sesión...</string>
<string name="logging_in">Logging in…</string>
<string name="login_to_bitwarden">Iniciar sesión en Bitwarden</string>
<string name="master_password_confirmation_val_message">La confirmación de la contraseña no es correcta.</string>
<string name="master_password_description">La contraseña maestra es la clave que utilizas para acceder a tu caja fuerte. Es muy importante que no olvides tu contraseña maestra. No hay forma de recuperarla si la olvidas.</string>
<string name="master_password_hint">Pista de contraseña maestra (opcional)</string>
<string name="master_password_hint_description">Una pista de tu contraseña maestra puede ayudarte a recordarla en caso de que la olvides.</string>
<string name="master_password_length_val_message_x">La contraseña maestra debe tener al menos %1$s caracteres.</string>
<plurals name="master_password_length_val_message_x">
<item quantity="one">Master password must be at least %d character long.</item>
<item quantity="other">Master password must be at least %d characters long.</item>
</plurals>
<string name="min_numbers">Mínimo de caracteres numéricos</string>
<string name="min_special">Mínimo de caracteres especiales</string>
<string name="never">Nunca</string>
@@ -143,8 +146,8 @@
<string name="select">Seleccionar</string>
<string name="item_details">Detalles del elemento</string>
<string name="item_updated">Elemento guardado</string>
<string name="submitting">Enviando...</string>
<string name="syncing">Sincronizando...</string>
<string name="submitting">Submitting…</string>
<string name="syncing">Syncing…</string>
<string name="syncing_complete">Sincronización completada</string>
<string name="two_step_login">Autenticación en dos pasos</string>
<string name="unlock_with_biometrics">Desbloquear con Biometría</string>
@@ -163,7 +166,7 @@
<string name="search_for_a_login_or_add_a_new_login">Buscar un inicio de sesión o añadir un nuevo inicio de sesión</string>
<string name="disabled">Desactivado</string>
<string name="bitwarden_autofill_service_alert2">La forma más fácil de añadir nuevos inicios de sesión a tu caja fuerte es utilizando el Servicio de Autocompletar de Bitwarden. Aprenda más sobre cómo utilizar el Servicio de Autocompletar de Bitwarden en el menú \"Ajustes\".</string>
<string name="autofill">Autocompletar</string>
<string name="autofill_title">Autofill</string>
<string name="autofill_or_view">¿Quieres autocompletar o ver este elemento?</string>
<string name="search">Buscar</string>
<string name="learn_org">Aprende sobre organizaciones</string>
@@ -182,7 +185,7 @@
<string name="add_new_attachment">Añadir nuevo archivo adjunto</string>
<string name="attachments">Adjuntos</string>
<string name="unable_to_download_file">No se pudo descargar el archivo.</string>
<string name="downloading">Descargando...</string>
<string name="downloading">Downloading…</string>
<string name="attachment_large_warning">Este adjunto ocupa %1$s. ¿Estás seguro de que quieres descargarlo en tu dispositivo?</string>
<string name="authenticator_key">Clave de autenticación (TOTP)</string>
<string name="verification_code_totp">Código de verificación (TOTP)</string>
@@ -309,7 +312,10 @@ El escaneo se realizará automáticamente.</string>
<string name="personal_details">Datos Personales</string>
<string name="contact_info">Información de Contacto</string>
<string name="check_password_for_data_breaches">Propietario</string>
<string name="password_exposed">Esta contraseña ha sido expuesta %1$s veces(s) en filtraciones de datos. Debería cambiarla.</string>
<plurals name="password_exposed">
<item quantity="one">This password has been exposed %d time in data breaches. You should change it.</item>
<item quantity="other">This password has been exposed %d times in data breaches. You should change it.</item>
</plurals>
<string name="password_safe">Esta contraseña no fue encontrada en ninguna filtración de datos conocida. Debería poder utilizarla de forma segura.</string>
<string name="identity_name">Nombre de la identidad</string>
<string name="value">Valor</string>
@@ -393,10 +399,10 @@ El escaneo se realizará automáticamente.</string>
<string name="save_attachment_success">Archivo adjunto guardado con éxito</string>
<string name="autofill_tile_accessibility_required">Por favor, habilite \"Servicio de Accesibilidad de Autocompletado\" en la configuración de Bitwarden para utilizar la función de autocompletado.</string>
<string name="autofill_tile_uri_not_found">No se han detectado campos de contraseña</string>
<string name="soft_deleting">Enviando a la papelera...</string>
<string name="soft_deleting">Sending to trash…</string>
<string name="item_soft_deleted">El elemento ha sido enviado a la papelera.</string>
<string name="restore">Restaurar</string>
<string name="restoring">Restaurando...</string>
<string name="restoring">Restoring…</string>
<string name="item_restored">El elemento ha sido restaurado.</string>
<string name="trash">Papelera</string>
<string name="do_you_really_want_to_permanently_delete_cipher">¿Seguro que quieres eliminarlo permanentemente? Esto no se puede deshacer.</string>
@@ -750,7 +756,10 @@ seleccione Agregar TOTP para almacenar la clave de forma segura</string>
<string name="bitwarden_cannot_reset_a_lost_or_forgotten_master_password">Bitwarden cannot reset a lost or forgotten master password.</string>
<string name="choose_your_master_password">Elige tu contraseña maestra</string>
<string name="choose_a_unique_and_strong_password_to_keep_your_information_safe">Elige una contraseña fuerte y única para mantener tu información segura.</string>
<string name="minimum_characters">%1$s caracteres</string>
<plurals name="minimum_characters">
<item quantity="one">%d character</item>
<item quantity="other">%d characters</item>
</plurals>
<string name="expired_link">Enlace expirado</string>
<string name="please_restart_registration_or_try_logging_in">Please restart registration or try logging in. You may already have an account.</string>
<string name="restart_registration">Reiniciar registro</string>
@@ -803,7 +812,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura</string>
<string name="need_help_check_out_import_help">Need help? Check out <annotation link="importHelp">import help</annotation>.</string>
<string name="save_the_exported_file_somewhere_on_your_computer_you_can_find_easily"><annotation emphasis="bold">Save the exported file</annotation> somewhere on your computer you can find easily.</string>
<string name="this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server">Este no es un servidor de Bitwarden reconocido. Puede que tengas que consultar con tu proveedor o actualizar tu servidor.</string>
<string name="syncing_logins_loading_message">Sincronizando inicios de sesión...</string>
<string name="syncing_logins_loading_message">Syncing logins…</string>
<string name="download_the_browser_extension">Descarga la extensión del navegador</string>
<string name="go_to_bitwarden_com_download_to_integrate_bitwarden_into_browser">Go to bitwarden.com/download to integrate Bitwarden into your favorite browser for a seamless experience.</string>
<string name="use_the_web_app">Usa la aplicación web</string>
@@ -912,7 +921,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura</string>
<string name="no_folder">Sin carpeta</string>
<string name="show_less">Mostrar menos</string>
<string name="add_field">Añadir campo</string>
<string name="x_ellipses">%s...</string>
<string name="x_ellipses">%s…</string>
<string name="share_error_details">Compartir detalles del error</string>
<string name="flight_recorder">Flight recorder</string>
<string name="flight_recorder_help">Flight recorder help</string>
+83 -74
View File
@@ -4,7 +4,7 @@
<string name="add_folder">Kausta lisamine</string>
<string name="add_item">Kirje lisamine</string>
<string name="an_error_has_occurred">Ilmnes tõrge.</string>
<string name="apply">Apply</string>
<string name="apply">Rakenda</string>
<string name="back">Tagasi</string>
<string name="bitwarden">Bitwarden</string>
<string name="cancel">Tühista</string>
@@ -12,7 +12,7 @@
<string name="copy_password">Kopeeri parool</string>
<string name="copy_username">Kopeeri kasutajanimi</string>
<string name="delete">Kustuta</string>
<string name="deleting">Kustutamine...</string>
<string name="deleting">Deleting…</string>
<string name="do_you_really_want_to_delete">Kas soovid kindlasti kustutada? Seda ei saa tagasi võtta.</string>
<string name="edit">Muuda</string>
<string name="edit_folder">Muuda kausta</string>
@@ -55,7 +55,7 @@
<string name="password">Parool</string>
<string name="save">Salvesta</string>
<string name="move">Teisalda</string>
<string name="saving">Salvestan...</string>
<string name="saving">Saving…</string>
<string name="settings">Seaded</string>
<string name="show">Näita</string>
<string name="item_deleted">Kirje on kustutatud.</string>
@@ -104,13 +104,16 @@
<string name="immediately">Koheselt</string>
<string name="vault_timeout_log_out_confirmation_title">Set session timeout to \"Log out\"?</string>
<string name="vault_timeout_log_out_confirmation_message">After the timeout period, you will be logged out. You will need to be connected to the internet to log in and access your vault again. Your settings and PIN saved on this device won\'t change.</string>
<string name="logging_in">Sisselogimine...</string>
<string name="logging_in">Logging in…</string>
<string name="login_to_bitwarden">Logi sisse Bitwardenisse</string>
<string name="master_password_confirmation_val_message">Parooli kinnitus ei ole õige.</string>
<string name="master_password_description">Ülemparool on parool, millega pääsed oma kontole ligi. On äärmiselt tähtis, et ülemparool ei ununeks. Selle parooli taastamine ei ole mingil moel võimalik.</string>
<string name="master_password_hint">Ülemparooli vihje (ei ole kohustuslik)</string>
<string name="master_password_hint_description">Vihje võib abiks olla olukorras, kui oled ülemparooli unustanud.</string>
<string name="master_password_length_val_message_x">Ülemparool peab olema vähemalt %1$s tähemärgi pikkune.</string>
<plurals name="master_password_length_val_message_x">
<item quantity="one">Master password must be at least %d character long.</item>
<item quantity="other">Master password must be at least %d characters long.</item>
</plurals>
<string name="min_numbers">Vähim arv numbreid</string>
<string name="min_special">Vähim arv spetsiaalmärke</string>
<string name="never">Mitte kunagi</string>
@@ -143,11 +146,11 @@
<string name="select">Vali</string>
<string name="item_details">Item details</string>
<string name="item_updated">Kirje on uuendatud.</string>
<string name="submitting">Saatmine...</string>
<string name="syncing">Sünkroniseerimine...</string>
<string name="submitting">Submitting…</string>
<string name="syncing">Syncing…</string>
<string name="syncing_complete">Sünkroniseerimine on lõpetatud.</string>
<string name="two_step_login">Kaheastmeline kinnitamine</string>
<string name="unlock_with_biometrics">Unlock with Biometrics</string>
<string name="unlock_with_biometrics">Ava biomeetriaga</string>
<string name="unlock_with_pin">Lukusta lahti PIN koodiga</string>
<string name="verification_code">Kinnituskood</string>
<string name="view_login">View login</string>
@@ -163,7 +166,7 @@
<string name="search_for_a_login_or_add_a_new_login">Search for a login or add a new login</string>
<string name="disabled">Keelatud</string>
<string name="bitwarden_autofill_service_alert2">Lihtsaim viis hoidlasse kontosid lisada on läbi Bitwardeni automaattäite teenuse. Rohkem infot selle kohta leiad Bitwardeni rakenduse menüüst \"Seaded\".</string>
<string name="autofill">Täida automaatselt</string>
<string name="autofill_title">Autofill</string>
<string name="autofill_or_view">Soovid seda kirjet sisestada või vaadata?</string>
<string name="search">Otsi</string>
<string name="learn_org">Info organisatsioonide kohta</string>
@@ -182,7 +185,7 @@
<string name="add_new_attachment">Lisa uus manus</string>
<string name="attachments">Manused</string>
<string name="unable_to_download_file">Faili allalaadimine nurjus.</string>
<string name="downloading">Allalaadimine...</string>
<string name="downloading">Downloading…</string>
<string name="attachment_large_warning">See manus on %1$s suurusega. Oled kindel, et soovid seda oma seadmesse allalaadida?</string>
<string name="authenticator_key">Autentimise võti (TOTP)</string>
<string name="verification_code_totp">Kinnituskood (TOTP)</string>
@@ -287,7 +290,7 @@ Skaneerimine toimub automaatselt.</string>
<string name="new_uri">Uus URI</string>
<string name="add_website">Add website</string>
<string name="base_domain">Baasdomeen</string>
<string name="default_text">Default (%1$s)</string>
<string name="default_text">Vaikimisi (%1$s)</string>
<string name="exact">Täpne</string>
<string name="host">Host</string>
<string name="reg_ex">RegEx</string>
@@ -309,7 +312,10 @@ Skaneerimine toimub automaatselt.</string>
<string name="personal_details">Personal Details</string>
<string name="contact_info">Contact Info</string>
<string name="check_password_for_data_breaches">Check password for data breaches</string>
<string name="password_exposed">See parool on erinevates andmeleketes kokku %1$s korda lekkinud. Peaksid selle ära muutma.</string>
<plurals name="password_exposed">
<item quantity="one">This password has been exposed %d time in data breaches. You should change it.</item>
<item quantity="other">This password has been exposed %d times in data breaches. You should change it.</item>
</plurals>
<string name="password_safe">Seda parooli ei õnnestu andmeleketest leida. Parooli edasi kasutamine peaks olema turvaline.</string>
<string name="identity_name">Identiteedi nimi</string>
<string name="value">Väärtus</string>
@@ -357,7 +363,7 @@ Skaneerimine toimub automaatselt.</string>
<string name="clear_clipboard">Lõikelaua puhastamine</string>
<string name="clear_clipboard_description">Puhastab automaatselt lõikelauale kopeeritud sisu.</string>
<string name="default_uri_match_detection">Vaike URI sobivuse tuvastamine</string>
<string name="default_uri_match_detection_description">URI match detection controls how Bitwarden identifies autofill suggestions.</string>
<string name="default_uri_match_detection_description">URI vaste tuvastamine kontrollib, kuidas Bitwarden tuvastab, kus pakkuda automaatse täitmise soovitusi.</string>
<string name="theme">Kujundus</string>
<string name="theme_description">Muuda rakenduse värvikujundust.</string>
<string name="copy_notes">Kopeeri märkus</string>
@@ -365,8 +371,8 @@ Skaneerimine toimub automaatselt.</string>
<string name="exit_confirmation">Soovid tõesti Bitwardeni sulgeda?</string>
<string name="require_master_password_on_app_restart">Require master password on app restart?</string>
<string name="pin_require_master_password_restart">You you want to require unlocking with your master password when the application is restarted?</string>
<string name="ask_to_add_item">Ask to add item</string>
<string name="ask_to_add_item_description">Ask to add an item if one isn\'t found in your vault.</string>
<string name="ask_to_add_item">Paku kirje lisamist</string>
<string name="ask_to_add_item_description">Pakub kontoandmete salvestamist, kui see on hoidlast puudu.</string>
<string name="on_restart">Äpi taaskäivitamisel</string>
<string name="capitalize">Suurtäht</string>
<string name="include_number">Lisa number</string>
@@ -393,10 +399,10 @@ Skaneerimine toimub automaatselt.</string>
<string name="save_attachment_success">Manus on edukalt lisatud</string>
<string name="autofill_tile_accessibility_required">Palun lülita \"Automaattäite juurdepääsetavuse teenus\" Bitwardeni seadetest sisse, et Automaattäite kasti kasutada.</string>
<string name="autofill_tile_uri_not_found">Paroolivälju ei tuvastatud</string>
<string name="soft_deleting">Prügikasti teisaldamine...</string>
<string name="soft_deleting">Sending to trash…</string>
<string name="item_soft_deleted">Kirje on prügikasti saadetud.</string>
<string name="restore">Taasta</string>
<string name="restoring">Taastamine...</string>
<string name="restoring">Restoring…</string>
<string name="item_restored">Kirje on taastatud.</string>
<string name="trash">Prügikast</string>
<string name="do_you_really_want_to_permanently_delete_cipher">Oled kindel, et soovid kirje(d) jäädavalt kustutada? Seda ei saa tagasi võtta.</string>
@@ -749,7 +755,10 @@ Soovid selle konto peale lülituda?</string>
<string name="bitwarden_cannot_reset_a_lost_or_forgotten_master_password">Bitwarden cannot reset a lost or forgotten master password.</string>
<string name="choose_your_master_password">Choose your master password</string>
<string name="choose_a_unique_and_strong_password_to_keep_your_information_safe">Choose a unique and strong password to keep your information safe.</string>
<string name="minimum_characters">%1$s characters</string>
<plurals name="minimum_characters">
<item quantity="one">%d character</item>
<item quantity="other">%d characters</item>
</plurals>
<string name="expired_link">Aegunud link</string>
<string name="please_restart_registration_or_try_logging_in">Palun alusta uuesti registreerimist või proovi sisse logida. Sul võib olla konto juba olemas.</string>
<string name="restart_registration">Alusta registreerimist uuesti</string>
@@ -802,7 +811,7 @@ Soovid selle konto peale lülituda?</string>
<string name="need_help_check_out_import_help">Need help? Check out <annotation link="importHelp">import help</annotation>.</string>
<string name="save_the_exported_file_somewhere_on_your_computer_you_can_find_easily"><annotation emphasis="bold">Save the exported file</annotation> somewhere on your computer you can find easily.</string>
<string name="this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server">This is not a recognized Bitwarden server. You may need to check with your provider or update your server.</string>
<string name="syncing_logins_loading_message">Syncing logins...</string>
<string name="syncing_logins_loading_message">Syncing logins…</string>
<string name="download_the_browser_extension">Download the browser extension</string>
<string name="go_to_bitwarden_com_download_to_integrate_bitwarden_into_browser">Go to bitwarden.com/download to integrate Bitwarden into your favorite browser for a seamless experience.</string>
<string name="use_the_web_app">Use the web app</string>
@@ -911,7 +920,7 @@ Soovid selle konto peale lülituda?</string>
<string name="no_folder">No folder</string>
<string name="show_less">Show less</string>
<string name="add_field">Add field</string>
<string name="x_ellipses">%s...</string>
<string name="x_ellipses">%s…</string>
<string name="share_error_details">Share error details</string>
<string name="flight_recorder">Flight recorder</string>
<string name="flight_recorder_help">Flight recorder help</string>
@@ -988,30 +997,30 @@ Soovid selle konto peale lülituda?</string>
<string name="scan_a_qr_code">Skanneeri QR-koodi</string>
<string name="cannot_add_authenticator_key">Ei suuda autentimise võtit lisada?</string>
<string name="enable_camera_permission_to_use_the_scanner">Skänneri kasutamiseks luba ligipääs kaamerale</string>
<string name="empty_item_list">Empty Item Listing</string>
<string name="empty_item_list">Tühi kirjete kaust</string>
<string name="you_dont_have_items_to_display">Sul ei ole ühtegi kirjet.</string>
<string name="empty_item_list_instruction">Add a new code to secure your accounts.</string>
<string name="add_code">Add code</string>
<string name="verification_code_added">Verification code added</string>
<string name="refresh_period">Refresh period</string>
<string name="algorithm">Algorithm</string>
<string name="advanced">Advanced</string>
<string name="empty_item_list_instruction">Lisa oma kontode kaitsmiseks uus kood.</string>
<string name="add_code">Lisa kood</string>
<string name="verification_code_added">Kinnituskood lisatud</string>
<string name="refresh_period">Värskendusperiood</string>
<string name="algorithm">Algoritm</string>
<string name="advanced">Lisavalikud</string>
<string name="collapse_advanced_options">Peida seaded edasijõudnutele</string>
<string name="number_of_digits">Number of digits</string>
<string name="number_of_digits">Numbrite arv</string>
<string name="refresh_period_seconds" tools:ignore="PluralsCandidate">%d sekundit</string>
<string name="item_saved">Kirje salvestatud</string>
<string name="information">Teave</string>
<string name="otp_type">OTP tüüp</string>
<string name="search_codes">Otsi koode</string>
<string name="secure_your_accounts_with_bitwarden_authenticator">Secure your accounts with Bitwarden Authenticator</string>
<string name="secure_your_accounts_with_bitwarden_authenticator">Turva oma kontod Bitwarden Authenticator\'iga</string>
<string name="get_verification_codes_for_all_your_accounts">Hangi kinnitamiskoodid kõikidele sinu kontodele, mis toetavad 2-astmelist kinnitamist.</string>
<string name="use_your_device_camera_to_scan_codes">Use your device camera to scan codes</string>
<string name="scan_the_qr_code_in_your_2_step_verification_settings_for_any_account">Scan the QR code in your 2-step verification settings for any account.</string>
<string name="sign_in_using_unique_codes">Sign in using unique codes</string>
<string name="use_your_device_camera_to_scan_codes">Kasuta koodide skänneerimiseks oma seadme kaamerat</string>
<string name="scan_the_qr_code_in_your_2_step_verification_settings_for_any_account">Skänneeri ükskõik millise konto jaoks oma QR-kood 2-astmelise kinnitamise seadetes.</string>
<string name="sign_in_using_unique_codes">Logi sisse kasutades unikaalseid koode</string>
<string name="when_using_2_step_verification_youll_enter_your_username_and_password_and_a_code_generated_in_this_app">Kui sa kasutad 2-astmelist kinnitamist, sisestad sa oma kasutajanime, parooli ja selle rakenduse genereeritud koodi.</string>
<string name="skip">Skip</string>
<string name="skip">Jäta vahele</string>
<string name="help">Abi</string>
<string name="launch_tutorial">Launch tutorial</string>
<string name="launch_tutorial">Käivita õpetus</string>
<string name="delete_item">Kustuta kirje</string>
<string name="do_you_really_want_to_permanently_delete_this_cannot_be_undone">Oled sa kindel, et soovid jäädavalt kustudada? Seda ei saa tagasi võtta.</string>
<string name="data">Andmed</string>
@@ -1030,55 +1039,55 @@ Soovid selle konto peale lülituda?</string>
<string name="import_vault">Impordi</string>
<string name="import_success">Hoidla edukalt imporditud</string>
<string name="key_is_invalid">Võti on kehtimatu.</string>
<string name="backup">Backup</string>
<string name="backup">Varundus</string>
<string name="data_backup_title">Andmete varundamine</string>
<string name="data_backup_message">Bitwarden Authenticator data is backed up and can be restored with your regularly scheduled device backups.</string>
<string name="import_2fas_password_protected_not_supported">Importing from 2FAS password protected files is not supported. Try again with an exported file that is not password protected.</string>
<string name="data_backup_message">Bitwarden Authenticator\'i andmed on varundatud ja neid saab taastada sinu regulaarsetest seadme varukoopiatest.</string>
<string name="import_2fas_password_protected_not_supported">2FAS-i parooliga kaitstud failide importimine ei ole toetatud. Proovi uuesti eksporditud failiga, mis ei ole parooliga kaitstud.</string>
<string name="import_bitwarden_unsupported_format">Bitwardeni CSV failide importimine ei ole toetatud. Proovi uuesti eksporditud JSON failiga.</string>
<string name="download_bitwarden_card_title">Download the Bitwarden app</string>
<string name="download_bitwarden_card_message">Store all of your logins and sync verification codes directly with the Authenticator app.</string>
<string name="download_bitwarden_card_title">Lae alla Bitwarden\'i rakendus</string>
<string name="download_bitwarden_card_message">Hoiusta kõiki oma kasutajakonto andmeid ja sünkroniseeri oma kinnituskoode otse Authenticatori rakenduse kaudu.</string>
<string name="download_now">Laadi kohe alla</string>
<string name="sync_with_bitwarden_app">Sünkroniseeri Bitwardeni rakendusega</string>
<string name="learn_more_link"><annotation link="learnMore">Learn more</annotation></string>
<string name="shared_codes_error">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.</string>
<string name="learn_more_link"><annotation link="learnMore">Uuri lähemalt</annotation></string>
<string name="shared_codes_error">Ei õnnestunud sünkroniseerida koode Bitwardeni rakendusega. Kontrolli, et mõlemad rakendused on värskendatud. Oma olemasolevatele koodidele pääsed jätkuvalt Bitwardeni rakenduse kaudu ligi.</string>
<string name="shared_accounts_header">%1$s | %2$s (%3$d)</string>
<string name="sync_with_the_bitwarden_app">Sync with the Bitwarden app</string>
<string name="sync_with_bitwarden_action_card_message">In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts.</string>
<string name="take_me_to_app_settings">Take me to the app settings</string>
<string name="something_went_wrong">Something went wrong</string>
<string name="please_try_again">Please try again</string>
<string name="copy_to_bitwarden_vault">Copy to Bitwarden vault</string>
<string name="default_save_option">Default save option</string>
<string name="save_to_bitwarden">Save to Bitwarden</string>
<string name="save_here">Save here</string>
<string name="none">None</string>
<string name="default_save_options_subtitle">Select where you would like to save new verification codes.</string>
<string name="verification_code_created">Verification code created</string>
<string name="choose_save_location_message">Save this authenticator key here, or add it to a login in your Bitwarden app.</string>
<string name="save_option_as_default">Save option as default</string>
<string name="account_synced_from_bitwarden_app">Account synced from Bitwarden app</string>
<string name="local_codes">Local codes (%1$d)</string>
<string name="required_information_missing">Required Information Missing</string>
<string name="required_information_missing_message">"Required info is missing (e.g., ‘services’ or ‘secret’). Check your file and try again. Visit bitwarden.com/help for support"</string>
<string name="file_could_not_be_processed">"File Could Not Be Processed"</string>
<string name="file_could_not_be_processed_message">"File could not be processed. Ensure it’s valid JSON and try again. Need help? Visit bitwarden.com/help"</string>
<string name="sync_with_the_bitwarden_app">Sünkroniseeri Bitwardeni rakendusega</string>
<string name="sync_with_bitwarden_action_card_message">Selleks, et näha kõiki oma kinnituskoode, pead lubama kõigil oma kontodel sünkroniseerimise.</string>
<string name="take_me_to_app_settings">Vii mind rakenduse seadetesse</string>
<string name="something_went_wrong">Midagi läks valesti</string>
<string name="please_try_again">Palun proovi uuesti</string>
<string name="copy_to_bitwarden_vault">Kopeeri Bitwardeni hoidlasse</string>
<string name="default_save_option">Vaikimisi määratud salvestuse valik</string>
<string name="save_to_bitwarden">Salvesta Bitwardenisse</string>
<string name="save_here">Salvesta siia</string>
<string name="none">Puudub</string>
<string name="default_save_options_subtitle">Vali, kuhu sooviksid salvestada uued kinnituskoodid.</string>
<string name="verification_code_created">Kinnituskood loodud</string>
<string name="choose_save_location_message">Salvesta see autentikaatori võti siia või lisa see oma Bitwardeni rakenduses kirjele.</string>
<string name="save_option_as_default">Salvesta valik vaikimisi kasutamiseks</string>
<string name="account_synced_from_bitwarden_app">Konto sünkroniseeritud Bitwardeni rakendusest</string>
<string name="local_codes">Kohalikud koodid (%1$d)</string>
<string name="required_information_missing">Puudub nõutud informatsiooni</string>
<string name="required_information_missing_message">"Puudub nõutud informatsiooni (nt \"teenused\" või \"saladused\"). Kontrolli oma faili ja proovi uuesti. Abi saamiseks külasta bitwarden.com/help"</string>
<string name="file_could_not_be_processed">"Faili ei õnnestunud töödelda"</string>
<string name="file_could_not_be_processed_message">"Faili ei õnnestunud töödelda. Kontrolli, et see oleks korrektne JSON ja proovi uuesti. Vajad abi? Külasta bitwarden.com/help"</string>
<string name="get_help">Klienditugi</string>
<string name="expand_advanced_options">Expand advanced options</string>
<string name="local_items_are_expanded_click_to_collapse">Local items are expanded, click to collapse.</string>
<string name="local_items_are_collapsed_click_to_expand">Local items are collapsed, click to expand.</string>
<string name="items_expanded_click_to_collapse">Items are expanded, click to collapse.</string>
<string name="items_are_collapsed_click_to_expand">Items are collapsed, click to expand.</string>
<string name="error_cannot_decrypt">[error: cannot decrypt]</string>
<string name="copy_error_report">Copy error report</string>
<string name="bitwarden_could_not_decrypt_this_vault_item_description_long">Bitwarden could not decrypt this vault item. Copy and share this error report with customer success to avoid additional data loss.</string>
<string name="expand_advanced_options">Laienda täpsemate seadete jaoks</string>
<string name="local_items_are_expanded_click_to_collapse">Kohalikud kirjed on laiendatud, peitmiseks vajuta.</string>
<string name="local_items_are_collapsed_click_to_expand">Kohalikud kirjed on peidetud, laiendamiseks vajuta.</string>
<string name="items_expanded_click_to_collapse">Kirjed laiendatud, peitmiseks vajuta.</string>
<string name="items_are_collapsed_click_to_expand">Kirjed peidetud, laiendamiseks vajuta.</string>
<string name="error_cannot_decrypt">[error: dekrüpteerimine ebaõnnestus]</string>
<string name="copy_error_report">Kopeeri veateade</string>
<string name="bitwarden_could_not_decrypt_this_vault_item_description_long">Bitwarden ei suutnud dekrüpteerida seda hoidla kirjet. Edasise andmekaotuse vältimiseks kopeeri ja jaga seda veateadet klienditeenindusega.</string>
<plurals name="bitwarden_could_not_decrypt_x_vault_item_copy_and_share_description_long">
<item quantity="one">Bitwarden could not decrypt %1$d vault item. Copy and share this error report with customer success to avoid additional data loss.</item>
<item quantity="other">Bitwarden could not decrypt %1$d vault items. Copy and share this error report with customer success to avoid additional data loss.</item>
<item quantity="one">Bitwarden ei suutnud dekrüpteerida [%1$d] kirjet. Edasise andmekaotuse vältimiseks kopeeri ja jaga seda veateadet klienditeenindusega.</item>
<item quantity="other">Bitwarden ei suutnud dekrüpteerida [%1$d] kirjet. Edasise andmekaotuse vältimiseks kopeeri ja jaga seda veateadet klienditeenindusega.</item>
</plurals>
<string name="select_a_card_for_x">Select a card for %s</string>
<string name="advanced_options">Advanced options</string>
<string name="more_about_match_detection"><annotation link="moreAboutMatchDetection">More about match detection</annotation></string>
<string name="keep_your_credential_secure">Keep your credentials secure</string>
<string name="advanced_options">Täpsemad seaded</string>
<string name="more_about_match_detection"><annotation link="moreAboutMatchDetection">Rohkem vaste tuvastamise kohta</annotation></string>
<string name="keep_your_credential_secure">Hoia oma andmed turvalisena</string>
<string name="learn_more_about_how_to_keep_credentirals_secure">Learn more about how to keep credentials secure when using “%1$s”.</string>
<string name="are_you_sure_you_want_to_use">Are you sure you want to use “%1$s”?</string>
<string name="default_uri_match_detection_description_advanced_options_incorrectly">URI match detection controls how Bitwarden identifies autofill suggestions.\n<annotation emphasis="bold">Warning:</annotation> “Regular expression” is an advanced option with increased risk of exposing credentials if used incorrectly.</string>
+23 -14
View File
@@ -12,7 +12,7 @@
<string name="copy_password">Kopiatu pasahitza</string>
<string name="copy_username">Kopiatu erabiltzaile-izena</string>
<string name="delete">Ezabatu</string>
<string name="deleting">Ezabatzen...</string>
<string name="deleting">Deleting…</string>
<string name="do_you_really_want_to_delete">Ziur al zaude benetan ezabatu nahi duzula? Eragiketa hau ezin da desegin!</string>
<string name="edit">Editatu</string>
<string name="edit_folder">Editatu Karpeta</string>
@@ -55,7 +55,7 @@
<string name="password">Pasahitza</string>
<string name="save">Gorde</string>
<string name="move">Mugitu</string>
<string name="saving">Gordetzen...</string>
<string name="saving">Saving…</string>
<string name="settings">Ezarpenak</string>
<string name="show">Erakutsi</string>
<string name="item_deleted">Elementua ezabatu da.</string>
@@ -104,13 +104,16 @@
<string name="immediately">Berehala</string>
<string name="vault_timeout_log_out_confirmation_title">Set session timeout to \"Log out\"?</string>
<string name="vault_timeout_log_out_confirmation_message">After the timeout period, you will be logged out. You will need to be connected to the internet to log in and access your vault again. Your settings and PIN saved on this device won\'t change.</string>
<string name="logging_in">Saioa hasten...</string>
<string name="logging_in">Logging in…</string>
<string name="login_to_bitwarden">Log in to Bitwarden</string>
<string name="master_password_confirmation_val_message">Pasahitzaren baieztapena ez da zuzena.</string>
<string name="master_password_description">Pasahitz nagusia, kutxa gotorrera sartzeko erabiltzen duzun pasahitza da. Oso garrantzitsua da ez ahaztea, ahazten baduzu, ez dago pasahitza berreskuratzeko modurik.</string>
<string name="master_password_hint">Pasahitz nagusirako pista (aukerakoa)</string>
<string name="master_password_hint_description">Pasahitz nagusia ahazten baduzu, pista batek pasahitza gogoratzen lagunduko dizu.</string>
<string name="master_password_length_val_message_x">Pasahitz nagusiak %1$s karaktere izan behar ditu gutxienez.</string>
<plurals name="master_password_length_val_message_x">
<item quantity="one">Master password must be at least %d character long.</item>
<item quantity="other">Master password must be at least %d characters long.</item>
</plurals>
<string name="min_numbers">Gutxieneko zenbaki kopurua</string>
<string name="min_special">Gutxieneko karaktere bereziak</string>
<string name="never">Inoiz ez</string>
@@ -143,8 +146,8 @@
<string name="select">Hautatu</string>
<string name="item_details">Item details</string>
<string name="item_updated">Elementua eguneratu da.</string>
<string name="submitting">Bidaltzen...</string>
<string name="syncing">Sinkronizatzen...</string>
<string name="submitting">Submitting…</string>
<string name="syncing">Syncing…</string>
<string name="syncing_complete">Sinkronizatu da.</string>
<string name="two_step_login">Bi urratseko saio hasiera</string>
<string name="unlock_with_biometrics">Unlock with Biometrics</string>
@@ -163,7 +166,7 @@
<string name="search_for_a_login_or_add_a_new_login">Search for a login or add a new login</string>
<string name="disabled">Desgaitua</string>
<string name="bitwarden_autofill_service_alert2">Zure kutxa gotorrean saio hasiera berriak gehitzeko modurik errazena Bitwardenen automatikoki betetzeko zerbitzua erabiltzea da. Eskuratu informazio gehiago \"Ezarpenak\" eremuan.</string>
<string name="autofill">Automatikoki betetzea</string>
<string name="autofill_title">Autofill</string>
<string name="autofill_or_view">Elementu hau ikusi edo automatikoki bete nahi duzu?</string>
<string name="search">Bilatu</string>
<string name="learn_org">Erakundeak ezagutu</string>
@@ -182,7 +185,7 @@
<string name="add_new_attachment">Gehitu eranskin berria</string>
<string name="attachments">Eranskinak</string>
<string name="unable_to_download_file">Ezin da fitxategia deskargatu.</string>
<string name="downloading">Deskargatzen...</string>
<string name="downloading">Downloading…</string>
<string name="attachment_large_warning">Eranskin honek %1$s-eko tamaina du. Ziur al zaude zure gailuan deskargatu nahi duzula?</string>
<string name="authenticator_key">Autentifikazio-gakoa (TOTP)</string>
<string name="verification_code_totp">Egiaztatze-kodea (TOTP)</string>
@@ -308,7 +311,10 @@
<string name="personal_details">Personal Details</string>
<string name="contact_info">Contact Info</string>
<string name="check_password_for_data_breaches">Check password for data breaches</string>
<string name="password_exposed">Pasahitz hau %1$s aldiz datu-iragazketetan aurkitu da. Aldatu egin beharko zenuke.</string>
<plurals name="password_exposed">
<item quantity="one">This password has been exposed %d time in data breaches. You should change it.</item>
<item quantity="other">This password has been exposed %d times in data breaches. You should change it.</item>
</plurals>
<string name="password_safe">Pasahitz hau ez da inongo datu-filtrazio ezagunetan aurkitu. Erabiltzea segurua izan beharko luke.</string>
<string name="identity_name">Identitate izena</string>
<string name="value">Balioa</string>
@@ -392,10 +398,10 @@
<string name="save_attachment_success">Eranskina ondo atxiki da</string>
<string name="autofill_tile_accessibility_required">Mesedez, gaitu Bitwardeneko ezarpenetan \"automatikoki betetzeko erabilerraztasun zerbitzua\", automatikoki betetzea erabiltzeko.</string>
<string name="autofill_tile_uri_not_found">Ez da pasahitz eremurik detektatu</string>
<string name="soft_deleting">Zakarrontzira bidaltzen...</string>
<string name="soft_deleting">Sending to trash…</string>
<string name="item_soft_deleted">Elementua zakarrontzira bidali da.</string>
<string name="restore">Berreskuratu</string>
<string name="restoring">Berreskuratzen...</string>
<string name="restoring">Restoring…</string>
<string name="item_restored">Elementua berreskuratu da.</string>
<string name="trash">Zakarrontzia</string>
<string name="do_you_really_want_to_permanently_delete_cipher">Ziur al zaude betirako ezabatu nahi duzula? Eragiketa hau ezin da desegin.</string>
@@ -747,7 +753,10 @@ Kontu honetara aldatu nahi duzu?</string>
<string name="bitwarden_cannot_reset_a_lost_or_forgotten_master_password">Bitwarden cannot reset a lost or forgotten master password.</string>
<string name="choose_your_master_password">Choose your master password</string>
<string name="choose_a_unique_and_strong_password_to_keep_your_information_safe">Choose a unique and strong password to keep your information safe.</string>
<string name="minimum_characters">%1$s characters</string>
<plurals name="minimum_characters">
<item quantity="one">%d character</item>
<item quantity="other">%d characters</item>
</plurals>
<string name="expired_link">Expired link</string>
<string name="please_restart_registration_or_try_logging_in">Please restart registration or try logging in. You may already have an account.</string>
<string name="restart_registration">Restart registration</string>
@@ -800,7 +809,7 @@ Kontu honetara aldatu nahi duzu?</string>
<string name="need_help_check_out_import_help">Need help? Check out <annotation link="importHelp">import help</annotation>.</string>
<string name="save_the_exported_file_somewhere_on_your_computer_you_can_find_easily"><annotation emphasis="bold">Save the exported file</annotation> somewhere on your computer you can find easily.</string>
<string name="this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server">This is not a recognized Bitwarden server. You may need to check with your provider or update your server.</string>
<string name="syncing_logins_loading_message">Syncing logins...</string>
<string name="syncing_logins_loading_message">Syncing logins…</string>
<string name="download_the_browser_extension">Download the browser extension</string>
<string name="go_to_bitwarden_com_download_to_integrate_bitwarden_into_browser">Go to bitwarden.com/download to integrate Bitwarden into your favorite browser for a seamless experience.</string>
<string name="use_the_web_app">Use the web app</string>
@@ -909,7 +918,7 @@ Kontu honetara aldatu nahi duzu?</string>
<string name="no_folder">No folder</string>
<string name="show_less">Show less</string>
<string name="add_field">Add field</string>
<string name="x_ellipses">%s...</string>
<string name="x_ellipses">%s…</string>
<string name="share_error_details">Share error details</string>
<string name="flight_recorder">Flight recorder</string>
<string name="flight_recorder_help">Flight recorder help</string>
+23 -14
View File
@@ -12,7 +12,7 @@
<string name="copy_password">کپی کلمه عبور</string>
<string name="copy_username">کپی نام کاربری</string>
<string name="delete">حذف</string>
<string name="deleting">در حال حذف...</string>
<string name="deleting">Deleting…</string>
<string name="do_you_really_want_to_delete">آیا مطمئنید که می‌خواهید حذف کنید؟ این عمل قابل بازگشت نیست.</string>
<string name="edit">ویرایش</string>
<string name="edit_folder">ويرايش پوشه</string>
@@ -55,7 +55,7 @@
<string name="password">کلمه عبور</string>
<string name="save">ذخیره</string>
<string name="move">انتقال</string>
<string name="saving">درحال ذخیره...</string>
<string name="saving">Saving…</string>
<string name="settings">تنظیمات</string>
<string name="show">نمایش</string>
<string name="item_deleted">مورد حذف شد</string>
@@ -104,13 +104,16 @@
<string name="immediately">بلافاصله</string>
<string name="vault_timeout_log_out_confirmation_title">زمان پایان جلسه را روی «خروج» تنظیم کنید؟</string>
<string name="vault_timeout_log_out_confirmation_message">After the timeout period, you will be logged out. You will need to be connected to the internet to log in and access your vault again. Your settings and PIN saved on this device won\'t change.</string>
<string name="logging_in">در حال ورود...</string>
<string name="logging_in">Logging in…</string>
<string name="login_to_bitwarden">وارد Bitwarden شوید</string>
<string name="master_password_confirmation_val_message">تأیید کلمه عبور صحیح نیست.</string>
<string name="master_password_description">کلمه عبور اصلی، کلمه عبوری است که شما برای دسترسی به گاوصندوق خود استفاده می‌کنید. به یاد داشتن کلمه عبور اصلی بسیار اهمیت دارد. اگر فراموشش کنید هیچ راهی برای بازگردانی آن وجود ندارد.</string>
<string name="master_password_hint">یادآور کلمه عبور اصلی (اختیاری)</string>
<string name="master_password_hint_description">یادآور کلمه عبور اصلی کمک می‌کند در صورت فراموشی آن را به یاد بیارید.</string>
<string name="master_password_length_val_message_x">طول کلمه عبور اصلی باید حداقل %1$s کاراکتر باشد.</string>
<plurals name="master_password_length_val_message_x">
<item quantity="one">Master password must be at least %d character long.</item>
<item quantity="other">Master password must be at least %d characters long.</item>
</plurals>
<string name="min_numbers">حداقل اعداد</string>
<string name="min_special">حداقل حرف خاص</string>
<string name="never">هرگز</string>
@@ -143,8 +146,8 @@
<string name="select">انتخاب</string>
<string name="item_details">جزئیات مورد</string>
<string name="item_updated">مورد به‌روزرسانی شد</string>
<string name="submitting">در حال ثبت...</string>
<string name="syncing">در حال همگام‌سازی...</string>
<string name="submitting">Submitting…</string>
<string name="syncing">Syncing…</string>
<string name="syncing_complete">همگام‌سازی کامل شد.</string>
<string name="two_step_login">ورود دو مرحله‌ای</string>
<string name="unlock_with_biometrics">Unlock with Biometrics</string>
@@ -163,7 +166,7 @@
<string name="search_for_a_login_or_add_a_new_login">یک ورود را جستجو کنید یا یک ورود جدید اضافه کنید</string>
<string name="disabled">غیرفعال شد</string>
<string name="bitwarden_autofill_service_alert2">ساده‌ترین روش برای افزودن اطلاعات ورود به گاوصندوق‌تان استفاده از سرویس پر کردن خودکار Bitwarden است. با رفتن به صفحه \"تنظیمات\" درباره‌ی استفاده از سرویس پر کردن خودکار Bitwarden اطلاعات بیشتری کسب کنید.</string>
<string name="autofill">پر کردن خودکار</string>
<string name="autofill_title">Autofill</string>
<string name="autofill_or_view">آیا می‌خواهید این مورد را به صورت خودکار پر کنید یا مشاهده کنید؟</string>
<string name="search">جستجو</string>
<string name="learn_org">درباره سازمان‌ها اطلاعات کسب کنید</string>
@@ -182,7 +185,7 @@
<string name="add_new_attachment">افزودن پیوست جدید</string>
<string name="attachments">پیوست‌ها</string>
<string name="unable_to_download_file">نمی‌توان پرونده را بارگیری کرد.</string>
<string name="downloading">در حال بارگیری...</string>
<string name="downloading">Downloading…</string>
<string name="attachment_large_warning">حجم این پیوست %1$s است. آیا مایل به بارگیری این پرونده در دستگاه‌تان هستید؟</string>
<string name="authenticator_key">کلید احراز هویت (TOTP)</string>
<string name="verification_code_totp">کد تأیید (TOTP)</string>
@@ -309,7 +312,10 @@
<string name="personal_details">جزئیات شخصی</string>
<string name="contact_info">اطلاعات تماس</string>
<string name="check_password_for_data_breaches">بررسی کلمه عبور برای افشا داده</string>
<string name="password_exposed">این کلمه عبور %1$s بار در نقض‌های داده افشا شده است. بهتر است آن را تغییر دهید.</string>
<plurals name="password_exposed">
<item quantity="one">This password has been exposed %d time in data breaches. You should change it.</item>
<item quantity="other">This password has been exposed %d times in data breaches. You should change it.</item>
</plurals>
<string name="password_safe">این کلمه عبور در هیچ یک از نقض‌های داده شناخته شده یافت نشد. استفاده از آن باید ایمن باشد.</string>
<string name="identity_name">نام هویت</string>
<string name="value">مقدار</string>
@@ -393,10 +399,10 @@
<string name="save_attachment_success">پیوست با موفقیت ذخیره شد.</string>
<string name="autofill_tile_accessibility_required">لطفاً برای استفاده از کاشی پر کردن خودکار، \"سرویس دسترسی پر کردن خودکار\" را از تنظیمات Bitwarden فعال کنید.</string>
<string name="autofill_tile_uri_not_found">هیچ فیلدی برای کلمه عبور شناسایی نشد</string>
<string name="soft_deleting">درحال ارسال به سطل زباله...</string>
<string name="soft_deleting">Sending to trash…</string>
<string name="item_soft_deleted">مورد به سطل زباله فرستاده شد.</string>
<string name="restore">بازیابی</string>
<string name="restoring">درحال بازیابی…</string>
<string name="restoring">Restoring…</string>
<string name="item_restored">مورد بازیابی شد</string>
<string name="trash">سطل زباله</string>
<string name="do_you_really_want_to_permanently_delete_cipher">آیا مطمئنید که می‌خواهید برای همیشه حذف کنید؟ این عمل قابل بازگشت نیست.</string>
@@ -749,7 +755,10 @@
<string name="bitwarden_cannot_reset_a_lost_or_forgotten_master_password">Bitwarden نمی‌تواند کلمه عبور اصلی گمشده یا فراموش‌شده را بازنشانی کند.</string>
<string name="choose_your_master_password">کلمه عبور اصلی خود را انتخاب کنید</string>
<string name="choose_a_unique_and_strong_password_to_keep_your_information_safe">یک کلمه عبور منحصر به فرد و قوی انتخاب کنید تا اطلاعات شما امن بماند.</string>
<string name="minimum_characters">%1$s کاراکتر‌</string>
<plurals name="minimum_characters">
<item quantity="one">%d character</item>
<item quantity="other">%d characters</item>
</plurals>
<string name="expired_link">پیوند منقضی شد</string>
<string name="please_restart_registration_or_try_logging_in">لطفاً ثبت‌نام را دوباره آغاز کنید یا سعی کنید وارد حساب کاربری خود شوید. ممکن است از قبل حساب کاربری داشته باشید.</string>
<string name="restart_registration">ثبت‌نام را دوباره آغاز کنید</string>
@@ -802,7 +811,7 @@
<string name="need_help_check_out_import_help">نیاز به کمک دارید؟ به <annotation link="importHelp">راهنمای درون ریزی </annotation> مراجعه کنید.</string>
<string name="save_the_exported_file_somewhere_on_your_computer_you_can_find_easily"><annotation emphasis="bold">پرونده برون ریزی شده را ذخیره کنید</annotation> در مکانی روی رایانه‌تان که به‌راحتی بتوانید آن را پیدا کنید.</string>
<string name="this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server">این یک سرور معتبر Bitwarden نیست. ممکن است لازم باشد با ارائه‌دهنده خود بررسی کنید یا سرور را به‌روزرسانی نمایید.</string>
<string name="syncing_logins_loading_message">همگام‌سازی ورودها...</string>
<string name="syncing_logins_loading_message">Syncing logins…</string>
<string name="download_the_browser_extension">افزونه مرورگر را بارگیری کنید</string>
<string name="go_to_bitwarden_com_download_to_integrate_bitwarden_into_browser">به نشانی bitwarden.com/download بروید تا Bitwarden را در مرورگر مورد علاقه‌تان یکپارچه‌سازی کنید و تجربه‌ای روان داشته باشید.</string>
<string name="use_the_web_app">از برنامه وب استفاده کنید</string>
@@ -911,7 +920,7 @@
<string name="no_folder">بدون پوشه</string>
<string name="show_less">نمایش کمتر</string>
<string name="add_field">افزودن فیلد</string>
<string name="x_ellipses">%s...</string>
<string name="x_ellipses">%s…</string>
<string name="share_error_details">اشتراک‌گذاری جزئیات خطا</string>
<string name="flight_recorder">ضبط‌ کننده پرواز</string>
<string name="flight_recorder_help">راهنمای ضبط‌ کننده پرواز</string>
Loaded 100 of 144 files, more files were not shown because too many files have changed in this diff. Show more