mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
Compare commits
49 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c4cbd2e587 | ||
|
|
ad454c2e4a | ||
|
|
fbb03c3ecf | ||
|
|
1a4d963d53 | ||
|
|
0c58992c21 | ||
|
|
0eaeb3b90b | ||
|
|
fba8443d0a | ||
|
|
601874442c | ||
|
|
fa34618d67 | ||
|
|
a60fc83379 | ||
|
|
c2c9ebe4c7 | ||
|
|
fdd86e2b9e | ||
|
|
34f0f45862 | ||
|
|
c0345d4dc4 | ||
|
|
24e859c4ce | ||
|
|
1fff0c526c | ||
|
|
1ee1bb8d95 | ||
|
|
b8e996a5af | ||
|
|
df999002af | ||
|
|
64f5a4152b | ||
|
|
0af99d1830 | ||
|
|
733f337312 | ||
|
|
1f99b1f884 | ||
|
|
c3b5598a09 | ||
|
|
26cb36ccd0 | ||
|
|
67e0496efc | ||
|
|
6c4d040564 | ||
|
|
cb5a725d50 | ||
|
|
7007efa627 | ||
|
|
05defff5ef | ||
|
|
e4569662ba | ||
|
|
4727f7a761 | ||
|
|
89b15e715d | ||
|
|
ef72df02e3 | ||
|
|
b6201262f1 | ||
|
|
b99fa9ffcf | ||
|
|
1497ab85b2 | ||
|
|
2ade463974 | ||
|
|
0c1b94468d | ||
|
|
7a841bbf57 | ||
|
|
0066f1c77a | ||
|
|
14dbff603d | ||
|
|
42afa93293 | ||
|
|
2fa25a51ad | ||
|
|
2b7f41477f | ||
|
|
be0d5f80c3 | ||
|
|
3844188fcc | ||
|
|
ef81ba5a8f | ||
|
|
2871668d8f |
49
.github/ISSUE_TEMPLATE/bug_report.md
vendored
49
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -1,49 +0,0 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
|
||||
Steps to reproduce the behavior:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**KeePass Database**
|
||||
|
||||
- Created with: [e.g Windows KeePass 2.42]
|
||||
- Version: [e.g. 2]
|
||||
- Location: [e.g. Remote file retrieved with GDrive app]
|
||||
- File provider (`content://` URI): [e.g. `content://com.google.android.apps.docs.storage/5`]
|
||||
- Size: [e.g. 150Mo]
|
||||
- Contains attachment: [e.g. Yes]
|
||||
|
||||
**KeePassDX:**
|
||||
|
||||
- Version: [e.g. 2.5.0.0beta23]
|
||||
- Build: [e.g. Free]
|
||||
- Language: [e.g. French]
|
||||
|
||||
**Android:**
|
||||
|
||||
- Device: [e.g. GalaxyS8]
|
||||
- Version: [e.g. 8.1]
|
||||
|
||||
**Additional context**
|
||||
|
||||
Add any other context about the problem here.
|
||||
- Browser for Autofill: [e.g. Chrome version X]
|
||||
63
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
Normal file
63
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
name: Bug Report
|
||||
description: Report a bug.
|
||||
title: ""
|
||||
labels: bug
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Please check out the [Wiki](https://github.com/Kunzisoft/KeePassDX/wiki) and [existing issues](https://github.com/Kunzisoft/KeePassDX/issues?q=is%3Aissue%20state%3Aopen%20label%3Abug) to see if your problem has already been reported.
|
||||
- type: checkboxes
|
||||
id: checks
|
||||
attributes:
|
||||
label: Checks
|
||||
options:
|
||||
- label: I have read the Wiki, searched the open issues, and still think this is a new bug.
|
||||
required: true
|
||||
- type: textarea
|
||||
id: bug
|
||||
attributes:
|
||||
label: "Explain the problem clearly and succinctly:"
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: expected
|
||||
attributes:
|
||||
label: "Describe what you expected to happen:"
|
||||
- type: input
|
||||
id: app-version
|
||||
attributes:
|
||||
label: "KeePassDX version:"
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: app-build
|
||||
attributes:
|
||||
label: "Build:"
|
||||
multiple: true
|
||||
options:
|
||||
- Free
|
||||
- Libre
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: database-version
|
||||
attributes:
|
||||
label: "Database version:"
|
||||
- type: input
|
||||
id: file-provider
|
||||
attributes:
|
||||
label: "File provider (`content://` URI)"
|
||||
- type: input
|
||||
id: android-version
|
||||
attributes:
|
||||
label: "Android version:"
|
||||
- type: input
|
||||
id: android-device
|
||||
attributes:
|
||||
label: "Android device:"
|
||||
- type: textarea
|
||||
id: additional-context
|
||||
attributes:
|
||||
label: "Additional context:"
|
||||
|
||||
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -1,20 +0,0 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: feature
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
34
.github/ISSUE_TEMPLATE/feature_request.yaml
vendored
Normal file
34
.github/ISSUE_TEMPLATE/feature_request.yaml
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
name: Feature request
|
||||
description: Suggest an idea.
|
||||
title: ""
|
||||
labels: feature
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Please check out the [Wiki](https://github.com/Kunzisoft/KeePassDX/wiki) and [existing issues](https://github.com/Kunzisoft/KeePassDX/issues?q=is%3Aissue%20state%3Aopen%20label%3Afeature) to see if your feature has already been reported.
|
||||
- type: checkboxes
|
||||
id: checks
|
||||
attributes:
|
||||
label: Checks
|
||||
options:
|
||||
- label: I have read the Wiki, searched the open issues, and still think this is a new feature.
|
||||
required: true
|
||||
- type: textarea
|
||||
id: problem
|
||||
attributes:
|
||||
label: "Explain the problem clearly and succinctly:"
|
||||
- type: textarea
|
||||
id: solution
|
||||
attributes:
|
||||
label: "Describe the solution you'd like:"
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: alternatives
|
||||
attributes:
|
||||
label: "Describe alternatives you've considered:"
|
||||
- type: textarea
|
||||
id: additional-context
|
||||
attributes:
|
||||
label: "Additional context:"
|
||||
@@ -1,4 +1,9 @@
|
||||
KeePassDX(4.1.4)
|
||||
KeePassDX(4.1.6)
|
||||
* Auto open biometric prompt from database list #2113
|
||||
* Fix Keystore errors #2114 #2115
|
||||
* Complete biometric refactoring for better compatibility
|
||||
|
||||
KeePassDX(4.1.5)
|
||||
* Fix auto prompt #2111
|
||||
|
||||
KeePassDX(4.1.4)
|
||||
|
||||
@@ -11,8 +11,8 @@ android {
|
||||
applicationId "com.kunzisoft.keepass"
|
||||
minSdkVersion 15
|
||||
targetSdkVersion 34
|
||||
versionCode = 137
|
||||
versionName = "4.1.5"
|
||||
versionCode = 138
|
||||
versionName = "4.1.6"
|
||||
multiDexEnabled true
|
||||
|
||||
testApplicationId = "com.kunzisoft.keepass.tests"
|
||||
@@ -118,6 +118,7 @@ dependencies {
|
||||
implementation 'androidx.media:media:1.6.0'
|
||||
// Lifecycle - LiveData - ViewModel - Coroutines
|
||||
implementation "androidx.core:core-ktx:$android_core_version"
|
||||
implementation "androidx.lifecycle:lifecycle-process:2.6.2"
|
||||
implementation 'androidx.fragment:fragment-ktx:1.6.0'
|
||||
implementation "com.google.android.material:material:$android_material_version"
|
||||
// Token auto complete
|
||||
|
||||
@@ -174,10 +174,11 @@ class MainCredentialActivity : DatabaseModeActivity() {
|
||||
|
||||
// Listen password checkbox to init advanced unlock and confirmation button
|
||||
mainCredentialView?.onConditionToStoreCredentialChanged = { _, verified ->
|
||||
mDeviceUnlockViewModel.checkConditionToStoreCredential(
|
||||
condition = verified,
|
||||
databaseFileUri = mDatabaseFileUri
|
||||
)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
mDeviceUnlockViewModel.checkConditionToStoreCredential(
|
||||
condition = verified
|
||||
)
|
||||
}
|
||||
// TODO Async by ViewModel
|
||||
enableConfirmationButton()
|
||||
}
|
||||
@@ -231,31 +232,31 @@ class MainCredentialActivity : DatabaseModeActivity() {
|
||||
|
||||
lifecycleScope.launch {
|
||||
repeatOnLifecycle(Lifecycle.State.STARTED) {
|
||||
mDeviceUnlockViewModel.uiState.collect { uiState ->
|
||||
// New value received
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
mDeviceUnlockViewModel.uiState.collect { uiState ->
|
||||
// New value received
|
||||
uiState.credentialRequiredCipher?.let { cipher ->
|
||||
mDeviceUnlockViewModel.encryptCredential(
|
||||
credential = getCredentialForEncryption(),
|
||||
cipher = cipher
|
||||
)
|
||||
}
|
||||
}
|
||||
uiState.cipherEncryptDatabase?.let { cipherEncryptDatabase ->
|
||||
onCredentialEncrypted(cipherEncryptDatabase)
|
||||
mDeviceUnlockViewModel.consumeCredentialEncrypted()
|
||||
}
|
||||
uiState.cipherDecryptDatabase?.let { cipherDecryptDatabase ->
|
||||
onCredentialDecrypted(cipherDecryptDatabase)
|
||||
mDeviceUnlockViewModel.consumeCredentialDecrypted()
|
||||
}
|
||||
uiState.exception?.let { error ->
|
||||
Snackbar.make(
|
||||
coordinatorLayout,
|
||||
deviceUnlockError(error, this@MainCredentialActivity),
|
||||
Snackbar.LENGTH_LONG
|
||||
).asError().show()
|
||||
mDeviceUnlockViewModel.exceptionShown()
|
||||
uiState.cipherEncryptDatabase?.let { cipherEncryptDatabase ->
|
||||
onCredentialEncrypted(cipherEncryptDatabase)
|
||||
mDeviceUnlockViewModel.consumeCredentialEncrypted()
|
||||
}
|
||||
uiState.cipherDecryptDatabase?.let { cipherDecryptDatabase ->
|
||||
onCredentialDecrypted(cipherDecryptDatabase)
|
||||
mDeviceUnlockViewModel.consumeCredentialDecrypted()
|
||||
}
|
||||
uiState.exception?.let { error ->
|
||||
Snackbar.make(
|
||||
coordinatorLayout,
|
||||
deviceUnlockError(error, this@MainCredentialActivity),
|
||||
Snackbar.LENGTH_LONG
|
||||
).asError().show()
|
||||
mDeviceUnlockViewModel.exceptionShown()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -506,7 +507,9 @@ class MainCredentialActivity : DatabaseModeActivity() {
|
||||
loadDatabase()
|
||||
} else {
|
||||
// Init Biometric elements
|
||||
mDeviceUnlockViewModel.databaseFileLoaded(databaseFileUri)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
mDeviceUnlockViewModel.connect(databaseFileUri)
|
||||
}
|
||||
}
|
||||
|
||||
enableConfirmationButton()
|
||||
@@ -706,6 +709,13 @@ class MainCredentialActivity : DatabaseModeActivity() {
|
||||
return super.onOptionsItemSelected(item)
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
mDeviceUnlockViewModel.disconnect()
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
private val TAG = MainCredentialActivity::class.java.name
|
||||
|
||||
@@ -53,7 +53,6 @@ import com.kunzisoft.keepass.utils.closeDatabase
|
||||
import com.kunzisoft.keepass.utils.registerLockReceiver
|
||||
import com.kunzisoft.keepass.utils.unregisterLockReceiver
|
||||
import com.kunzisoft.keepass.view.showActionErrorIfNeeded
|
||||
import com.kunzisoft.keepass.viewmodels.DeviceUnlockViewModel.Companion.isAutoOpenBiometricPromptAllowed
|
||||
import com.kunzisoft.keepass.viewmodels.NodesViewModel
|
||||
import java.util.UUID
|
||||
|
||||
@@ -71,8 +70,6 @@ abstract class DatabaseLockActivity : DatabaseModeActivity(),
|
||||
protected var mMergeDataAllowed: Boolean = false
|
||||
private var mAutoSaveEnable: Boolean = true
|
||||
|
||||
private var isDatabaseUiVisible: Boolean = false
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
@@ -191,8 +188,6 @@ abstract class DatabaseLockActivity : DatabaseModeActivity(),
|
||||
mLockReceiver = LockReceiver {
|
||||
mDatabase = null
|
||||
closeDatabase(database)
|
||||
// Don't allow auto open prompt if lock become when UI visible
|
||||
isAutoOpenBiometricPromptAllowed = !isDatabaseUiVisible
|
||||
mExitLock = true
|
||||
closeOptionsMenu()
|
||||
finish()
|
||||
@@ -420,8 +415,6 @@ abstract class DatabaseLockActivity : DatabaseModeActivity(),
|
||||
}
|
||||
|
||||
invalidateOptionsMenu()
|
||||
|
||||
isDatabaseUiVisible = true
|
||||
}
|
||||
|
||||
protected fun checkTimeAndLockIfTimeoutOrResetTimeout(action: (() -> Unit)? = null) {
|
||||
@@ -436,8 +429,6 @@ abstract class DatabaseLockActivity : DatabaseModeActivity(),
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
isDatabaseUiVisible = false
|
||||
|
||||
super.onPause()
|
||||
|
||||
if (mTimeoutEnable) {
|
||||
|
||||
@@ -19,15 +19,54 @@
|
||||
*/
|
||||
package com.kunzisoft.keepass.app
|
||||
|
||||
import androidx.lifecycle.DefaultLifecycleObserver
|
||||
import androidx.lifecycle.LifecycleOwner
|
||||
import androidx.lifecycle.ProcessLifecycleOwner
|
||||
import androidx.multidex.MultiDexApplication
|
||||
import com.kunzisoft.keepass.activities.stylish.Stylish
|
||||
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.flow.asSharedFlow
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class App : MultiDexApplication() {
|
||||
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
|
||||
ProcessLifecycleOwner.get().lifecycle.addObserver(AppLifecycleObserver)
|
||||
|
||||
Stylish.load(this)
|
||||
PRNGFixes.apply()
|
||||
}
|
||||
}
|
||||
|
||||
object AppLifecycleObserver : DefaultLifecycleObserver {
|
||||
|
||||
var isAppInForeground: Boolean = false
|
||||
private set
|
||||
|
||||
var lockBackgroundEvent = false
|
||||
|
||||
private val _appJustLaunched = MutableSharedFlow<Unit>(replay = 0)
|
||||
val appJustLaunched = _appJustLaunched.asSharedFlow()
|
||||
|
||||
|
||||
@OptIn(DelicateCoroutinesApi::class)
|
||||
override fun onStart(owner: LifecycleOwner) {
|
||||
super.onStart(owner)
|
||||
val wasPreviouslyInBackground = !isAppInForeground
|
||||
isAppInForeground = true
|
||||
if (!lockBackgroundEvent && wasPreviouslyInBackground) {
|
||||
GlobalScope.launch {
|
||||
_appJustLaunched.emit(Unit)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onStop(owner: LifecycleOwner) {
|
||||
super.onStop(owner)
|
||||
isAppInForeground = false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,11 @@ data class DeviceUnlockCryptoPrompt(
|
||||
@StringRes var descriptionId: Int? = null,
|
||||
var isDeviceCredentialOperation: Boolean,
|
||||
var isBiometricOperation: Boolean
|
||||
)
|
||||
) {
|
||||
fun isOldCredentialOperation(): Boolean {
|
||||
return !isBiometricOperation && isDeviceCredentialOperation
|
||||
}
|
||||
}
|
||||
|
||||
enum class DeviceUnlockCryptoPromptType {
|
||||
CREDENTIAL_ENCRYPTION, CREDENTIAL_DECRYPTION
|
||||
|
||||
@@ -74,11 +74,13 @@ class DeviceUnlockFragment: Fragment() {
|
||||
} else {
|
||||
setAuthenticationFailed()
|
||||
}
|
||||
mDeviceUnlockViewModel.biometricPromptClosed()
|
||||
}
|
||||
|
||||
private var biometricAuthenticationCallback = object: BiometricPrompt.AuthenticationCallback() {
|
||||
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
|
||||
mDeviceUnlockViewModel.onAuthenticationSucceeded(result)
|
||||
mDeviceUnlockViewModel.biometricPromptClosed()
|
||||
}
|
||||
|
||||
override fun onAuthenticationFailed() {
|
||||
@@ -129,7 +131,7 @@ class DeviceUnlockFragment: Fragment() {
|
||||
activity?.addMenuProvider(menuProvider, viewLifecycleOwner)
|
||||
|
||||
viewLifecycleOwner.lifecycleScope.launch {
|
||||
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
|
||||
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {
|
||||
mDeviceUnlockViewModel.uiState.collect { uiState ->
|
||||
// Change mode
|
||||
toggleDeviceCredentialMode(uiState.newDeviceUnlockMode)
|
||||
@@ -173,7 +175,6 @@ class DeviceUnlockFragment: Fragment() {
|
||||
) {
|
||||
mDeviceUnlockViewModel.cryptoPrompt?.let { prompt ->
|
||||
when (state) {
|
||||
DeviceUnlockPromptMode.IDLE -> {}
|
||||
DeviceUnlockPromptMode.SHOW -> {
|
||||
openPrompt(prompt)
|
||||
mDeviceUnlockViewModel.promptShown()
|
||||
@@ -182,6 +183,7 @@ class DeviceUnlockFragment: Fragment() {
|
||||
cancelBiometricPrompt()
|
||||
mDeviceUnlockViewModel.biometricPromptClosed()
|
||||
}
|
||||
else -> {}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -338,15 +340,18 @@ class DeviceUnlockFragment: Fragment() {
|
||||
}
|
||||
|
||||
private fun setAuthenticationError(errorCode: Int, errString: CharSequence) {
|
||||
Log.e(TAG, "Biometric authentication error. Code : $errorCode Error : $errString")
|
||||
mDeviceUnlockViewModel.biometricPromptClosed()
|
||||
when (errorCode) {
|
||||
BiometricPrompt.ERROR_CANCELED,
|
||||
BiometricPrompt.ERROR_NEGATIVE_BUTTON,
|
||||
BiometricPrompt.ERROR_USER_CANCELED -> {
|
||||
// Ignore negative button
|
||||
// No operation
|
||||
Log.i(TAG, "$errString")
|
||||
}
|
||||
else ->
|
||||
else -> {
|
||||
Log.e(TAG, "Biometric authentication error. Code : $errorCode Error : $errString")
|
||||
mDeviceUnlockViewModel.setException(SecurityException(errString.toString()))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -357,16 +362,17 @@ class DeviceUnlockFragment: Fragment() {
|
||||
)
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
cancelBiometricPrompt()
|
||||
mDeviceUnlockViewModel.clear()
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
mDeviceUnlockView = null
|
||||
super.onDestroyView()
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
mDeviceUnlockViewModel.disconnect()
|
||||
super.onDestroy()
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val TAG = DeviceUnlockFragment::class.java.name
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ import android.os.Build
|
||||
import android.util.Log
|
||||
import androidx.core.content.ContextCompat
|
||||
import com.kunzisoft.keepass.R
|
||||
import com.kunzisoft.keepass.app.AppLifecycleObserver
|
||||
import com.kunzisoft.keepass.database.ContextualDatabase
|
||||
import com.kunzisoft.keepass.magikeyboard.MagikeyboardService
|
||||
import com.kunzisoft.keepass.services.ClipboardEntryNotificationService
|
||||
@@ -105,6 +106,7 @@ class LockReceiver(private var lockAction: () -> Unit) : BroadcastReceiver() {
|
||||
}
|
||||
LOCK_ACTION -> {
|
||||
lockAction.invoke()
|
||||
AppLifecycleObserver.lockBackgroundEvent = false
|
||||
if (PreferencesUtil.isKeyboardPreviousLockEnable(context)) {
|
||||
backToPreviousKeyboardAction?.invoke()
|
||||
} else {}
|
||||
|
||||
@@ -3,11 +3,12 @@ package com.kunzisoft.keepass.viewmodels
|
||||
import android.app.Application
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import androidx.activity.result.ActivityResult
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.biometric.BiometricManager
|
||||
import androidx.biometric.BiometricPrompt
|
||||
import androidx.lifecycle.AndroidViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.kunzisoft.keepass.app.AppLifecycleObserver
|
||||
import com.kunzisoft.keepass.app.database.CipherDatabaseAction
|
||||
import com.kunzisoft.keepass.biometric.DeviceUnlockCryptoPrompt
|
||||
import com.kunzisoft.keepass.biometric.DeviceUnlockCryptoPromptType
|
||||
@@ -20,11 +21,16 @@ import com.kunzisoft.keepass.model.CredentialStorage
|
||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.flow.update
|
||||
import javax.crypto.Cipher
|
||||
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.M)
|
||||
class DeviceUnlockViewModel(application: Application): AndroidViewModel(application) {
|
||||
private var cipherDatabaseListener: CipherDatabaseAction.CipherDatabaseListener? = null
|
||||
private var cipherDatabase: CipherEncryptDatabase? = null
|
||||
|
||||
private var isConditionToStoreCredentialVerified: Boolean = false
|
||||
|
||||
@@ -33,6 +39,9 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat
|
||||
|
||||
private var deviceUnlockMode = DeviceUnlockMode.BIOMETRIC_UNAVAILABLE
|
||||
var cryptoPrompt: DeviceUnlockCryptoPrompt? = null
|
||||
private set
|
||||
private var isAutoOpenBiometricPromptAllowed = true
|
||||
private var cryptoPromptShowPending: Boolean = false
|
||||
|
||||
// TODO Retrieve credential storage from app database
|
||||
var credentialDatabaseStorage: CredentialStorage = CredentialStorage.DEFAULT
|
||||
@@ -42,68 +51,60 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat
|
||||
private val _uiState = MutableStateFlow(DeviceUnlockState())
|
||||
val uiState: StateFlow<DeviceUnlockState> = _uiState
|
||||
|
||||
fun checkConditionToStoreCredential(condition: Boolean, databaseFileUri: Uri?) {
|
||||
isConditionToStoreCredentialVerified = condition
|
||||
checkUnlockAvailability(databaseFileUri)
|
||||
init {
|
||||
AppLifecycleObserver.appJustLaunched
|
||||
.onEach {
|
||||
isAutoOpenBiometricPromptAllowed = true
|
||||
checkUnlockAvailability()
|
||||
}
|
||||
.launchIn(viewModelScope)
|
||||
}
|
||||
|
||||
/**
|
||||
* Check unlock availability by verifying device settings and database mode
|
||||
*/
|
||||
fun checkUnlockAvailability() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
cipherDatabaseAction.containsCipherDatabase(databaseUri) { containsCipherDatabase ->
|
||||
if (PreferencesUtil.isBiometricUnlockEnable(getApplication())) {
|
||||
// biometric not supported (by API level or hardware) so keep option hidden
|
||||
// or manually disable
|
||||
val biometricCanAuthenticate = DeviceUnlockManager.canAuthenticate(getApplication())
|
||||
if (!PreferencesUtil.isAdvancedUnlockEnable(getApplication())
|
||||
|| biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE
|
||||
|| biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE) {
|
||||
changeMode(DeviceUnlockMode.BIOMETRIC_UNAVAILABLE)
|
||||
} else if (biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED) {
|
||||
changeMode(DeviceUnlockMode.BIOMETRIC_SECURITY_UPDATE_REQUIRED)
|
||||
} else {
|
||||
// biometric is available but not configured, show icon but in disabled state with some information
|
||||
if (biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED) {
|
||||
changeMode(DeviceUnlockMode.DEVICE_CREDENTIAL_OR_BIOMETRIC_NOT_CONFIGURED)
|
||||
} else {
|
||||
selectMode(containsCipherDatabase)
|
||||
}
|
||||
}
|
||||
} else if (PreferencesUtil.isDeviceCredentialUnlockEnable(getApplication())) {
|
||||
if (DeviceUnlockManager.isDeviceSecure(getApplication())) {
|
||||
selectMode(containsCipherDatabase)
|
||||
} else {
|
||||
changeMode(DeviceUnlockMode.DEVICE_CREDENTIAL_OR_BIOMETRIC_NOT_CONFIGURED)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
fun checkConditionToStoreCredential(condition: Boolean) {
|
||||
isConditionToStoreCredentialVerified = condition
|
||||
checkUnlockAvailability()
|
||||
}
|
||||
|
||||
/**
|
||||
* Check unlock availability and change the current mode depending of device's state
|
||||
*/
|
||||
fun checkUnlockAvailability(databaseFileUri: Uri?) {
|
||||
databaseUri = databaseFileUri
|
||||
checkUnlockAvailability()
|
||||
fun checkUnlockAvailability() {
|
||||
if (PreferencesUtil.isBiometricUnlockEnable(getApplication())) {
|
||||
// biometric not supported (by API level or hardware) so keep option hidden
|
||||
// or manually disable
|
||||
val biometricCanAuthenticate = DeviceUnlockManager.canAuthenticate(getApplication())
|
||||
if (!PreferencesUtil.isAdvancedUnlockEnable(getApplication())
|
||||
|| biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE
|
||||
|| biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE) {
|
||||
changeMode(DeviceUnlockMode.BIOMETRIC_UNAVAILABLE)
|
||||
} else if (biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED) {
|
||||
changeMode(DeviceUnlockMode.BIOMETRIC_SECURITY_UPDATE_REQUIRED)
|
||||
} else {
|
||||
// biometric is available but not configured, show icon but in disabled state with some information
|
||||
if (biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED) {
|
||||
changeMode(DeviceUnlockMode.DEVICE_CREDENTIAL_OR_BIOMETRIC_NOT_CONFIGURED)
|
||||
} else {
|
||||
changeMode()
|
||||
}
|
||||
}
|
||||
} else if (PreferencesUtil.isDeviceCredentialUnlockEnable(getApplication())) {
|
||||
if (DeviceUnlockManager.isDeviceSecure(getApplication())) {
|
||||
changeMode()
|
||||
} else {
|
||||
changeMode(DeviceUnlockMode.DEVICE_CREDENTIAL_OR_BIOMETRIC_NOT_CONFIGURED)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.M)
|
||||
fun selectMode(containsCipherDatabase: Boolean) {
|
||||
private fun changeMode() {
|
||||
try {
|
||||
if (isConditionToStoreCredentialVerified) {
|
||||
deviceUnlockManager = DeviceUnlockManager(getApplication())
|
||||
// listen for encryption
|
||||
changeMode(DeviceUnlockMode.STORE_CREDENTIAL)
|
||||
initEncryptData()
|
||||
} else if (containsCipherDatabase) {
|
||||
deviceUnlockManager = DeviceUnlockManager(getApplication())
|
||||
} else if (cipherDatabase != null) {
|
||||
// biometric available but no stored password found yet for this DB
|
||||
// listen for decryption
|
||||
changeMode(DeviceUnlockMode.EXTRACT_CREDENTIAL)
|
||||
initDecryptData()
|
||||
} else {
|
||||
// wait for typing
|
||||
changeMode(DeviceUnlockMode.WAIT_CREDENTIAL)
|
||||
@@ -114,12 +115,34 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat
|
||||
}
|
||||
}
|
||||
|
||||
fun connect(databaseUri: Uri) {
|
||||
private fun changeMode(deviceUnlockMode: DeviceUnlockMode) {
|
||||
this.deviceUnlockMode = deviceUnlockMode
|
||||
when (deviceUnlockMode) {
|
||||
DeviceUnlockMode.STORE_CREDENTIAL -> {
|
||||
initEncryptData()
|
||||
}
|
||||
DeviceUnlockMode.EXTRACT_CREDENTIAL -> {
|
||||
initDecryptData()
|
||||
}
|
||||
else -> {}
|
||||
}
|
||||
_uiState.update { currentState ->
|
||||
currentState.copy(
|
||||
newDeviceUnlockMode = deviceUnlockMode,
|
||||
allowAdvancedUnlockMenu = cipherDatabase != null
|
||||
&& deviceUnlockMode != DeviceUnlockMode.BIOMETRIC_UNAVAILABLE
|
||||
&& deviceUnlockMode != DeviceUnlockMode.KEY_MANAGER_UNAVAILABLE
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun connectDatabase(databaseUri: Uri) {
|
||||
this.databaseUri = databaseUri
|
||||
cipherDatabaseListener = object: CipherDatabaseAction.CipherDatabaseListener {
|
||||
override fun onCipherDatabaseCleared() {
|
||||
cipherDatabase = null
|
||||
closeBiometricPrompt()
|
||||
checkUnlockAvailability(databaseUri)
|
||||
checkUnlockAvailability()
|
||||
}
|
||||
}
|
||||
cipherDatabaseAction.apply {
|
||||
@@ -127,31 +150,50 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat
|
||||
cipherDatabaseListener?.let {
|
||||
registerDatabaseListener(it)
|
||||
}
|
||||
getCipherDatabase(databaseUri) { cipherDatabase ->
|
||||
cipherDatabase?.let {
|
||||
this@DeviceUnlockViewModel.cipherDatabase = it
|
||||
checkUnlockAvailability()
|
||||
} ?: deleteEncryptedDatabaseKey()
|
||||
}
|
||||
}
|
||||
checkUnlockAvailability(databaseUri)
|
||||
}
|
||||
|
||||
fun disconnect() {
|
||||
private fun showPendingIfNecessary() {
|
||||
// Reassign prompt state to open again if necessary
|
||||
if (cryptoPrompt?.isOldCredentialOperation() != true
|
||||
&& uiState.value.cryptoPromptState == DeviceUnlockPromptMode.IDLE_SHOW) {
|
||||
cryptoPromptShowPending = true
|
||||
}
|
||||
}
|
||||
|
||||
private fun disconnectDatabase() {
|
||||
this.databaseUri = null
|
||||
this.cipherDatabase = null
|
||||
cipherDatabaseListener?.let {
|
||||
cipherDatabaseAction.unregisterDatabaseListener(it)
|
||||
}
|
||||
reset()
|
||||
clearPrompt()
|
||||
changeMode(DeviceUnlockMode.BIOMETRIC_UNAVAILABLE)
|
||||
}
|
||||
|
||||
fun databaseFileLoaded(databaseUri: Uri?) {
|
||||
fun connect(databaseUri: Uri?) {
|
||||
// To get device credential unlock result, only if same database uri
|
||||
if (databaseUri != null
|
||||
&& PreferencesUtil.isAdvancedUnlockEnable(getApplication())) {
|
||||
if (databaseUri != this.databaseUri) {
|
||||
connect(databaseUri)
|
||||
connectDatabase(databaseUri)
|
||||
}
|
||||
} else {
|
||||
disconnect()
|
||||
disconnectDatabase()
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.M)
|
||||
fun disconnect() {
|
||||
showPendingIfNecessary()
|
||||
disconnectDatabase()
|
||||
}
|
||||
|
||||
fun onAuthenticationSucceeded() {
|
||||
cryptoPrompt?.let { prompt ->
|
||||
when (prompt.type) {
|
||||
@@ -163,7 +205,6 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.M)
|
||||
fun onAuthenticationSucceeded(
|
||||
result: BiometricPrompt.AuthenticationResult
|
||||
) {
|
||||
@@ -185,7 +226,6 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.M)
|
||||
fun encryptCredential(
|
||||
credential: ByteArray,
|
||||
cipher: Cipher?
|
||||
@@ -204,7 +244,7 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat
|
||||
this.specParameters = ivSpec
|
||||
}
|
||||
)
|
||||
}
|
||||
} ?: setException(UnknownDatabaseLocationException())
|
||||
}
|
||||
)
|
||||
} catch (e: Exception) {
|
||||
@@ -219,7 +259,6 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.M)
|
||||
fun decryptCredential(cipher: Cipher?) {
|
||||
// retrieve the encrypted value from preferences
|
||||
databaseUri?.let { databaseUri ->
|
||||
@@ -288,11 +327,15 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat
|
||||
autoOpen: Boolean = false
|
||||
) {
|
||||
this@DeviceUnlockViewModel.cryptoPrompt = cryptoPrompt
|
||||
if (autoOpen && PreferencesUtil.isAdvancedUnlockPromptAutoOpenEnable(getApplication()))
|
||||
if (cryptoPromptShowPending
|
||||
|| (autoOpen && PreferencesUtil.isAdvancedUnlockPromptAutoOpenEnable(getApplication())))
|
||||
showPrompt()
|
||||
}
|
||||
|
||||
fun showPrompt() {
|
||||
AppLifecycleObserver.lockBackgroundEvent = true
|
||||
isAutoOpenBiometricPromptAllowed = false
|
||||
cryptoPromptShowPending = false
|
||||
_uiState.update { currentState ->
|
||||
currentState.copy(
|
||||
cryptoPromptState = DeviceUnlockPromptMode.SHOW
|
||||
@@ -301,10 +344,9 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat
|
||||
}
|
||||
|
||||
fun promptShown() {
|
||||
isAutoOpenBiometricPromptAllowed = false
|
||||
_uiState.update { currentState ->
|
||||
currentState.copy(
|
||||
cryptoPromptState = DeviceUnlockPromptMode.IDLE
|
||||
cryptoPromptState = DeviceUnlockPromptMode.IDLE_SHOW
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -325,9 +367,9 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.M)
|
||||
private fun initEncryptData() {
|
||||
try {
|
||||
deviceUnlockManager = DeviceUnlockManager(getApplication())
|
||||
deviceUnlockManager?.initEncryptData { cryptoPrompt ->
|
||||
onPromptRequested(cryptoPrompt)
|
||||
} ?: setException(Exception("AdvancedUnlockManager not initialized"))
|
||||
@@ -336,38 +378,19 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.M)
|
||||
private fun initDecryptData() {
|
||||
databaseUri?.let { databaseUri ->
|
||||
cipherDatabaseAction.getCipherDatabase(databaseUri) { cipherDatabase ->
|
||||
cipherDatabase?.let {
|
||||
try {
|
||||
deviceUnlockManager?.initDecryptData(cipherDatabase.specParameters) { cryptoPrompt ->
|
||||
onPromptRequested(
|
||||
cryptoPrompt,
|
||||
autoOpen = isAutoOpenBiometricPromptAllowed
|
||||
)
|
||||
} ?: setException(Exception("AdvancedUnlockManager not initialized"))
|
||||
} catch (e: Exception) {
|
||||
setException(e)
|
||||
}
|
||||
} ?: deleteEncryptedDatabaseKey()
|
||||
}
|
||||
} ?: setException(UnknownDatabaseLocationException())
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.M)
|
||||
private fun changeMode(deviceUnlockMode: DeviceUnlockMode) {
|
||||
this.deviceUnlockMode = deviceUnlockMode
|
||||
cipherDatabaseAction.containsCipherDatabase(databaseUri) { containsCipher ->
|
||||
_uiState.update { currentState ->
|
||||
currentState.copy(
|
||||
newDeviceUnlockMode = deviceUnlockMode,
|
||||
allowAdvancedUnlockMenu = containsCipher
|
||||
&& deviceUnlockMode != DeviceUnlockMode.BIOMETRIC_UNAVAILABLE
|
||||
&& deviceUnlockMode != DeviceUnlockMode.KEY_MANAGER_UNAVAILABLE
|
||||
)
|
||||
}
|
||||
try {
|
||||
cipherDatabase?.let { cipherDb ->
|
||||
deviceUnlockManager = DeviceUnlockManager(getApplication())
|
||||
deviceUnlockManager?.initDecryptData(cipherDb.specParameters) { cryptoPrompt ->
|
||||
onPromptRequested(
|
||||
cryptoPrompt,
|
||||
autoOpen = isAutoOpenBiometricPromptAllowed
|
||||
)
|
||||
} ?: setException(Exception("AdvancedUnlockManager not initialized"))
|
||||
} ?: setException(Exception("Cipher database not initialized"))
|
||||
} catch (e: Exception) {
|
||||
setException(e)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -375,9 +398,9 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat
|
||||
closeBiometricPrompt()
|
||||
databaseUri?.let { databaseUri ->
|
||||
cipherDatabaseAction.deleteByDatabaseUri(databaseUri) {
|
||||
checkUnlockAvailability(databaseUri)
|
||||
checkUnlockAvailability()
|
||||
}
|
||||
} ?: checkUnlockAvailability(null)
|
||||
} ?: checkUnlockAvailability()
|
||||
_uiState.update { currentState ->
|
||||
currentState.copy(
|
||||
allowAdvancedUnlockMenu = false
|
||||
@@ -394,35 +417,32 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat
|
||||
}
|
||||
|
||||
fun biometricPromptClosed() {
|
||||
cryptoPrompt = null
|
||||
_uiState.update { currentState ->
|
||||
currentState.copy(
|
||||
cryptoPromptState = DeviceUnlockPromptMode.IDLE
|
||||
cryptoPromptState = DeviceUnlockPromptMode.IDLE_CLOSE
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun reset() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
changeMode(DeviceUnlockMode.BIOMETRIC_UNAVAILABLE)
|
||||
private fun clearPrompt() {
|
||||
cryptoPrompt = null
|
||||
deviceUnlockManager = null
|
||||
}
|
||||
|
||||
fun clear() {
|
||||
if (cryptoPrompt?.isOldCredentialOperation() != true) {
|
||||
clearPrompt()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCleared() {
|
||||
super.onCleared()
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
deviceUnlockManager = null
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
var isAutoOpenBiometricPromptAllowed = true
|
||||
clearPrompt()
|
||||
}
|
||||
}
|
||||
|
||||
enum class DeviceUnlockPromptMode {
|
||||
IDLE, SHOW, CLOSE
|
||||
IDLE_CLOSE, IDLE_SHOW, SHOW, CLOSE
|
||||
}
|
||||
|
||||
data class DeviceUnlockState(
|
||||
@@ -431,7 +451,7 @@ data class DeviceUnlockState(
|
||||
val credentialRequiredCipher: Cipher? = null,
|
||||
val cipherEncryptDatabase: CipherEncryptDatabase? = null,
|
||||
val cipherDecryptDatabase: CipherDecryptDatabase? = null,
|
||||
val cryptoPromptState: DeviceUnlockPromptMode = DeviceUnlockPromptMode.IDLE,
|
||||
val cryptoPromptState: DeviceUnlockPromptMode = DeviceUnlockPromptMode.IDLE_CLOSE,
|
||||
val autoOpenPrompt: Boolean = false,
|
||||
val exception: Exception? = null
|
||||
)
|
||||
@@ -77,7 +77,7 @@
|
||||
<string name="never">أبداً</string>
|
||||
<string name="no_results">لا توجد نتائج للبحث</string>
|
||||
<string name="no_url_handler">ثبت متصفح لزيارة هذا الرابط.</string>
|
||||
<string name="progress_create">إنشاء قاعدة بيانات جديدة …</string>
|
||||
<string name="progress_create">يُنشئ قاعدة بيانات جديدة …</string>
|
||||
<string name="protection">الحماية</string>
|
||||
<string name="read_only">محمي من التعديل</string>
|
||||
<string name="content_description_remove_from_list">أزل</string>
|
||||
@@ -101,11 +101,11 @@
|
||||
<string name="warning_no_encryption_key">أمتأكد أنك لا تريد استخدام أي مفتاح لتشفير ؟</string>
|
||||
<string name="version_label">الإصدار %1$s</string>
|
||||
<string name="education_new_node_title">أضف عناصر إلى قاعدة البيانات</string>
|
||||
<string name="education_entry_new_field_title">إضافة حقول مخصصة</string>
|
||||
<string name="education_field_copy_title">نسخ حقل</string>
|
||||
<string name="education_lock_title">تأمين قاعدة البيانات</string>
|
||||
<string name="education_entry_new_field_title">أضف حقول مخصّصة</string>
|
||||
<string name="education_field_copy_title">انسخ حقل</string>
|
||||
<string name="education_lock_title">اقفل قاعدة البيانات</string>
|
||||
<string name="feedback">أرسل انطباعاتك</string>
|
||||
<string name="about_description">\"KeePassDX\" هو تطبيق أندرويد لمدير كلمات المرور كي باس \"KeePass\"</string>
|
||||
<string name="about_description">\"KeePassDX\" هو تطبيق أندرويد لمدير كلمات السر كي باس \"KeePass\"</string>
|
||||
<string name="add_entry">أضف مدخل</string>
|
||||
<string name="edit_entry">عدّل مدخل</string>
|
||||
<string name="key_derivation_function">وظيفة اشتقاق المفتاح</string>
|
||||
@@ -154,8 +154,8 @@
|
||||
<string name="menu_url">الانتقال الى الرابط</string>
|
||||
<string name="menu_file_selection_read_only">محمي من التعديل</string>
|
||||
<string name="menu_open_file_read_and_write">قابل للتعديل</string>
|
||||
<string name="select_database_file">فتح مخزن موجود</string>
|
||||
<string name="create_keepass_file">انشاء مخزن جديد</string>
|
||||
<string name="select_database_file">افتح مخزن موجود</string>
|
||||
<string name="create_keepass_file">أنشئ مخزن جديد</string>
|
||||
<string name="progress_title">قيد العمل…</string>
|
||||
<string name="read_only_warning">KeePassDX يحتاج صلاحية الكتابة من اجل تعديل قاعدة البيانات.</string>
|
||||
<string name="encryption_explanation">خوارزمية تشفير جميع البيانات</string>
|
||||
@@ -212,7 +212,7 @@
|
||||
<string name="keyboard_keys_category">مفاتيح</string>
|
||||
<string name="keyboard_key_vibrate_title">إهتزاز عند اللمس</string>
|
||||
<string name="keyboard_key_sound_title">صوت عند اللمس</string>
|
||||
<string name="allow_no_password_title">إسمح بدون المفتاح الرئيسي</string>
|
||||
<string name="allow_no_password_title">اسمح بدون المفتاح الرئيسي</string>
|
||||
<string name="enable_read_only_title">محمي من التعديل</string>
|
||||
<string name="enable_read_only_summary">افتح قاعدة البيانات في وضع القراءة افتراضيا</string>
|
||||
<string name="enable_education_screens_title">تلميحات تعليمية</string>
|
||||
@@ -220,7 +220,7 @@
|
||||
<string name="reset_education_screens_text">إعادة تعيين الشاشات التلميحات</string>
|
||||
<string name="education_create_database_title">أنشئ قاعدة بيانات</string>
|
||||
<string name="education_create_database_summary">أنشئ ملف إدارة كلمات السر.</string>
|
||||
<string name="education_select_database_title">إفتح قاعدة بيانات</string>
|
||||
<string name="education_select_database_title">افتح قاعدة بيانات موجودة بالفعل</string>
|
||||
<string name="sort_recycle_bin_bottom">سلة المحذوفات في الأسفل</string>
|
||||
<string name="sort_db">ترتيب طبيعي</string>
|
||||
<string name="sort_last_access_time">الوصول</string>
|
||||
@@ -343,12 +343,12 @@
|
||||
<string name="database_opened">قاعدة البيانات مفتوحة</string>
|
||||
<string name="autofill_preference_title">إعدادات الملء التلقائي</string>
|
||||
<string name="education_entry_edit_title">عدّل المدخل</string>
|
||||
<string name="education_advanced_unlock_summary">لفتح قاعدة البيانات بسرعة اربط كلمة المرور بالبصمة.</string>
|
||||
<string name="education_search_summary">لإيجاد كلمة المرور، أدخل العنوان أو اسم المستخدم أو محتوى أحد الحقول.</string>
|
||||
<string name="education_advanced_unlock_summary">اربط كلمة سر ببياناتك البيومترية الممسوحة ضوئيًا أو بيانات اعتماد جهازك لفتح قفل قاعدة بياناتك بسرعة.</string>
|
||||
<string name="education_search_summary">لإيجاد كلمة السر، أدخل العنوان أو اسم المستخدم أو محتوى أحد الحقول.</string>
|
||||
<string name="education_new_node_summary">المدخلات لإدارة معرفاتك الرقمية.
|
||||
\n
|
||||
\nالمجموعات (المجلدات) لتنظيم المدخلات في قاعدة البيانات.</string>
|
||||
<string name="education_select_database_summary">لمتابعة استخدام قاعدة البيانات السابقة، افتحها من مدير الملفات.</string>
|
||||
<string name="education_select_database_summary">افتح ملف قاعدة البيانات السابق من متصفح ملفاتك لمتابعة استخدامه.</string>
|
||||
<string name="enable_auto_save_database_summary">حفظ قاعدة البيانات بعد كل إجراء (في وضع \"التعديل\")</string>
|
||||
<string name="enable_auto_save_database_title">الحفظ التلقائي لقاعدة البيانات</string>
|
||||
<string name="delete_entered_password_title">احذف كلمة السر</string>
|
||||
@@ -358,12 +358,9 @@
|
||||
<string name="autofill_application_id_blocklist_title">قائمة التطبيقات المحظورة</string>
|
||||
<string name="content_description_repeat_toggle_password_visibility">أعد تبديل ظهور كلمة السر</string>
|
||||
<string name="hide_expired_entries_summary">لا يتم عرض المدخلات منتهية الصلاحية</string>
|
||||
<string name="education_read_only_summary">تغيير وضع الافتتاح للجلسة.
|
||||
\n
|
||||
\nيمنع \"محمي ضد الكتابة\" التغييرات غير المقصودة في قاعدة البيانات.
|
||||
\n\"قابل للتعديل\" يتيح لك إضافة أو حذف أو تعديل جميع العناصر كما تريد.</string>
|
||||
<string name="education_read_only_title">احمي قاعدة البيانات من التعديل</string>
|
||||
<string name="education_unlock_title">افتح قاعدة البيانات</string>
|
||||
<string name="education_read_only_summary">غيّر وضع الافتتاح للجلسة. \n \nيمنع \"محمي ضد الكتابة\" التغييرات غير المقصودة في قاعدة البيانات. \n\"قابل للتعديل\" يتيح لك إضافة أو حذف أو تعديل جميع العناصر كما تريد.</string>
|
||||
<string name="education_read_only_title">احمِ قاعدة بياناتك من التعديل</string>
|
||||
<string name="education_unlock_title">افتح قاعدة بياناتك</string>
|
||||
<string name="education_add_attachment_summary">ارفع مرفقًا إلى مدخلك لحفظ البيانات الخارجية الهامة.</string>
|
||||
<string name="education_add_attachment_title">أضف مرفقا</string>
|
||||
<string name="autofill_block">احظر الملء التلقائي</string>
|
||||
@@ -519,7 +516,7 @@
|
||||
<string name="temp_advanced_unlock_timeout_title">انتهاء صلاحية فتح الحهاز</string>
|
||||
<string name="hide_expired_entries_title">أخفِ المدخلات منتهية الصلاحية</string>
|
||||
<string name="content_description_hardware_key_checkbox">خانة إختيار مفتاح العتاد</string>
|
||||
<string name="content_description_passphrase_word_count">عدد عبارات المرور</string>
|
||||
<string name="content_description_passphrase_word_count">عدد عبارات السر</string>
|
||||
<string name="content_description_entry_background_color">لون خلفية المدخل</string>
|
||||
<string name="passphrase">عبارة السر</string>
|
||||
<string name="colorize_password_title">لوّن كلمات السر</string>
|
||||
@@ -529,22 +526,22 @@
|
||||
<string name="advanced_unlock_not_recognized">تعذر التعرف على طباعة فتح الجهاز</string>
|
||||
<string name="temp_advanced_unlock_enable_title">فتح جهاز مؤقت</string>
|
||||
<string name="autofill_inline_suggestions_title">اقتراحات مضمنة</string>
|
||||
<string name="education_setup_OTP_summary">قم بإعداد إدارة كلمات المرور لمرة واحدة (HOTP / TOTP) لإنشاء رمز مميز مطلوب للمصادقة الثنائية (2FA).</string>
|
||||
<string name="education_setup_OTP_summary">أعِدّ إدارة كلمات السر لمرة واحدة (HOTP / TOTP) لإنشاء رمز مميز مطلوب لاستيثاق الثنائي (2FA).</string>
|
||||
<string name="education_field_copy_summary">يمكن لصق الحقول المنسوخة في أي مكان.
|
||||
\n
|
||||
\nاستخدم طريقة ملء النموذج التي تفضلها.</string>
|
||||
<string name="html_text_dev_feature_work_hard">نحن نعمل بجد لإصدار هذه الميزة بسرعة.</string>
|
||||
<string name="autofill_inline_suggestions_summary">حاول عرض اقتراحات الملء التلقائي مباشرة من لوحة مفاتيح متوافقة</string>
|
||||
<string name="delete_entered_password_summary">يحذف كلمة السر التي أُدخلت بعد محاولة الاتصال بقاعدة البيانات</string>
|
||||
<string name="education_lock_summary">اقفل قاعدةبياناتك بسرعة، يمكنك إعداد التطبيق لقفلها بعد فترة، وعند إيقاف تشغيل الشاشة.</string>
|
||||
<string name="education_lock_summary">اقفل قاعدة بياناتك بسرعة، يمكنك إعداد التطبيق لقفلها بعد فترة، وعند إيقاف تشغيل الشاشة.</string>
|
||||
<string name="education_sort_title">فرز العنصر</string>
|
||||
<string name="contribute">ساهِم</string>
|
||||
<string name="upload_attachment">ارفع %1$s</string>
|
||||
<string name="download_canceled">أُلغِيَ!</string>
|
||||
<string name="unit_kibibyte">كيلو بايت</string>
|
||||
<string name="unit_mebibyte">ميغا بايت</string>
|
||||
<string name="unit_gibibyte">جيجابت</string>
|
||||
<string name="entropy">إنتروبيا: %1$s بت</string>
|
||||
<string name="unit_kibibyte">ك.بايت</string>
|
||||
<string name="unit_mebibyte">م.بايت</string>
|
||||
<string name="unit_gibibyte">ج.بايت</string>
|
||||
<string name="entropy">الانتروبيا: %1$s بت</string>
|
||||
<string name="entropy_high">الانتروبيا: مرتفع</string>
|
||||
<string name="entropy_calculate">الانتروبيا: احسب…</string>
|
||||
<string name="exclude_ambiguous_chars">استبعاد الأحرف الغامضة</string>
|
||||
@@ -568,10 +565,10 @@
|
||||
<string name="download_finalization">جارِ الانتهاء…</string>
|
||||
<string name="download_complete">مكتمل!</string>
|
||||
<string name="unit_byte">B</string>
|
||||
<string name="icon_section_custom">مُخصص</string>
|
||||
<string name="icon_section_custom">مخصّص</string>
|
||||
<string name="content_description_entry_foreground_color">لون مقدمة الدخول</string>
|
||||
<string name="keyboard_previous_fill_in_summary">العودة تلقائيًا إلى لوحة المفاتيح السابقة بعد تنفيذ \"إجراء المفتاح التلقائي\"</string>
|
||||
<string name="download_attachment">تثبيت %1$s</string>
|
||||
<string name="download_attachment">ثبِّت %1$s</string>
|
||||
<string name="html_about_privacy"><strong> لا يتم استرداد أي بيانات مستخدم</strong>، هذا التطبيق لا يتصل بأي خادم، ويعمل محليًا فقط ويحترم خصوصية المستخدمين تمامًا.</string>
|
||||
<string name="error_cancel_by_user">أُلغِيَ بواسطة المستخدم.</string>
|
||||
<string name="show_otp_token_title">أظهر رمز OTP</string>
|
||||
@@ -582,7 +579,7 @@
|
||||
<string name="keyboard_auto_go_action_summary">إجراء مفتاح \"Go\" بعد الضغط على مفتاح \"Field\"</string>
|
||||
<string name="allow_no_password_summary">يسمح بالنقر فوق الزر \"فتح\" إذا لم يتم تحديد بيانات اعتماد</string>
|
||||
<string name="education_generate_password_summary">أنشئ كلمة سر قوية لربطها بإدخالك، وحددها بسهولة وفقًا لمعايير النموذج ولا تنسَ كلمة السر الآمنة.</string>
|
||||
<string name="education_setup_OTP_title">قم بإعداد OTP</string>
|
||||
<string name="education_setup_OTP_title">أعِدّ OTP</string>
|
||||
<string name="style_brightness_title">سطوع السمة</string>
|
||||
<string name="word_separator">الفاصل</string>
|
||||
<string name="screenshot_mode_banner_text">وضع لقطة الشاشة</string>
|
||||
@@ -638,7 +635,7 @@
|
||||
\nإذا لم تنشط هذا الإذن، فلن تكون قاعدة البيانات المفتوحة في الخلفية مرئية إذا كان هناك تطبيق آخر في المقدمة.</string>
|
||||
<string name="warning_copy_permission">مطلوب إذن الإشعار لاستخدام ميزة إشعار الحافظة.</string>
|
||||
<string name="merge_success">اكتمل الدمج بنجاح</string>
|
||||
<string name="advanced_unlock_prompt_store_credential_message">ما زلت بحاجة إلى تذكر بيانات الاعتماد الرئيسية في مخزنك إذا كنت تستخدم التعرف على فتح الجهاز.</string>
|
||||
<string name="advanced_unlock_prompt_store_credential_message">ما زلت بحاجة إلى تذكر بيانات الاعتماد الرئيسية في مخزنك إذا كنت تستخدم التعرّف على فتح الجهاز.</string>
|
||||
<string name="advanced_unlock_prompt_extract_credential_title">التعرف على فتح الجهاز</string>
|
||||
<string name="later">لاحقًا</string>
|
||||
<string name="configure">تضبيط</string>
|
||||
@@ -666,24 +663,22 @@
|
||||
<string name="education_entry_edit_summary">عدّل إدخالك مع الحقول المخصّصة. يمكن الرجوع إلى بيانات التجمع بين حقول مدخل المختلفة.</string>
|
||||
<string name="education_validate_entry_title">تحقق من صحة المدخل</string>
|
||||
<string name="education_validate_entry_summary">تذكر التحقق من صحة إدخالك وحفظ قاعدة بياناتك. \n \nإذا القفل التلقائي مُنشّط ونسيت أنك تجري تعديلاً، فإنك تخاطر بفقدان بياناتك.</string>
|
||||
<string name="education_entry_new_field_summary">قم بتسجيل حقل إضافي، أضف قيمة وقم بحمايته بشكل اختياري.</string>
|
||||
<string name="education_unlock_summary">أدخل كلمة المرور و/أو ملف المفتاح لفتح قاعدة بياناتك.
|
||||
\n
|
||||
\nقم بعمل نسخة احتياطية من ملف قاعدة البيانات في مكان آمن بعد كل تغيير.</string>
|
||||
<string name="education_entry_new_field_summary">سجِّل حقلاً إضافيًا، أضف قيمة، واحمها اختياريًا.</string>
|
||||
<string name="education_unlock_summary">أدخل كلمة السر و/أو ملف المفتاح لفتح قاعدة بياناتك. \n \nاحتفظ بنسخة احتياطية من ملف قاعدة البيانات في مكان آمن بعد كل تغيير.</string>
|
||||
<string name="html_text_dev_feature_thanks">شكرا جزيلا لمساهمتك.</string>
|
||||
<string name="at_least_one_char">على الأقل حرف واحد من كل منهما</string>
|
||||
<string name="html_text_dev_feature_upgrade">تذكر أن تحافظ على تحديث تطبيقك عن طريق تثبيت إصدارات جديدة.</string>
|
||||
<string name="download">تثبيت</string>
|
||||
<string name="html_text_ad_free">على عكس العديد من تطبيقات إدارة كلمات المرور ، فإن هذا التطبيق <strong>بدون إعلانات</strong>، و <strong>برنامج حر متروك الحقوق</strong> ولا يجمع البيانات الشخصية على خوادمه، بغض النظر عن الإصدار الذي تستخدمه.</string>
|
||||
<string name="html_text_ad_free">على عكس العديد من تطبيقات إدارة كلمات السر، هذا التطبيق <strong>خالٍ من الإعلانات</strong>، و<strong>برنامج حر متروك الحقوق</strong> ولا يجمع بيانات شخصية على خوادمه، بغض النظر عن الإصدار الذي تستخدمه.</string>
|
||||
<string name="download_initialization">جارِ التهيئة…</string>
|
||||
<string name="download_progression">قيد التقدم: %1$d%%</string>
|
||||
<string name="html_text_buy_pro">بشراء الإصدار الاحترافي، ستتمتع بإمكانية الوصول إلى هذا <strong> النمط المرئي</strong> وستساعد بشكل خاص في <strong> تنفيذ مشروعات المجتمع. </strong></string>
|
||||
<string name="html_text_donation">من خلال <strong>المساهمة</strong> في المشروع <i>(مالياً أو برمجياً أو ترجمة)</i>، ستساعده على الاستمرار في الحياة والازدهار، وستكون مؤهلاً أيضاً لإجراء فتح <strong>السمة</strong>.</string>
|
||||
<string name="html_text_donation">من خلال <strong>المساهمة</strong> في المشروع <i>(مالياً أو برمجياً أو ترجمة)</i>، ستساعده على الاستمرار في الحياة والازدهار، وستكون مؤهلاً أيضاً لإجراء فتح <strong>السمة</strong>.</string>
|
||||
<string name="html_text_dev_feature_encourage">أنت تشجع المطورين على إنشاء <strong> ميزات جديدة</strong> و <strong> إصلاح الخلل</strong> وفقًا لملاحظاتك.</string>
|
||||
<string name="style_name_forest">غابة</string>
|
||||
<string name="style_name_simple">بسيط</string>
|
||||
<string name="style_name_moon">قمر</string>
|
||||
<string name="style_name_divine">إلهي</string>
|
||||
<string name="style_name_divine">فائق</string>
|
||||
<string name="style_name_classic">كلاسيكي</string>
|
||||
<string name="style_name_dark">داكن</string>
|
||||
<string name="style_name_reply">رد</string>
|
||||
@@ -699,4 +694,5 @@
|
||||
<string name="recursive_number_entries_summary">يحسب بشكل متكرر عدد المدخلات في المجموعة</string>
|
||||
<string name="warning_large_keyfile">لا يُنصح بإضافة ملف مفتاحي كبير، فقد يؤدي هذا إلى منع فتح قاعدة البيانات.</string>
|
||||
<string name="hide_templates_title">أخفِ القوالب</string>
|
||||
<string name="error_otp_secret_length">يجب أن يتكوّن المفتاح السري من %1$d أحرف على الأقل.</string>
|
||||
</resources>
|
||||
|
||||
@@ -456,7 +456,7 @@
|
||||
<string name="html_text_dev_feature_upgrade">Не забравяйте да обновявате приложението.</string>
|
||||
<string name="html_text_dev_feature_encourage">вие поощрявате разработчиците да добавят <strong>нови възможности</strong> и да <strong>отстраняват дефекти</strong> според вашите отзиви.</string>
|
||||
<string name="html_text_buy_pro">Купувайки версията Pro ще имате достъп до тази <strong>тема</strong> и особено ще помогнете за <strong>изпълнението на проекти на общността</strong>.</string>
|
||||
<string name="html_text_donation">Като <strong>допринасяте</strong> за проекта <i>(финансово, с код или преводи)</i> му помагате да живее и процъвтява, а също получавате процедурата за отключване на <strong>темите</strong>.</string>
|
||||
<string name="html_text_donation">Като <strong>допринасяте</strong> за проекта <i>(финансово, с код или преводи)</i> му помагате да живее и процъвтява, а също получавате процедурата за отключване на <strong>темите</strong>.</string>
|
||||
<string name="hint_keyfile">Файл с ключ</string>
|
||||
<string name="invalid_algorithm">Грешен алгоритъм.</string>
|
||||
<string name="description_app_properties">Свойства за управление на настройките на KeePassDX</string>
|
||||
@@ -684,4 +684,5 @@
|
||||
<string name="warning_large_keyfile">Не се препоръчва използването на голям файл с ключ, защото може да попречи на отварянето на хранилището.</string>
|
||||
<string name="hide_templates_summary">Шаблоните не се показват</string>
|
||||
<string name="hide_templates_title">Скриване на шаблоните</string>
|
||||
<string name="error_otp_secret_length">Тайният ключ трябва да бъде най-малко %1$d знаци.</string>
|
||||
</resources>
|
||||
|
||||
@@ -659,7 +659,7 @@
|
||||
<string name="education_unlock_title">Desbloqueja la base de dades</string>
|
||||
<string name="education_setup_OTP_summary">Configureu la gestió de contrasenyes d\'un sol ús (HOTP / TOTP) per generar un testimoni sol·licitat per a l\'autenticació de dos factors (2FA).</string>
|
||||
<string name="education_field_copy_title">Copia un camp</string>
|
||||
<string name="html_text_donation">Al <strong>contribuir</strong> al projecte <i>(monetàriament, codi, traducció)</i>, l\'ajudareu a continuar vivint i prosperant, i també podreu optar al procediment de desbloqueig del <strong>tema</strong>.</string>
|
||||
<string name="html_text_donation">Al <strong>contribuir</strong> al projecte <i>(monetàriament, codi, traducció)</i>, l\'ajudareu a continuar vivint i prosperant, i també podreu optar al procediment de desbloqueig del <strong>tema</strong>.</string>
|
||||
<string name="upload_attachment">Puja %1$s</string>
|
||||
<string name="download_finalization">S\'està finalitzant…</string>
|
||||
<string name="entropy">Entropia: %1$s bit</string>
|
||||
|
||||
@@ -266,7 +266,7 @@
|
||||
<string name="html_text_ad_free">Na rozdíl od mnoha aplikací pro správu hesel je tato <strong>bez reklam</strong>, je <strong>svobodný software pod copyleft licencí</strong> a nesbírá žádné osobní údaje na svých serverech bez ohledu na to, jakou verzi používáte.</string>
|
||||
<string name="html_text_buy_pro">Zakoupením varianty \"pro\" získáte přístup k tomuto <strong>vizuálnímu stylu</strong> a hlavně pomůžete <strong>uskutečnění komunitních projektů.</strong></string>
|
||||
<string name="html_text_feature_generosity">Tento <strong>vizuální styl</strong> je k dispozici díky vaší štědrosti.</string>
|
||||
<string name="html_text_donation"><strong>Přispěním</strong> do projektu <i>(peněžně, kódem, překlady)</i> mu pomůžete žít a prosperovat a dostanete přístup k postupu odemčení <strong>motivů</strong>.</string>
|
||||
<string name="html_text_donation"><strong>Přispěním</strong> do projektu <i>(peněžně, kódem, překlady)</i> mu pomůžete žít a prosperovat a dostanete přístup k postupu odemčení <strong>motivů</strong>.</string>
|
||||
<string name="html_text_dev_feature">Tato funkce je <strong>ve vývoji</strong> a potřebuje Váš <strong>příspěvek</strong>, aby byla brzy k dispozici.</string>
|
||||
<string name="html_text_dev_feature_buy_pro">Zakoupením <strong>pro</strong> varianty,</string>
|
||||
<string name="html_text_dev_feature_contibute"><strong>Podpořením vývoje</strong>,</string>
|
||||
@@ -708,4 +708,5 @@
|
||||
<string name="warning_large_keyfile">Nedoporučuje se přidávat velký klíčový soubor, mohlo by to zabránit otevření databáze.</string>
|
||||
<string name="hide_templates_title">Skrýt šablony</string>
|
||||
<string name="hide_templates_summary">Šablony nejsou zobrazeny</string>
|
||||
<string name="error_otp_secret_length">Tajný klíč musí obsahovat alespoň %1$d znaků.</string>
|
||||
</resources>
|
||||
|
||||
@@ -253,7 +253,7 @@
|
||||
<string name="html_text_ad_free">Anders als viele Passwortmanager ist dieser <strong>werbefrei</strong>, <strong>quelloffen</strong>, <strong>freie Copyleft-Software</strong> und keine persönlichen Daten werden auf Servern gesammelt, egal welche Version man verwendet.</string>
|
||||
<string name="html_text_buy_pro">Mit dem Kauf der Pro-Version erhältst du Zugriff auf diesen <strong>visuellen Stil</strong> und unterstützt insbesondere <strong>die Umsetzung gemeinschaftlicher Projekte.</strong></string>
|
||||
<string name="html_text_feature_generosity">Dieser <strong>visuelle Stil</strong> ist dank deiner Großzügigkeit verfügbar.</string>
|
||||
<string name="html_text_donation">Mit <strong>Beitragen</strong> zum Projekt <i>(finanziell, Code, Übersetzung)</i> wird sichergestellt, dass es weiterlebt und gedeiht, und außerdem berechtigt das für den Vorgang der <strong>Design</strong>-Freischaltung.</string>
|
||||
<string name="html_text_donation">Mit <strong>Beitragen</strong> zum Projekt <i>(finanziell, Code, Übersetzung)</i> wird sichergestellt, dass es weiterlebt und gedeiht, und außerdem berechtigt das für den Vorgang der <strong>Design</strong>-Freischaltung.</string>
|
||||
<string name="html_text_dev_feature">Diese Funktion ist <strong>in Entwicklung</strong> und erfordert <strong>deinen Beitrag</strong>, um bald verfügbar zu sein.</string>
|
||||
<string name="html_text_dev_feature_buy_pro">Durch den Kauf der <strong>Pro-Version</strong>,</string>
|
||||
<string name="html_text_dev_feature_contibute">Durch deinen <strong>Beitrag</strong>,</string>
|
||||
@@ -280,10 +280,7 @@
|
||||
<string name="enable_read_only_title">Schreibgeschützt</string>
|
||||
<string name="education_read_only_title">Datenbank-Schreibschutz aktivieren</string>
|
||||
<string name="enable_read_only_summary">Datenbank standardmäßig schreibgeschützt öffnen</string>
|
||||
<string name="education_read_only_summary">Den Öffnungsmodus für die Sitzung ändern.
|
||||
\n
|
||||
\n„Schreibgeschützt“ verhindert unbeabsichtigte Änderungen.
|
||||
\nMit „Änderbar“ lässt sich jedes Element frei bearbeiten, hinzufügen oder löschen.</string>
|
||||
<string name="education_read_only_summary">Den Öffnungsmodus für die Sitzung ändern. \n \n„Schreibgeschützt“ verhindert unbeabsichtigte Änderungen an der Datenbank. \nMit „Änderbar“ lässt sich jedes Element frei bearbeiten, hinzufügen oder löschen.</string>
|
||||
<string name="edit_entry">Eintrag bearbeiten</string>
|
||||
<string name="error_load_database">Die Datenbank konnte nicht geladen werden.</string>
|
||||
<string name="error_load_database_KDF_memory">Laden des Schlüssels fehlgeschlagen. Bitte versuchen, die „Arbeitsspeichernutzung“ der Schlüsselableitungsfunktion zu verringern.</string>
|
||||
@@ -710,4 +707,5 @@
|
||||
<string name="warning_large_keyfile">Es wird nicht empfohlen, eine große Schlüsseldatei hinzuzufügen, da dies das Öffnen der Datenbank verhindern kann.</string>
|
||||
<string name="recursive_number_entries_title">Rekursive Anzahl der Einträge</string>
|
||||
<string name="generate_keyfile">Schlüsseldatei generieren</string>
|
||||
<string name="error_otp_secret_length">Geheimschlüssel muss mindestens %1$d Zeichen lang sein.</string>
|
||||
</resources>
|
||||
|
||||
@@ -233,7 +233,7 @@
|
||||
<string name="html_text_ad_free">Σε αντίθεση με πολλές άλλες εφαρμογές διαχείρισης κωδικών πρόσβασης, αυτή είναι <strong>χωρίς διαφημίσεις</strong>, <strong>copylefted libre λογισμικό</strong> και δεν συλλέγει προσωπικά δεδομένα στους διακομιστές της, ανεξάρτητα από την έκδοση που χρησιμοποιείτε.</string>
|
||||
<string name="html_text_buy_pro">Με την αγορά της επαγγελματικής έκδοσης, θα έχετε πρόσβαση σε αυτό το <strong>οπτικό στοιχείο</strong> και θα βοηθήσετε ιδιαίτερα την <strong>υλοποίηση ιδεών της κοινότητας.</strong></string>
|
||||
<string name="html_text_feature_generosity">Αυτό το <strong>οπτικό στυλ</strong> είναι διαθέσιμο χάρη στη γενναιοδωρία σας.</string>
|
||||
<string name="html_text_donation">Με τη <strong>συνεισφορά σας</strong> στο έργο <i>(χρηματικά, κώδικα, μετάφραση)</i>, θα το βοηθήσετε να συνεχίσει να ζει και να ευδοκιμεί και θα είστε επίσης επιλέξιμοι για τη διαδικασία ξεκλειδώματος <strong>θεμάτων </strong> .</string>
|
||||
<string name="html_text_donation">Με τη <strong>συνεισφορά σας</strong> στο έργο <i>(χρηματικά, κώδικα, μετάφραση)</i>, θα το βοηθήσετε να συνεχίσει να ζει και να ευδοκιμεί και θα είστε επίσης επιλέξιμοι για τη διαδικασία ξεκλειδώματος <strong>θεμάτων </strong> .</string>
|
||||
<string name="html_text_dev_feature">Αυτή η λειτουργία είναι <strong>υπό ανάπτυξη</strong> και απαιτεί την <strong>συνεισφοράς</strong> σας για να είναι σύντομα διαθέσιμη.</string>
|
||||
<string name="html_text_dev_feature_buy_pro">Με την αγορά της έκδοσης <strong>pro</strong>,</string>
|
||||
<string name="html_text_dev_feature_contibute">Με την <strong>συνεισφορά</strong> σας,</string>
|
||||
@@ -707,4 +707,5 @@
|
||||
<string name="warning_large_keyfile">Δεν συνιστάται η προσθήκη μεγάλου αρχείου κλειδιού, αυτό μπορεί να εμποδίσει το άνοιγμα της βάσης δεδομένων.</string>
|
||||
<string name="hide_templates_summary">Τα πρότυπα δεν εμφανίζονται</string>
|
||||
<string name="recursive_number_entries_title">Αναδρομικός αριθμός καταχωρήσεων</string>
|
||||
<string name="error_otp_secret_length">Το μυστικό κλειδί πρέπει να έχει τουλάχιστον %1$d χαρακτήρες.</string>
|
||||
</resources>
|
||||
@@ -239,7 +239,7 @@
|
||||
<string name="html_text_ad_free">A diferencia de muchas aplicaciones de administración de contraseñas, esta es <strong>sin anuncios</strong>, <strong>software libre de copylefted</strong> y no recopila datos personales en sus servidores, sin importar la versión que use.</string>
|
||||
<string name="html_text_buy_pro">Al comprar la versión Pro, tendrá acceso a este <strong>estilo visual</strong> y ayudará especialmente <strong>la realización de proyectos comunitarios.</strong></string>
|
||||
<string name="html_text_feature_generosity">Este <strong>estilo visual</strong> está disponible gracias a su generosidad.</string>
|
||||
<string name="html_text_donation">Al <strong>colaborar</strong> en el proyecto <i>(monetariamente, código, traducción)</i>, ayudará a que siga existiendo y prosperando, y también será la elección para el procedimiento de desbloqueo del <strong>tema</strong>.</string>
|
||||
<string name="html_text_donation">Al <strong>colaborar</strong> en el proyecto <i>(monetariamente, código, traducción)</i>, ayudará a que siga existiendo y prosperando, y también será la elección para el procedimiento de desbloqueo del <strong>tema</strong>.</string>
|
||||
<string name="html_text_dev_feature">Esta función está <strong>en desarrollo</strong> y requiere de tu <strong>contribución</strong> para estar disponible dentro de poco.</string>
|
||||
<string name="html_text_dev_feature_buy_pro">Al comprar la versión <strong>Pro</strong>,</string>
|
||||
<string name="html_text_dev_feature_contibute">Al <strong>contribuir</strong>,</string>
|
||||
|
||||
@@ -661,8 +661,9 @@
|
||||
<string name="enter">Sisestusklahv (Enter)</string>
|
||||
<string name="education_validate_entry_summary">Ära unusta kirje sisu kontrollida ja salvestada.\n\nKui automaatne lukustus käivitub ja sa unustad, et muutmine oli pooleli, siis võid kaotada oma muudatused.</string>
|
||||
<string name="html_text_ad_free">Erinevalt paljudest teistest salasõnahalduritest, on meie oma <strong>reklaamivaba</strong> ja <strong>avatud lähtekoodiga vaba tarkvara</strong>, mis ei kogu kasutajate isiklikke andmeid oma serveritesse ja seda kõikide versioonide puhul.</string>
|
||||
<string name="html_text_donation"><strong>Aidates kaasa</strong> selle projekti tegevusele <i>(rahaliselt, koodi kirjutades või tõlkides)</i>, aitad kogu ettevõtmisel areneda ning soovi korral võid kasutada ka <strong>seda kujundust</strong>.</string>
|
||||
<string name="html_text_donation"><strong>Aidates kaasa</strong> selle projekti tegevusele <i>(rahaliselt, koodi kirjutades või tõlkides)</i>, aitad kogu ettevõtmisel areneda ning soovi korral võid kasutada ka <strong>seda kujundust</strong>.</string>
|
||||
<string name="advanced_unlock_keystore_warning">See funktsionaalsus salvestab krüptitud salasõnad ja kasutajanimed sinu nutiseadme turvalises võtmehoidlas.\n\nSõltuvalt sinu nutiseadme operatsioonisüstemi konkreetsest implementatsioonist, ei pruugi see lahendus siiski täismahus toimida.\n\nPalun kontrolli oma seadme võtmehoidla (KeyStore) ühilduvust ja turvalisust tootjalt ja/või tarkvara loojalt.</string>
|
||||
<string name="keyboard_previous_fill_in_summary">Peale tegevust „Automaatne võtmetoiming“ lülita automaatselt tagasi eelmisele klahvistikule</string>
|
||||
<string name="education_read_only_summary">Saad juhtida sessioonil kasutatavat avamisviisi.\n\n„Kirjutuskaitstud“ tagab, et juhuslike muudatustega ei läheks andmeid kaotsi.\n„Muudetav“ võimaldab sul lisada, kustutada või muuta kõiki andmebaasi kirjeid.</string>
|
||||
<string name="error_otp_secret_length">Salavõti peab olema vähemalt %1$d tähemärki pikk.</string>
|
||||
</resources>
|
||||
|
||||
@@ -245,7 +245,7 @@
|
||||
<string name="html_text_ad_free">Contrairement à beaucoup d’applications de gestion de mots de passe, cette application est <strong>sans publicité</strong>, <strong>libre sous licence copyleft</strong> et ne collecte pas de données personnelles sur ses serveurs, peu importe la version que vous utilisez.</string>
|
||||
<string name="html_text_buy_pro">En achetant la version pro, vous aurez accès à ce <strong>style visuelle</strong> et vous aiderez notamment <strong>la réalisation de projets communautaires.</strong></string>
|
||||
<string name="html_text_feature_generosity">Ce <strong>style visuel</strong> est disponible grâce à votre générosité.</string>
|
||||
<string name="html_text_donation">En <strong>contribuant</strong> au projet <i>(financièrement, code, traduction)</i>, vous l\'aiderez à continuer à vivre et à prospérer, et vous serez également éligible à la procédure de déblocage du <strong>theme</strong>.</string>
|
||||
<string name="html_text_donation">En <strong>contribuant</strong> au projet <i>(financièrement, code, traduction)</i>, vous l\'aiderez à continuer à vivre et à prospérer, et vous serez également éligible à la procédure de déblocage du <strong>theme</strong>.</string>
|
||||
<string name="html_text_dev_feature">Cette fonctionnalité est <strong>en cours de développement</strong> et nécessite votre <strong>contribution</strong> pour être bientôt disponible.</string>
|
||||
<string name="html_text_dev_feature_buy_pro">En achetant la version <strong>pro</strong>,</string>
|
||||
<string name="html_text_dev_feature_contibute">En <strong>contribuant</strong>,</string>
|
||||
@@ -705,4 +705,5 @@
|
||||
<string name="warning_large_keyfile">Il n\'est pas recommandé d\'ajouter un fichier clé volumineux, car cela pourrait empêcher l\'ouverture de la base de données.</string>
|
||||
<string name="hide_templates_title">Cacher les gabarits</string>
|
||||
<string name="hide_templates_summary">Les gabarits ne sont pas affichés</string>
|
||||
<string name="error_otp_secret_length">La clé secrète doit avoir ai moins %1$d caractères.</string>
|
||||
</resources>
|
||||
|
||||
@@ -287,7 +287,7 @@
|
||||
<string name="html_text_ad_free">Számos más jelszókezelő alkalmazással ellentétben, ez egy <strong>reklámmentes</strong>, <strong>copyleft licencelésű szabad szoftver</strong>, amely nem gyűjt személyes adatokat a kiszolgálókon, bármelyik verziót is használja.</string>
|
||||
<string name="html_text_buy_pro">A pro verzió megvásárlásával hozzáférést kap ehhez a <strong>vizuális stílushoz</strong>, és segít a <strong>közösségi projektek megvalósulásában.</strong></string>
|
||||
<string name="html_text_feature_generosity">Ez a <strong>vizuális stílus</strong> az Ön nagylelkűségének köszönhetően érhető el.</string>
|
||||
<string name="html_text_donation">Azzal, hogy <strong>hozzájárul</strong> a projekthez <i>(pénzzel, kóddal, fordítással)</i>, segít abban, hogy a projekt tovább éljen és gyarapodjon, továbbá Ön jogosulttá válik a <strong>téma</strong>feloldásának lehetősége.</string>
|
||||
<string name="html_text_donation">Azzal, hogy <strong>hozzájárul</strong> a projekthez <i>(pénzzel, kóddal, fordítással)</i>, segít abban, hogy a projekt tovább éljen és gyarapodjon, továbbá Ön jogosulttá válik a <strong>téma</strong>feloldásának lehetősége.</string>
|
||||
<string name="html_text_dev_feature">Ez a funkció <strong>fejlesztés alatt áll</strong>, és az Ön <strong>támogatására</strong> van szükség, hogy hamarosan elérhető legyen.</string>
|
||||
<string name="html_text_dev_feature_buy_pro">A <strong>pro</strong> verzió megvásárlásával,</string>
|
||||
<string name="html_text_dev_feature_contibute">A <strong>támogatással</strong></string>
|
||||
@@ -707,4 +707,5 @@
|
||||
<string name="hide_templates_summary">A sablonok nem jelennek meg</string>
|
||||
<string name="generate_keyfile">Kulcsfájl előállítása</string>
|
||||
<string name="hide_templates_title">Sablonok elrejtése</string>
|
||||
<string name="error_otp_secret_length">A titkos kulcsnak legalább %1$d karakterből kell állnia.</string>
|
||||
</resources>
|
||||
|
||||
@@ -264,7 +264,7 @@
|
||||
<string name="html_text_ad_free">Diversamente da molte app di gestione password, questa è <strong>senza pubblicità</strong>, <strong>software libero (copyleft)</strong> e non raccoglie dati personali nei suoi server, non importa quale versione usi.</string>
|
||||
<string name="html_text_buy_pro">Acquistando la versione pro, avrai accesso a questo <strong>stile visivo</strong> e soprattutto aiuterai nella <strong>realizzazione dei progetti della comunità.</strong></string>
|
||||
<string name="html_text_feature_generosity">Questo <strong>stile visivo</strong> è disponibile grazie alla tua generosità.</string>
|
||||
<string name="html_text_donation">Se <strong>contribuirai</strong>al progretto <i>(tramite una donazione, del codice, una traduzione)</i>, lo aiuterai a vivere e a prosperare, e avrai a disposizione anche la procedura di sblocco del <strong>tema</strong>.</string>
|
||||
<string name="html_text_donation">Se <strong>contribuirai</strong>al progretto <i>(tramite una donazione, del codice, una traduzione)</i>, lo aiuterai a vivere e a prosperare, e avrai a disposizione anche la procedura di sblocco del <strong>tema</strong>.</string>
|
||||
<string name="html_text_dev_feature">Questa funzione è <strong>in sviluppo</strong> e richiede il tuo <strong>contributo</strong> per essere disponibile a breve.</string>
|
||||
<string name="html_text_dev_feature_buy_pro">Acquistando la versione <strong>pro</strong>,</string>
|
||||
<string name="html_text_dev_feature_contibute">
|
||||
@@ -710,4 +710,5 @@
|
||||
<string name="hide_templates_title">Nascondi template</string>
|
||||
<string name="recursive_number_entries_summary">Calcola in modo ricorsivo il numero di voci in un gruppo</string>
|
||||
<string name="hide_templates_summary">I template non vengono mostrati</string>
|
||||
<string name="error_otp_secret_length">La chiave segreta deve essere lunga almeno %1$d caratteri.</string>
|
||||
</resources>
|
||||
|
||||
@@ -653,7 +653,7 @@
|
||||
<string name="recursive_number_entries_summary">מחשב באופן רקורסיבי את מספר הרשומות בקבוצה</string>
|
||||
<string name="autofill_manual_selection_summary">הצג אפשרות לאפשר למשתמש לבחור ערך מסד נתונים</string>
|
||||
<string name="education_read_only_title">הגן על מסד הנתונים שלך מפני כתיבה</string>
|
||||
<string name="html_text_donation">על ידי <strong>תרומה</strong> לפרויקט <i>(כספית, קוד, תרגום)</i>, אתה תעזור לו להמשיך לחיות ולשגשג, ואתה גם תהיה זכאי להליך פתיחת <strong>ערכת נושא</strong>.</string>
|
||||
<string name="html_text_donation">על ידי <strong>תרומה</strong> לפרויקט <i>(כספית, קוד, תרגום)</i>, אתה תעזור לו להמשיך לחיות ולשגשג, ואתה גם תהיה זכאי להליך פתיחת <strong>ערכת נושא</strong>.</string>
|
||||
<string name="warning_empty_password">להמשיך ללא הגנת ביטול נעילה באמצעות סיסמה?</string>
|
||||
<string name="warning_file_too_big">מסד נתונים של KeePass אמור להכיל רק קבצי שירות קטנים (כגון קבצי מפתח PGP).\n\nמסד הנתונים שלך עשוי להפוך לגדול מאד ולהפחית ביצועים עם העלאה זו.</string>
|
||||
<string name="warning_exact_alarm">לא אפשרת ליישום להשתמש בהתראה מדויקת. כתוצאה מכך, התכונות שדורשות קוצב זמן לא יתבצעו עם זמן מדויק.</string>
|
||||
@@ -689,4 +689,5 @@
|
||||
<string name="education_setup_OTP_summary">הגדר ניהול סיסמה חד-פעמית (HOTP / TOTP) כדי לייצר אסימון המבוקש עבור אימות דו-גורמי (2FA).</string>
|
||||
<string name="html_text_buy_pro">על ידי קניית גרסת הפרו, תהיה לך גישה ל<strong>סגנון החזותי</strong> הזה ותעזור במיוחד עם <strong>ההגשמה של פרויקטים קהילתיים.</strong></string>
|
||||
<string name="html_text_dev_feature_buy_pro">על ידי קניית גרסת ה<strong>פרו</strong>,</string>
|
||||
<string name="error_otp_secret_length">מפתח סודי חייב להיות לפחות %1$d תווים.</string>
|
||||
</resources>
|
||||
|
||||
@@ -698,4 +698,5 @@
|
||||
<string name="style_name_kunzite">クンツァイト</string>
|
||||
<string name="hide_templates_title">テンプレートを非表示にする</string>
|
||||
<string name="hide_templates_summary">テンプレートは表示されません</string>
|
||||
<string name="error_otp_secret_length">秘密鍵は少なくとも %1$d 文字以上でないといけません。</string>
|
||||
</resources>
|
||||
|
||||
@@ -272,7 +272,7 @@
|
||||
<string name="html_text_ad_free">In tegenstelling tot veel apps voor wachtwoordbeheer, is deze <strong> reclamevrij</strong>, <strong> vrije software </strong> en verzamelt het geen persoonlijke gegevens op haar servers, ongeacht de versie die je gebruikt.</string>
|
||||
<string name="html_text_buy_pro">Door de pro-versie te kopen krijg je toegang tot dit <strong>visuele thema</strong> en draag je bij aan het <strong>realiseren van gemeenschapsprojecten.</strong></string>
|
||||
<string name="html_text_feature_generosity">Dit <strong>visuele thema</strong> is beschikbaar gemaakt dankzij jouw vrijgevigheid.</string>
|
||||
<string name="html_text_donation">Door <strong>bij te dragen</strong> aan het project <i>(financieel, code, vertaling)</i>, help je het om te blijven leven en bloeien en kom je bovendien in aanmerking voor het <strong>thema</strong> ontgrendelingsprocedure.</string>
|
||||
<string name="html_text_donation">Door <strong>bij te dragen</strong> aan het project <i>(financieel, code, vertaling)</i>, help je het om te blijven leven en bloeien en kom je bovendien in aanmerking voor het <strong>thema</strong> ontgrendelingsprocedure.</string>
|
||||
<string name="html_text_dev_feature">Deze functie <strong>wordt momenteel ontwikkeld</strong> en kan alleen beschikbaar komen middels jouw <strong>bijdrage</strong>.</string>
|
||||
<string name="html_text_dev_feature_buy_pro">Door de <strong>pro</strong>-versie te kopen,</string>
|
||||
<string name="html_text_dev_feature_contibute">Door <strong>bij te dragen</strong>,</string>
|
||||
@@ -709,4 +709,5 @@
|
||||
<string name="recursive_number_entries_title">Recursief aantal items</string>
|
||||
<string name="recursive_number_entries_summary">Berekent recursief het aantal items in een groep</string>
|
||||
<string name="warning_large_keyfile">Het is niet verstandig om een groot sleutelbestand toe te voegen, aangezien dit het openen van de database kan belemmeren.</string>
|
||||
<string name="error_otp_secret_length">Geheime sleutel moet minimaal %1$d tekens bevatten.</string>
|
||||
</resources>
|
||||
|
||||
@@ -267,7 +267,7 @@
|
||||
<string name="html_text_ad_free">W przeciwieństwie do wielu aplikacji do zarządzania hasłami, ta jest wolna od <strong>reklam</strong>, <strong>jest wolnym oprogramowaniem objętym klauzulą copyleft</strong> i nie zbiera danych osobowych na swoich serwerach, bez względu na to, jakiej wersji używasz.</string>
|
||||
<string name="html_text_buy_pro">Kupując wersję pro, będziesz mieć dostęp do <strong>stylu wizualnego</strong> a szczególnie pomożesz <strong> zrealizować projekty społecznościowe.</strong></string>
|
||||
<string name="html_text_feature_generosity">Ten <strong>styl wizualny</strong> jest dostępny dzięki Twojej hojności.</string>
|
||||
<string name="html_text_donation">Poprzez <strong>wsparcie</strong> projektu <i>(pieniężne, kodowanie, tłumaczenie)</i> pomożesz mu istnieć i rozwijać się, a także uzyskasz dostęp do procedury odblokowywania <strong>motywów</strong>.</string>
|
||||
<string name="html_text_donation">Poprzez <strong>wsparcie</strong> projektu <i>(pieniężne, kodowanie, tłumaczenie)</i> pomożesz mu istnieć i rozwijać się, a także uzyskasz dostęp do procedury odblokowywania <strong>motywów</strong>.</string>
|
||||
<string name="html_text_dev_feature">Ta funkcja jest <strong>rozwojowa</strong> i wymaga Twojego <strong>wkładu</strong>, aby być wkrótce dostępną.</string>
|
||||
<string name="html_text_dev_feature_buy_pro">Kupując wersję <strong>pro</strong>,</string>
|
||||
<string name="html_text_dev_feature_contibute">Przez <strong>przyczynianie się</strong>,</string>
|
||||
@@ -371,7 +371,7 @@
|
||||
<string name="device_keyboard_setting_title">Ustawienia klawiatury urządzenia</string>
|
||||
<string name="error_invalid_OTP">Nieprawidłowy klucz OTP.</string>
|
||||
<string name="error_disallow_no_credentials">Należy ustawić co najmniej jedno poświadczenie.</string>
|
||||
<string name="error_otp_secret_key">Klucz tajny musi być w formacie Base32.</string>
|
||||
<string name="error_otp_secret_key">Klucz tajny musi być w formacie Base32.</string>
|
||||
<string name="error_otp_counter">Licznik musi być między %1$d a %2$d.</string>
|
||||
<string name="error_otp_period">Okres musi wynosić od %1$d do %2$d sekund.</string>
|
||||
<string name="error_otp_digits">Token musi zawierać cyfry od %1$d do %2$d.</string>
|
||||
@@ -706,4 +706,5 @@
|
||||
<string name="recursive_number_entries_title">Rekurencyjna liczba wpisów</string>
|
||||
<string name="hide_templates_title">Ukryj szablony</string>
|
||||
<string name="hide_templates_summary">Szablony nie są wyświetlane</string>
|
||||
<string name="error_otp_secret_length">Klucz tajny musi składać się z co najmniej %1$d znaków.</string>
|
||||
</resources>
|
||||
|
||||
@@ -264,7 +264,7 @@
|
||||
<string name="html_text_ad_free">Ao contrário de muitos aplicativos de gerenciamento de senhas, este aplicativo é <strong>livre de anúncios</strong>, <strong>livre de direitos autorais</strong> e não coleta dados pessoais em seus servidores, mesmo em sua versão gratuita.</string>
|
||||
<string name="html_text_buy_pro">Ao comprar a versão Pro, você terá acesso a este <strong>recurso visual</strong> e ajudará especialmente a <strong>realização de projetos comunitários.</strong></string>
|
||||
<string name="html_text_feature_generosity">Este <strong>recurso visual</strong> está disponível graças à sua generosidade.</string>
|
||||
<string name="html_text_donation">Ao <strong>contribuir</strong> com o projeto <i>(monetariamente, código, tradução)</i>, você o ajudará a continuar vivo e a prosperar, e também estará qualificado para o procedimento de desbloqueio do <strong>tema</strong>.</string>
|
||||
<string name="html_text_donation">Ao <strong>contribuir</strong> com o projeto <i>(monetariamente, código, tradução)</i>, você o ajudará a continuar vivo e a prosperar, e também estará qualificado para o procedimento de desbloqueio do <strong>tema</strong>.</string>
|
||||
<string name="html_text_dev_feature">Esse recurso está <strong>em desenvolvimento</strong> e exige que sua <strong>contribuição</strong> para que esteja disponível em breve.</string>
|
||||
<string name="html_text_dev_feature_buy_pro">Ao comprar a versão <strong>pro</strong>,</string>
|
||||
<string name="html_text_dev_feature_contibute"><strong>Contribuindo </strong>,</string>
|
||||
|
||||
@@ -249,7 +249,7 @@
|
||||
<string name="html_text_ad_free">Ao contrário de muitas aplicações de gestão de palavras-passe, esta aplicação <strong>não tem anúncios</strong>, é <strong>um programa de código-fonte livre</strong> e não recolhe dados pessoais para os servidores dela, seja qual for a versão que utiliza.</string>
|
||||
<string name="html_text_buy_pro">Ao comprar a versão pro, terá acesso a este <strong>estilo visual</strong> e ajudará especialmente a <strong>realizar projetos comunitários.</strong></string>
|
||||
<string name="html_text_feature_generosity">Este <strong>estilo visual</strong> está disponível graças à sua generosidade.</string>
|
||||
<string name="html_text_donation">Ao <strong>contribuir</strong> para o projeto <i>(monetariamente, código, tradução)</i>, ajudá-lo-á a continuar a viver e prosperar, e também será elegível para o <strong>tema </strong> procedimento de desbloqueio.</string>
|
||||
<string name="html_text_donation">Ao <strong>contribuir</strong> para o projeto <i>(monetariamente, código, tradução)</i>, ajudá-lo-á a continuar a viver e prosperar, e também será elegível para o <strong>tema </strong> procedimento de desbloqueio.</string>
|
||||
<string name="html_text_dev_feature">Esta funcionalidade está <strong>em desenvolvimento</strong> e necessita da sua <strong>contribuição</strong> para que esteja disponível brevemente.</string>
|
||||
<string name="html_text_dev_feature_buy_pro">Ao comprar a versão <strong>pro</strong>,</string>
|
||||
<string name="html_text_dev_feature_contibute">Ao <strong>contribuir</strong>,</string>
|
||||
@@ -707,4 +707,5 @@
|
||||
<string name="warning_large_keyfile">Não é recomendado adicionar um ficheiro-chave grande, pois isso pode impedir a abertura do banco de dados.</string>
|
||||
<string name="hide_templates_title">Ocultar modelos</string>
|
||||
<string name="hide_templates_summary">Os modelos não são mostrados</string>
|
||||
<string name="error_otp_secret_length">Chave secreta deve ter pelo menos %1$d caracteres.</string>
|
||||
</resources>
|
||||
@@ -28,7 +28,7 @@
|
||||
<string name="html_text_dev_feature_contibute">Ao <strong>contribuir</strong>,</string>
|
||||
<string name="html_text_dev_feature_buy_pro">Ao comprar a versão <strong>pro</strong>,</string>
|
||||
<string name="html_text_dev_feature">Esta funcionalidade está <strong>em desenvolvimento</strong> e necessita da sua <strong>contribuição</strong> para que esteja disponível brevemente.</string>
|
||||
<string name="html_text_donation">Ao <strong>contribuir</strong> para o projeto <i>(monetariamente, código, tradução)</i>, você o ajudará a continuar a viver e prosperar, e também será elegível para o <strong>tema </strong> procedimento de desbloqueio.</string>
|
||||
<string name="html_text_donation">Ao <strong>contribuir</strong> para o projeto <i>(monetariamente, código, tradução)</i>, você o ajudará a continuar a viver e prosperar, e também será elegível para o <strong>tema </strong> procedimento de desbloqueio.</string>
|
||||
<string name="html_text_feature_generosity">Este <strong>estilo visual</strong> está disponível graças à sua generosidade.</string>
|
||||
<string name="html_text_buy_pro">Ao comprar a versão pro, terá acesso a este <strong>estilo visual</strong> e ajudará especialmente a <strong>realizar projetos comunitários.</strong></string>
|
||||
<string name="html_text_ad_free">Ao contrário de muitas aplicações de gestão de palavras-passe, esta aplicação <strong>não tem anúncios</strong>, é <strong>um programa de código-fonte livre</strong> e não recolhe dados pessoais para os servidores dela, seja qual for a versão que utiliza.</string>
|
||||
|
||||
@@ -268,7 +268,7 @@
|
||||
<string name="html_text_ad_free">В отличие от многих других приложений управления паролями, здесь <strong>нет рекламы</strong>, и оно <strong>свободно от лицензирования</strong>. Приложение не собирает ваши личные данные на своих серверах независимо от версии, которую вы используете.</string>
|
||||
<string name="html_text_buy_pro">Купите pro–версию и откройте доступ к этой <strong>теме</strong>. Покупая pro-версию, вы помогаете <strong>разработчикам открытого ПО.</strong></string>
|
||||
<string name="html_text_feature_generosity">Эти <strong>визуальные стили</strong> доступны благодаря вашей щедрости.</string>
|
||||
<string name="html_text_donation">Произведя <strong>вклад</strong> в проект <i>(в денежном выражении, программным кодом или переводом)</i>, вы поможете ему жить и процветать, а также получите право на разблокировку <strong>тем оформления</strong>.</string>
|
||||
<string name="html_text_donation">Произведя <strong>вклад</strong> в проект <i>(в денежном выражении, программным кодом или переводом)</i>, вы поможете ему жить и процветать, а также получите право на разблокировку <strong>тем оформления</strong>.</string>
|
||||
<string name="html_text_dev_feature">Эта функция находится <strong>в разработке</strong> и требует вашего <strong>участия</strong>, чтобы стать доступной в ближайшее время.</string>
|
||||
<string name="html_text_dev_feature_buy_pro">Покупая <strong>pro</strong>–версию,</string>
|
||||
<string name="html_text_dev_feature_contibute"><strong>Участвуя в проекте</strong>,</string>
|
||||
@@ -707,4 +707,5 @@
|
||||
<string name="warning_large_keyfile">Не рекомендуется добавлять большой ключевой файл, это может помешать открытию базы.</string>
|
||||
<string name="hide_templates_title">Скрывать шаблоны</string>
|
||||
<string name="hide_templates_summary">Не показывать шаблоны</string>
|
||||
<string name="error_otp_secret_length">Секретный ключ должен содержать не менее %1$d символов.</string>
|
||||
</resources>
|
||||
|
||||
@@ -640,7 +640,7 @@
|
||||
<string name="education_lock_summary">Rýchlo uzamknite svoju databázu, aplikáciu môžete nastaviť tak, aby sa po chvíli uzamkla a tiež, keď sa obrazovka vypne.</string>
|
||||
<string name="education_sort_title">Radenie položiek</string>
|
||||
<string name="education_donation_title">Zapojiť sa</string>
|
||||
<string name="html_text_donation"><strong>Príspevkom</strong> projektu <i>(peněžně, kódem, překlady)</i> mu pomôžete žiť a prosperovať a dostanete prístup k postupu odomknutia <strong>motívov</strong>.</string>
|
||||
<string name="html_text_donation"><strong>Príspevkom</strong> projektu <i>(peněžně, kódem, překlady)</i> mu pomôžete žiť a prosperovať a dostanete prístup k postupu odomknutia <strong>motívov</strong>.</string>
|
||||
<string name="html_text_dev_feature_buy_pro">Zakúpením verzie <strong>pro</strong></string>
|
||||
<string name="html_text_dev_feature_contibute">Ak <strong>prispejete</strong>,</string>
|
||||
<string name="html_text_dev_feature_thanks">Ďakujem pekne za prispevok.</string>
|
||||
|
||||
@@ -650,7 +650,7 @@
|
||||
<string name="autofill_block_restart">Rinisni aplikacionin që përmban formularin, që të aktivizohet bllokimi.</string>
|
||||
<string name="enable_education_screens_summary">Thekso elementë për të mësuar se si funksionon aplikacioni</string>
|
||||
<string name="reset_education_screens_summary">Shfaq sërish krejt informacionin edukativ</string>
|
||||
<string name="html_text_donation">Duke <strong>dhënë ndihmesë</strong> te projekti <i>(financiarisht, kod, përkthim)</i>, do ta ndihmoni të vazhdojë të jetojë dhe të lulëzojë dhe do të mund të përfitoni shkyçje <strong>teme</strong>.</string>
|
||||
<string name="html_text_donation">Duke <strong>dhënë ndihmesë</strong> te projekti <i>(financiarisht, kod, përkthim)</i>, do ta ndihmoni të vazhdojë të jetojë dhe të lulëzojë dhe do të mund të përfitoni shkyçje <strong>teme</strong>.</string>
|
||||
<string name="show_entry_colors_summary">Bën shfaqje ngjyrash të përparme dhe të pasme për një zë</string>
|
||||
<string name="settings_database_force_changing_master_key_summary">Kërko doemos ndryshimin e kyçit të përgjithshëm (ditë)</string>
|
||||
<string name="autofill_inline_suggestions_summary">Provo të shfaqësh sugjerime vetëplotësimi drejt e nga një tastierë e përputhshme</string>
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
<string name="digits">Siffror</string>
|
||||
<string name="html_about_licence">KeePassDX © %1$d Kunzisoft är <strong>öppen källkod</strong> och <strong>utan reklam</strong>.
|
||||
\nDen tillhandahålls i befintligt skick, under <strong>GPLv3-licens</strong>, utan någon garanti.</string>
|
||||
<string name="select_database_file">Öppna befintlig databas</string>
|
||||
<string name="select_database_file">Öppna befintligt valv</string>
|
||||
<string name="entry_accessed">Åtkomst</string>
|
||||
<string name="entry_cancel">Avbryt</string>
|
||||
<string name="entry_notes">Anteckningar</string>
|
||||
@@ -182,8 +182,8 @@
|
||||
<string name="sort_last_access_time">Åtkomst</string>
|
||||
<string name="warning">Varning</string>
|
||||
<string name="warning_password_encoding">Undvik lösenordstecken utöver textkodningsformatet i databasfilen (okända tecken konverteras till samma bokstav).</string>
|
||||
<string name="warning_empty_password">Är du säker på att du verkligen inte vill skydda dina lösenord från att låsas upp\?</string>
|
||||
<string name="warning_no_encryption_key">Är du säker på att du inte vill använda en krypteringsnyckel\?</string>
|
||||
<string name="warning_empty_password">Fortsätt utan lösenord för att låsa upp?</string>
|
||||
<string name="warning_no_encryption_key">Fortsätt utan en krypteringsnyckel?</string>
|
||||
<string name="encrypted_value_stored">Krypterat lösenord sparat</string>
|
||||
<string name="general">Generellt</string>
|
||||
<string name="autofill">Autofyll</string>
|
||||
@@ -205,7 +205,7 @@
|
||||
<string name="file_name">Filnamn</string>
|
||||
<string name="path">Sökväg</string>
|
||||
<string name="assign_master_key">Tilldela en huvudnyckel</string>
|
||||
<string name="create_keepass_file">Skapa ny databas</string>
|
||||
<string name="create_keepass_file">Skapa nytt valv</string>
|
||||
<string name="recycle_bin_title">Använd papperskorg</string>
|
||||
<string name="recycle_bin_summary">Flyttar grupper och poster till gruppen \"Papperskorg\" innan de raderas</string>
|
||||
<string name="monospace_font_fields_enable_title">Fält-typsnitt</string>
|
||||
@@ -328,7 +328,7 @@
|
||||
<string name="list_groups_show_number_entries_title">Visa antal poster</string>
|
||||
<string name="list_groups_show_number_entries_summary">Visa antalet poster i en grupp</string>
|
||||
<string name="error_create_database_file">Det går inte att skapa en databas med det här lösenordet och nyckelfil.</string>
|
||||
<string name="menu_advanced_unlock_settings">Avancerad upplåsning</string>
|
||||
<string name="menu_advanced_unlock_settings">Enhets upplåsning</string>
|
||||
<string name="unavailable">Den här databasen har inga sparade autentiseringsuppgifter ännu.</string>
|
||||
<string name="menu_appearance_settings">Utseende</string>
|
||||
<string name="biometric">Biometrik</string>
|
||||
@@ -362,7 +362,7 @@
|
||||
<string name="menu_security_settings">Säkerhetsinställningar</string>
|
||||
<string name="menu_master_key_settings">Inställningar för huvudnyckel</string>
|
||||
<string name="contains_duplicate_uuid">Databasen innehåller dubbla UUID:er.</string>
|
||||
<string name="contains_duplicate_uuid_procedure">Lös problemet genom att generera nya UUID-er för dubbletter för att fortsätta\?</string>
|
||||
<string name="contains_duplicate_uuid_procedure">Generera nya UUID-er för dubbletter för att fortsätta?</string>
|
||||
<string name="database_history">Historik</string>
|
||||
<string name="autofill_explanation_summary">Aktivera autofyll för att snabbt kunna fylla i formulär i andra appar</string>
|
||||
<string name="database_opened">Databas öppnad</string>
|
||||
@@ -388,10 +388,10 @@
|
||||
<string name="magic_keyboard_explanation_summary">Aktivera ett anpassat tangentbord som innehåller dina lösenord och alla identitetsfält</string>
|
||||
<string name="device_keyboard_setting_title">Enhetens tangentbordsinställningar</string>
|
||||
<string name="error_save_database">Kunde inte spara databasen.</string>
|
||||
<string name="menu_save_database">Spara databas</string>
|
||||
<string name="menu_save_database">Spara data</string>
|
||||
<string name="menu_empty_recycle_bin">Töm papperskorgen</string>
|
||||
<string name="command_execution">Utför kommandot …</string>
|
||||
<string name="warning_permanently_delete_nodes">Är du säker på att du vill radera de valda noderna permanent\?</string>
|
||||
<string name="warning_permanently_delete_nodes">Radera de valda noderna permanent?</string>
|
||||
<string name="keystore_not_accessible">Keystore har inte initierats korrekt.</string>
|
||||
<string name="recycle_bin_group_title">Papperskorgsgruppen</string>
|
||||
<string name="enable_auto_save_database_title">Autospara databas</string>
|
||||
@@ -501,4 +501,56 @@
|
||||
<string name="error_registration_read_only">Det är inte tillåtet att spara ett nytt objekt i en skrivskyddad databas.</string>
|
||||
<string name="error_field_name_already_exists">Fältnamnet finns redan.</string>
|
||||
<string name="auto_type">Auto-typ</string>
|
||||
<string name="error_file_to_big">Filen du försöker ladda upp är för stor.</string>
|
||||
<string name="error_upload_file">Ett fel inträffade när filens data laddades upp.</string>
|
||||
<string name="error_duplicate_file">Filens data existerar redan.</string>
|
||||
<string name="error_remove_file">Ett fel inträffade när filens data skulle raderas.</string>
|
||||
<string name="error_response_already_provided">Svar redan angett.</string>
|
||||
<string name="error_cancel_by_user">Avbrutet av användaren.</string>
|
||||
<string name="error_location_unknown">Databasens plats är inte känd, databasoperationen kunde inte genomföras.</string>
|
||||
<string name="error_hardware_key_unsupported">Stöd saknas för hårdvarunyckel.</string>
|
||||
<string name="error_empty_key">Nyckeln kan inte vara tom.</string>
|
||||
<string name="corrupted_file">Korrupt fil.</string>
|
||||
<string name="generate_keyfile">Generera nyckelfil</string>
|
||||
<string name="hint_icon_name">Ikonnamn</string>
|
||||
<string name="passphrase">Lösenordsfras</string>
|
||||
<string name="nodes">Noder</string>
|
||||
<string name="colorize_password_title">Färglägg lösenord</string>
|
||||
<string name="show_otp_token_title">Visa OTP token</string>
|
||||
<string name="show_otp_token_summary">Visa OTP token i post-listan</string>
|
||||
<string name="show_uuid_title">Visa UUID</string>
|
||||
<string name="error_otp_secret_length">Hemlighet måste vara minst %1$d tecken.</string>
|
||||
<string name="error_start_database_action">Ett fel inträffade under databasoperationen.</string>
|
||||
<string name="error_challenge_already_requested">Utmaning har redan efterfrågats.</string>
|
||||
<string name="error_driver_required">Drivrutin för %1$s krävs.</string>
|
||||
<string name="colorize_password_summary">Färglägg lösenordstecken per typ</string>
|
||||
<string name="menu_app_settings_summary">Sök, lås, historik, egenskaper</string>
|
||||
<string name="menu_form_filling_settings_summary">Tangentbord, autofill, urklipp</string>
|
||||
<string name="menu_advanced_unlock_settings_summary">Biometri, enhetsuppgifter</string>
|
||||
<string name="menu_database_settings_summary">Metadata, papperskorg, mallar, historik</string>
|
||||
<string name="master_key_settings_summary">Ändra, förnya</string>
|
||||
<string name="menu_merge_database">Sammanfoga data</string>
|
||||
<string name="menu_reload_database">Ladda om data</string>
|
||||
<string name="menu_merge_from">Sammanfoga från…</string>
|
||||
<string name="menu_save_copy_to">Spara en kopia till…</string>
|
||||
<string name="menu_keystore_remove_key">Radera enhetens upplåsningsnyckel</string>
|
||||
<string name="menu_external_icon">Extern ikon</string>
|
||||
<string name="subdomain_search_title">Subdomänsök</string>
|
||||
<string name="subdomain_search_summary">Sök webbdomän med subdomänbegränsning</string>
|
||||
<string name="search_mode">Sökläge</string>
|
||||
<string name="registration_mode">Registreringsläge</string>
|
||||
<string name="remember_hardware_key_title">Kom ihåg hårdvarunycklar</string>
|
||||
<string name="remember_hardware_key_summary">Kom ihåg hårdvarunycklar som används</string>
|
||||
<string name="import_app_properties_title">Importera appinställningar</string>
|
||||
<string name="import_app_properties_summary">Välj fil för att importera appinställningar</string>
|
||||
<string name="export_app_properties_title">Exportera appinställningar</string>
|
||||
<string name="export_app_properties_summary">Skapa en fil för att exportera appinställningar</string>
|
||||
<string name="description_app_properties">KeePassDX egenskaper för att hantera appinställningar</string>
|
||||
<string name="success_import_app_properties">Appinställningar importerade</string>
|
||||
<string name="error_import_app_properties">Fel inträffade när appinställningar importerades.</string>
|
||||
<string name="success_export_app_properties">Appinställningar exporterades</string>
|
||||
<string name="error_export_app_properties">Fel inträffade när appinställningar exporterades.</string>
|
||||
<string name="filter">Filter</string>
|
||||
<string name="warning_database_already_opened">En databas är redan öppen, stäng den för att öppna en ny</string>
|
||||
<string name="warning_empty_recycle_bin">Raders papperskorgens alla noder permanent?</string>
|
||||
</resources>
|
||||
@@ -661,7 +661,7 @@
|
||||
<string name="education_donation_summary">ச்திரத்தன்மை, பாதுகாப்பு மற்றும் கூடுதல் அம்சங்களைச் சேர்ப்பதில் அதிகரிக்க உதவுங்கள்.</string>
|
||||
<string name="html_text_ad_free">பல கடவுச்சொல் மேலாண்மை பயன்பாடுகளைப் போலன்றி, இது <strong> விளம்பர-இலவச </strong>, <strong> நகலெடுக்கப்பட்ட லிப்ரே மென்பொருள் </strong> மற்றும் நீங்கள் எந்த பதிப்பைப் பயன்படுத்தினாலும் அதன் சேவையகங்களில் தனிப்பட்ட தரவை சேகரிக்காது.</string>
|
||||
<string name="html_text_feature_generosity">இந்த <strong> விசுவல் பாணி </strong> உங்கள் தாராள மனப்பான்மைக்கு நன்றி.</string>
|
||||
<string name="html_text_donation">திட்டத்திற்கு <strong>பங்களிப்பு</strong> மூலம் <i>(பண ரீதியாக, குறியீடு, மொழிபெயர்ப்பு)</i>, நீங்கள் தொடர்ந்து வாழவும் வளரவும் உதவுவீர்கள், மேலும் நீங்கள் <strong>கருப்பொருளுக்கும்</strong> தகுதி பெறுவீர்கள்திறத்தல் செயல்முறை.</string>
|
||||
<string name="html_text_donation">திட்டத்திற்கு <strong>பங்களிப்பு</strong> மூலம் <i>(பண ரீதியாக, குறியீடு, மொழிபெயர்ப்பு)</i>, நீங்கள் தொடர்ந்து வாழவும் வளரவும் உதவுவீர்கள், மேலும் நீங்கள் <strong>கருப்பொருளுக்கும்</strong> தகுதி பெறுவீர்கள்திறத்தல் செயல்முறை.</string>
|
||||
<string name="upload_attachment">%1$s ஐ பதிவேற்றவும்</string>
|
||||
<string name="download_initialization">தொடங்குதல்…</string>
|
||||
<string name="download_progression">செயலில்:%1$d %%</string>
|
||||
|
||||
@@ -281,7 +281,7 @@
|
||||
<string name="html_text_ad_free">Birçok parola yönetimi uygulamasının aksine, bu uygulama <strong>reklam içermez</strong>, <strong> copyleft lisanslı özgür yazılımdır</strong> ve hangi sürümü kullanırsanız kullanın, sunucularında kişisel veri toplamaz.</string>
|
||||
<string name="html_text_buy_pro">Pro sürümü satın alarak, bu <strong>görsel stile</strong> erişebilecek ve özellikle <strong>topluluk projelerinin gerçekleştirilmesine yardımcı olacaksınız.</strong></string>
|
||||
<string name="html_text_feature_generosity">Bu <strong>görsel stil</strong>, cömertliğiniz sayesinde kullanılabilir.</string>
|
||||
<string name="html_text_donation">Projeye <i>(parasal, kod, çeviri)</i> <strong>katkıda bulunarak</strong>, projenin yaşamaya ve gelişmeye devam etmesine yardımcı olacaksınız ve ayrıca <strong>tema</strong> kilidini açmaya da hak kazanacaksınız.</string>
|
||||
<string name="html_text_donation">Projeye <i>(parasal, kod, çeviri)</i> <strong>katkıda bulunarak</strong>, projenin yaşamaya ve gelişmeye devam etmesine yardımcı olacaksınız ve ayrıca <strong>tema</strong> kilidini açmaya da hak kazanacaksınız.</string>
|
||||
<string name="html_text_dev_feature">Bu özellik <strong>geliştirme aşamasındadır</strong> ve <strong>katkılarınızın</strong> yakında kullanıma sunulmasını gerektirir.</string>
|
||||
<string name="html_text_dev_feature_buy_pro"><strong>Pro</strong> sürümü satın alarak,</string>
|
||||
<string name="html_text_dev_feature_contibute"><strong>Katkıda</strong> bulunarak,</string>
|
||||
@@ -702,4 +702,5 @@
|
||||
<string name="warning_large_keyfile">Büyük bir anahtar dosya eklenmesi önerilmez, bu durum veri tabanının açılmasını engelleyebilir.</string>
|
||||
<string name="hide_templates_title">Şablonları gizle</string>
|
||||
<string name="hide_templates_summary">Şablonlar gösterilmiyor</string>
|
||||
<string name="error_otp_secret_length">Gizli anahtar en az %1$d karakter uzunluğunda olmalıdır.</string>
|
||||
</resources>
|
||||
@@ -29,7 +29,7 @@
|
||||
<string name="application">Застосунок</string>
|
||||
<string name="menu_app_settings">Налаштування застосунку</string>
|
||||
<string name="brackets">Дужки</string>
|
||||
<string name="file_manager_install_description">Для створення, відкриття та збереження файлів баз даних потрібен файловий менеджер, який приймує дії Intent ACTION_CREATE_DOCUMENT та ACTION_OPEN_DOCUMENT.</string>
|
||||
<string name="file_manager_install_description">Для створення, відкриття та збереження файлів баз даних потрібен файловий менеджер, який приймає дії Intent ACTION_CREATE_DOCUMENT та ACTION_OPEN_DOCUMENT.</string>
|
||||
<string name="clipboard_cleared">Буфер обміну очищено</string>
|
||||
<string name="clipboard_timeout">Час до очищення буфера обміну</string>
|
||||
<string name="clipboard_timeout_summary">Тривалість зберігання в буфері обміну (якщо підтримується пристроєм)</string>
|
||||
@@ -268,7 +268,7 @@
|
||||
<string name="html_text_dev_feature_buy_pro">Купуючи версію <strong>pro</strong>,</string>
|
||||
<string name="html_text_dev_feature_contibute"><strong>Допомагаючи</strong>,</string>
|
||||
<string name="html_text_dev_feature">Ця функція ще <strong>розробляється</strong> та потребує вашої <strong>участі</strong>, щоб бути доступною якнайшвидше.</string>
|
||||
<string name="html_text_donation"><strong>Допомагаючи</strong> проєкту <i>(фінансово, кодом, перекладами)</i>, ви допоможете йому продовжувати існувати та процвітати, а також матимете право на процедуру розблокування <strong>теми</strong>.</string>
|
||||
<string name="html_text_donation"><strong>Допомагаючи</strong> проєкту <i>(фінансово, кодом, перекладами)</i>, ви допоможете йому продовжувати існувати та процвітати, а також матимете право на процедуру розблокування <strong>теми</strong>.</string>
|
||||
<string name="html_text_feature_generosity">Це <strong>оформлення стилю</strong> доступне завдяки вашій великодушності.</string>
|
||||
<string name="html_text_buy_pro">Купуючи версію Pro, ви отримуєте доступ до цих <strong>стилів оформлення</strong> та дуже допомагаєте <strong>розробці вільних проєктів.</strong></string>
|
||||
<string name="html_text_ad_free">На відміну від багатьох менеджерів паролів, цей є <strong>вільним від реклами</strong>, <strong>вільним програмним забезпеченням з copyleft</strong> та не збирає персональні дані на своїх серверах, незалежно від версії, якою ви користуєтесь.</string>
|
||||
@@ -616,7 +616,7 @@
|
||||
<string name="menu_merge_from">Об\'єднати з …</string>
|
||||
<string name="custom_data">Користувацькі дані</string>
|
||||
<string name="search_filters">Фільтри пошуку</string>
|
||||
<string name="auto_type_sequence">Послідовність автовведення</string>
|
||||
<string name="auto_type_sequence">Послідовність авто введення</string>
|
||||
<string name="menu_save_copy_to">Зберегти копію в …</string>
|
||||
<string name="expired">Термін дії завершився</string>
|
||||
<string name="warning_database_already_opened">База даних уже відкрита, спочатку закрийте її, щоб відкрити нову</string>
|
||||
@@ -707,4 +707,5 @@
|
||||
<string name="hide_templates_title">Сховати шаблони</string>
|
||||
<string name="hide_templates_summary">Шаблони не показано</string>
|
||||
<string name="warning_large_keyfile">Не рекомендується додавати великий файл ключа, це може завадити створенню бази даних.</string>
|
||||
<string name="error_otp_secret_length">Секретний ключ повинен містити не менше %1$d символів.</string>
|
||||
</resources>
|
||||
@@ -294,7 +294,7 @@
|
||||
<string name="html_text_ad_free">不同于大多数的密码管理应用,无论您是使用免费版本还是付费版本的 KeePassDX,这都是一款<strong>没有广告</strong>,<strong>基于 copylefted 版权协议的自由软件</strong>。同时,本软件的任何版本都不会收集您的任何个人信息。</string>
|
||||
<string name="html_text_buy_pro">通过购买高级版本,您将解锁全部<strong>主题样式</strong>,重要的是,您会为<strong>社区项目的进行</strong>提供帮助</string>
|
||||
<string name="html_text_feature_generosity">此<strong>主题样式</strong>已可用,感谢您的慷慨相助。</string>
|
||||
<string name="html_text_donation">通过多方面向本项目<strong>作贡献</strong>,可以是<i>(金钱、代码、翻译等)</i>,你将帮助本项目继续走下去并茁壮成长,并获得<strong>主题</strong>解锁步骤资格。</string>
|
||||
<string name="html_text_donation">通过多方面向本项目<strong>作贡献</strong>,可以是<i>(金钱、代码、翻译等)</i>,你将帮助本项目继续走下去并茁壮成长,并获得<strong>主题</strong>解锁步骤资格。</string>
|
||||
<string name="html_text_dev_feature">此功能目前<strong>仍在开发中</strong>,<strong>捐助</strong>将使该功能很快变得可用。</string>
|
||||
<string name="html_text_dev_feature_buy_pro">通过购买<strong>专业</strong>版,</string>
|
||||
<string name="html_text_dev_feature_contibute">通过<strong>贡献</strong>,</string>
|
||||
@@ -706,4 +706,5 @@
|
||||
<string name="hide_templates_title">隐藏模板</string>
|
||||
<string name="nodes">节点</string>
|
||||
<string name="recursive_number_entries_title">条目的递归数</string>
|
||||
<string name="error_otp_secret_length">密钥长度至少为 %1$d 个字符。</string>
|
||||
</resources>
|
||||
|
||||
@@ -329,7 +329,7 @@
|
||||
<string name="html_text_dev_feature_thanks">非常感謝你的捐助與貢獻。</string>
|
||||
<string name="html_text_dev_feature_upgrade">記得安裝最新版本來確保應用程式是最新的。</string>
|
||||
<string name="html_text_dev_feature_work_hard">我們正在努力的開發並盡快地發佈新功能。</string>
|
||||
<string name="html_text_donation">透過為專案<strong>作出貢獻</strong><i>(財政、代碼、翻譯)</i>,你將幫助其繼續發展,並且你也將有資格獲得<strong>主題</strong>解鎖步驟。</string>
|
||||
<string name="html_text_donation">透過為專案<strong>作出貢獻</strong><i>(財政、代碼、翻譯)</i>,你將幫助其繼續發展,並且你也將有資格獲得<strong>主題</strong>解鎖步驟。</string>
|
||||
<string name="html_text_feature_generosity">此<strong>主題樣式</strong>已可用,感謝你的慷慨相助。</string>
|
||||
<string name="icon_pack_choose_summary">應用程式使用的圖示包</string>
|
||||
<string name="icon_pack_choose_title">圖示包</string>
|
||||
|
||||
3
fastlane/metadata/android/en-US/changelogs/138.txt
Normal file
3
fastlane/metadata/android/en-US/changelogs/138.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
* Auto open biometric prompt from database list #2113
|
||||
* Fix Keystore errors #2114 #2115
|
||||
* Complete biometric refactoring for better compatibility
|
||||
3
fastlane/metadata/android/fr-FR/changelogs/138.txt
Normal file
3
fastlane/metadata/android/fr-FR/changelogs/138.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
* Ouverture auto de la prompt biometrique depuis la liste des bases #2113
|
||||
* Correction d'erreurs du Keystore #2114 #2115
|
||||
* Refactoring complet de l'invite biométrique pour une meilleure compatibilité
|
||||
1
fastlane/metadata/android/it-IT/title.txt
Normal file
1
fastlane/metadata/android/it-IT/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
KeePassDX - FOSS Password Safe
|
||||
23
fastlane/metadata/android/pl-PL/full_description.txt
Normal file
23
fastlane/metadata/android/pl-PL/full_description.txt
Normal file
@@ -0,0 +1,23 @@
|
||||
KeePassDX to <b>sejf i menedżer haseł</b>, który umożliwia edycję <b>zaszyfrowanych danych w jednym pliku</b> w otwartym formacie KeePass oraz <b>bezpieczne wypełnianie formularzy</b>. <b>Nie wymaga połączenia z internetem</b>, integruje standardy projektowania systemu Android. Aplikacja jest <b>otwartoźródłowa, bez reklam</b>.
|
||||
|
||||
<b>Funkcje</b>
|
||||
|
||||
– Tworzenie plików/wpisów i grup baz danych.
|
||||
– Obsługa plików .kdb i .kdbx (wersje od 1 do 4) z algorytmami AES, Twofish, ChaCha20 i Argon2.
|
||||
– Kompatybilność z większością alternatywnych programów (KeePass, KeePassXC, KeeWeb, …).
|
||||
– Możliwość szybkiego otwierania i kopiowania pól adresów URI/URL.
|
||||
– Rozpoznawanie biometryczne do szybkiego odblokowywania (odcisk palca / odblokowywanie twarzą / …).
|
||||
– Zarządzanie hasłami jednorazowymi (HOTP/TOTP) do uwierzytelniania dwuskładnikowego (2FA).
|
||||
– Material Design z motywami.
|
||||
– Autouzupełnianie i integracja.
|
||||
– Klawiatura z funkcją wypełniania pól.
|
||||
– Dynamiczne szablony.
|
||||
– Historia każdego wpisu.
|
||||
– Precyzyjne zarządzanie ustawieniami.
|
||||
– Kod napisany w językach natywnych (Kotlin/Java/JNI/C).
|
||||
|
||||
Możesz przekazać darowiznę lub kupić wersję profesjonalną, aby uzyskać lepszą obsługę i szybszy rozwój potrzebnych funkcji: <a href="https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.pro">https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.pro</a>
|
||||
|
||||
Projekt stale się rozwija. Nie wahaj się sprawdzić stanu rozwoju kolejnych aktualizacji: <a href="https://github.com/Kunzisoft/KeePassDX/projects">https://github.com/Kunzisoft/KeePassDX/projects</a>
|
||||
|
||||
Zgłoszenia problemów prosimy wysyłać pod adresem: <a href="https://github.com/Kunzisoft/KeePassDX/issues">https://github.com/Kunzisoft/KeePassDX/issues</a>
|
||||
1
fastlane/metadata/android/pl-PL/short_description.txt
Normal file
1
fastlane/metadata/android/pl-PL/short_description.txt
Normal file
@@ -0,0 +1 @@
|
||||
Bezpieczny, otwartoźródłowy sejf i menedżer haseł
|
||||
1
fastlane/metadata/android/pl-PL/title.txt
Normal file
1
fastlane/metadata/android/pl-PL/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
KeePassDX – Bezpieczny sejf
|
||||
Reference in New Issue
Block a user