Merge branch 'release/2.8'

This commit is contained in:
J-Jamet
2020-07-14 17:19:23 +02:00
94 changed files with 1300 additions and 500 deletions

View File

@@ -1,3 +1,11 @@
KeePassDX(2.8)
* Fix TOTP period (> 60s)
* Fix searching in recycle bin
* Settings to back to the previous keyboard during database credentials and after form filling
* Improve action tasks
* Improve recognition to reset app timeout
* Fix minor issues
KeePassDX(2.7)
* Add blocklists for autofill
* Add autofill compatibility mode (usefull for Browser not compatible)

View File

@@ -11,8 +11,8 @@ android {
applicationId "com.kunzisoft.keepass"
minSdkVersion 14
targetSdkVersion 29
versionCode = 35
versionName = "2.7"
versionCode = 36
versionName = "2.8"
multiDexEnabled true
testApplicationId = "com.kunzisoft.keepass.tests"
@@ -102,6 +102,9 @@ dependencies {
implementation 'androidx.documentfile:documentfile:1.0.1'
implementation 'androidx.biometric:biometric:1.0.1'
implementation 'androidx.core:core-ktx:1.2.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3'
// TODO #538 implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"
// To upgrade with style
implementation 'com.google.android.material:material:1.0.0'
// Database

View File

@@ -6,23 +6,23 @@ import junit.framework.TestCase
class UnsignedIntTest: TestCase() {
fun testUInt() {
val standardInt = UnsignedInt(15).toInt()
val standardInt = UnsignedInt(15).toKotlinInt()
assertEquals(15, standardInt)
val unsignedInt = UnsignedInt(-1).toLong()
val unsignedInt = UnsignedInt(-1).toKotlinLong()
assertEquals(4294967295L, unsignedInt)
}
fun testMaxValue() {
val maxValue = UnsignedInt.MAX_VALUE.toLong()
val maxValue = UnsignedInt.MAX_VALUE.toKotlinLong()
assertEquals(4294967295L, maxValue)
val longValue = UnsignedInt.fromLong(4294967295L).toLong()
val longValue = UnsignedInt.fromKotlinLong(4294967295L).toKotlinLong()
assertEquals(longValue, maxValue)
}
fun testLong() {
val longValue = UnsignedInt.fromLong(50L).toInt()
val longValue = UnsignedInt.fromKotlinLong(50L).toKotlinInt()
assertEquals(50, longValue)
val uIntLongValue = UnsignedInt.fromLong(4294967290).toLong()
val uIntLongValue = UnsignedInt.fromKotlinLong(4294967290).toKotlinLong()
assertEquals(4294967290, uIntLongValue)
}
}

View File

@@ -35,11 +35,11 @@ class ValuesTest : TestCase() {
}
fun testReadWriteLongMax() {
testReadWriteLong(java.lang.Byte.MAX_VALUE)
testReadWriteLong(Byte.MAX_VALUE)
}
fun testReadWriteLongMin() {
testReadWriteLong(java.lang.Byte.MIN_VALUE)
testReadWriteLong(Byte.MIN_VALUE)
}
fun testReadWriteLongRnd() {
@@ -62,11 +62,11 @@ class ValuesTest : TestCase() {
}
fun testReadWriteIntMin() {
testReadWriteInt(java.lang.Byte.MIN_VALUE)
testReadWriteInt(Byte.MIN_VALUE)
}
fun testReadWriteIntMax() {
testReadWriteInt(java.lang.Byte.MAX_VALUE)
testReadWriteInt(Byte.MAX_VALUE)
}
private fun testReadWriteInt(value: Byte) {
@@ -103,11 +103,11 @@ class ValuesTest : TestCase() {
}
fun testReadWriteShortMin() {
testReadWriteShort(java.lang.Byte.MIN_VALUE)
testReadWriteShort(Byte.MIN_VALUE)
}
fun testReadWriteShortMax() {
testReadWriteShort(java.lang.Byte.MAX_VALUE)
testReadWriteShort(Byte.MAX_VALUE)
}
private fun testReadWriteShort(value: Byte) {
@@ -125,15 +125,15 @@ class ValuesTest : TestCase() {
}
fun testReadWriteByteMin() {
testReadWriteByte(java.lang.Byte.MIN_VALUE)
testReadWriteByte(Byte.MIN_VALUE)
}
fun testReadWriteByteMax() {
testReadWriteShort(java.lang.Byte.MAX_VALUE)
testReadWriteShort(Byte.MAX_VALUE)
}
private fun testReadWriteByte(value: Byte) {
val dest: Byte = UnsignedInt(UnsignedInt.fromByte(value)).toByte()
val dest: Byte = UnsignedInt(UnsignedInt.fromKotlinByte(value)).toKotlinByte()
assert(value == dest)
}

View File

@@ -89,7 +89,7 @@ class EntryActivity : LockingActivity() {
private var mAttachmentsToDownload: HashMap<Int, EntryAttachment> = HashMap()
private var clipboardHelper: ClipboardHelper? = null
private var firstLaunchOfActivity: Boolean = false
private var mFirstLaunchOfActivity: Boolean = false
private var iconColor: Int = 0
@@ -130,9 +130,12 @@ class EntryActivity : LockingActivity() {
lockAndExit()
}
// Focus view to reinitialize timeout
resetAppTimeoutWhenViewFocusedOrChanged(coordinatorLayout)
// Init the clipboard helper
clipboardHelper = ClipboardHelper(this)
firstLaunchOfActivity = true
mFirstLaunchOfActivity = savedInstanceState?.getBoolean(KEY_FIRST_LAUNCH_ACTIVITY) ?: true
// Init attachment service binder manager
mAttachmentFileBinderManager = AttachmentFileBinderManager(this)
@@ -196,7 +199,7 @@ class EntryActivity : LockingActivity() {
val entryInfo = entry.getEntryInfo(Database.getInstance())
// Manage entry copy to start notification if allowed
if (firstLaunchOfActivity) {
if (mFirstLaunchOfActivity) {
// Manage entry to launch copying notification if allowed
ClipboardEntryNotificationService.launchNotificationIfAllowed(this, entryInfo)
// Manage entry to populate Magikeyboard and launch keyboard notification if allowed
@@ -215,7 +218,7 @@ class EntryActivity : LockingActivity() {
}
}
firstLaunchOfActivity = false
mFirstLaunchOfActivity = false
}
override fun onPause() {
@@ -542,6 +545,11 @@ class EntryActivity : LockingActivity() {
return super.onOptionsItemSelected(item)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putBoolean(KEY_FIRST_LAUNCH_ACTIVITY, mFirstLaunchOfActivity)
}
override fun finish() {
// Transit data in previous Activity after an update
@@ -555,6 +563,8 @@ class EntryActivity : LockingActivity() {
companion object {
private val TAG = EntryActivity::class.java.name
private const val KEY_FIRST_LAUNCH_ACTIVITY = "KEY_FIRST_LAUNCH_ACTIVITY"
const val KEY_ENTRY = "KEY_ENTRY"
const val KEY_ENTRY_HISTORY_POSITION = "KEY_ENTRY_HISTORY_POSITION"

View File

@@ -81,7 +81,7 @@ class EntryEditActivity : LockingActivity(),
private var scrollView: NestedScrollView? = null
private var entryEditContentsView: EntryEditContentsView? = null
private var entryEditAddToolBar: ActionMenuView? = null
private var saveView: View? = null
private var validateButton: View? = null
private var lockView: View? = null
// Education
@@ -121,7 +121,7 @@ class EntryEditActivity : LockingActivity(),
}
// Focus view to reinitialize timeout
resetAppTimeoutWhenViewFocusedOrChanged(entryEditContentsView)
resetAppTimeoutWhenViewFocusedOrChanged(coordinatorLayout)
stopService(Intent(this, ClipboardEntryNotificationService::class.java))
stopService(Intent(this, KeyboardEntryNotificationService::class.java))
@@ -237,8 +237,8 @@ class EntryEditActivity : LockingActivity(),
}
// Save button
saveView = findViewById(R.id.entry_edit_validate)
saveView?.setOnClickListener { saveEntry() }
validateButton = findViewById(R.id.entry_edit_validate)
validateButton?.setOnClickListener { saveEntry() }
// Verify the education views
entryEditActivityEducation = EntryEditActivityEducation(this)

View File

@@ -65,7 +65,6 @@ class FileDatabaseSelectActivity : SpecialModeActivity(),
// Views
private var coordinatorLayout: CoordinatorLayout? = null
private var fileManagerExplanationButton: View? = null
private var databaseButtonsContainerView: View? = null
private var createDatabaseButtonView: View? = null
private var openDatabaseButtonView: View? = null
@@ -97,8 +96,6 @@ class FileDatabaseSelectActivity : SpecialModeActivity(),
UriUtil.gotoUrl(this, R.string.file_manager_explanation_url)
}
databaseButtonsContainerView = findViewById(R.id.database_buttons_container)
// Create database button
createDatabaseButtonView = findViewById(R.id.create_database_button)
createDatabaseButtonView?.setOnClickListener { createNewFile() }
@@ -271,8 +268,8 @@ class FileDatabaseSelectActivity : SpecialModeActivity(),
// Show open and create button or special mode
if (mSelectionMode) {
// Disable buttons if in selection mode or request for autofill
databaseButtonsContainerView?.visibility = View.GONE
// Disable create button if in selection mode or request for autofill
createDatabaseButtonView?.visibility = View.GONE
} else {
if (allowCreateDocumentByStorageAccessFramework(packageManager)) {
// There is an activity which can handle this intent.
@@ -281,7 +278,6 @@ class FileDatabaseSelectActivity : SpecialModeActivity(),
// No Activity found that can handle this intent.
createDatabaseButtonView?.visibility = View.GONE
}
databaseButtonsContainerView?.visibility = View.VISIBLE
}
val database = Database.getInstance()
@@ -403,11 +399,12 @@ class FileDatabaseSelectActivity : SpecialModeActivity(),
private fun performedNextEducation(fileDatabaseSelectActivityEducation: FileDatabaseSelectActivityEducation) {
// If no recent files
val createDatabaseEducationPerformed = createDatabaseButtonView != null && createDatabaseButtonView!!.visibility == View.VISIBLE
val createDatabaseEducationPerformed =
createDatabaseButtonView != null && createDatabaseButtonView!!.visibility == View.VISIBLE
&& mAdapterDatabaseHistory != null
&& mAdapterDatabaseHistory!!.itemCount > 0
&& fileDatabaseSelectActivityEducation.checkAndPerformedCreateDatabaseEducation(
createDatabaseButtonView!!,
createDatabaseButtonView!!,
{
createNewFile()
},

View File

@@ -32,6 +32,7 @@ import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.RequiresApi
@@ -75,7 +76,10 @@ import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Compa
import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.timeout.TimeoutHelper
import com.kunzisoft.keepass.utils.MenuUtil
import com.kunzisoft.keepass.view.*
import com.kunzisoft.keepass.view.AddNodeButtonView
import com.kunzisoft.keepass.view.ToolbarAction
import com.kunzisoft.keepass.view.asError
import com.kunzisoft.keepass.view.showActionError
class GroupActivity : LockingActivity(),
GroupEditDialogFragment.EditGroupListener,
@@ -87,6 +91,7 @@ class GroupActivity : LockingActivity(),
SortDialogFragment.SortSelectionListener {
// Views
private var rootContainerView: ViewGroup? = null
private var coordinatorLayout: CoordinatorLayout? = null
private var lockView: View? = null
private var toolbar: Toolbar? = null
@@ -127,6 +132,7 @@ class GroupActivity : LockingActivity(),
setContentView(layoutInflater.inflate(R.layout.activity_group, null))
// Initialize views
rootContainerView = findViewById(R.id.activity_group_container_view)
coordinatorLayout = findViewById(R.id.group_coordinator)
iconView = findViewById(R.id.group_icon)
numberChildrenView = findViewById(R.id.group_numbers)
@@ -150,7 +156,7 @@ class GroupActivity : LockingActivity(),
taTextColor.recycle()
// Focus view to reinitialize timeout
resetAppTimeoutWhenViewFocusedOrChanged(addNodeButtonView)
resetAppTimeoutWhenViewFocusedOrChanged(rootContainerView)
// Retrieve elements after an orientation change
if (savedInstanceState != null) {
@@ -389,7 +395,8 @@ class GroupActivity : LockingActivity(),
// If it's a search
if (Intent.ACTION_SEARCH == intent.action) {
val searchString = intent.getStringExtra(SearchManager.QUERY)?.trim { it <= ' ' } ?: ""
return mDatabase?.createVirtualGroupFromSearch(searchString)
return mDatabase?.createVirtualGroupFromSearch(searchString,
PreferencesUtil.omitBackup(this))
}
// else a real group
else {

View File

@@ -64,9 +64,7 @@ import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Compa
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.MASTER_PASSWORD_KEY
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.READ_ONLY_KEY
import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.utils.FileDatabaseInfo
import com.kunzisoft.keepass.utils.MenuUtil
import com.kunzisoft.keepass.utils.UriUtil
import com.kunzisoft.keepass.utils.*
import com.kunzisoft.keepass.view.AdvancedUnlockInfoView
import com.kunzisoft.keepass.view.KeyFileSelectionView
import com.kunzisoft.keepass.view.asError
@@ -355,6 +353,11 @@ open class PasswordActivity : SpecialModeActivity() {
mProgressDialogThread?.registerProgressTask()
// Back to previous keyboard is setting activated
if (PreferencesUtil.isKeyboardPreviousDatabaseCredentialsEnable(this)) {
sendBroadcast(Intent(BACK_PREVIOUS_KEYBOARD_ACTION))
}
// Don't allow auto open prompt if lock become when UI visible
mAllowAutoOpenBiometricPrompt = if (LockingActivity.LOCKING_ACTIVITY_UI_VISIBLE_DURING_LOCK == true)
false

View File

@@ -89,9 +89,9 @@ class SetOTPDialogFragment : DialogFragment() {
}
private var mSecretWellFormed = false
private var mCounterWellFormed = true
private var mPeriodWellFormed = true
private var mDigitsWellFormed = true
private var mCounterWellFormed = false
private var mPeriodWellFormed = false
private var mDigitsWellFormed = false
override fun onAttach(context: Context) {
super.onAttach(context)
@@ -365,14 +365,26 @@ class SetOTPDialogFragment : DialogFragment() {
private fun upgradeParameters() {
otpAlgorithmSpinner?.setSelection(TokenCalculator.HashAlgorithm.values()
.indexOf(mOtpElement.algorithm))
val secret = mOtpElement.getBase32Secret()
otpSecretTextView?.apply {
setText(mOtpElement.getBase32Secret())
setText(secret)
// Cursor at end
setSelection(this.text.length)
}
otpCounterTextView?.setText(mOtpElement.counter.toString())
otpPeriodTextView?.setText(mOtpElement.period.toString())
otpDigitsTextView?.setText(mOtpElement.digits.toString())
mSecretWellFormed = OtpElement.isValidBase32(secret)
val counter = mOtpElement.counter
otpCounterTextView?.setText(counter.toString())
mCounterWellFormed = OtpElement.isValidCounter(counter)
val period = mOtpElement.period
otpPeriodTextView?.setText(period.toString())
mPeriodWellFormed = OtpElement.isValidPeriod(period)
val digits = mOtpElement.digits
otpDigitsTextView?.setText(digits.toString())
mDigitsWellFormed = OtpElement.isValidDigits(digits)
}
override fun onSaveInstanceState(outState: Bundle) {

View File

@@ -89,13 +89,13 @@ class OpenFileHelper {
@SuppressLint("InlinedApi")
private fun openActivityWithActionOpenDocument() {
val intentOpenDocument = Intent(APP_ACTION_OPEN_DOCUMENT).apply {
val intentOpenDocument = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "*/*"
flags = Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION or
Intent.FLAG_GRANT_PREFIX_URI_PERMISSION or
Intent.FLAG_GRANT_READ_URI_PERMISSION or
Intent.FLAG_GRANT_WRITE_URI_PERMISSION
addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
addFlags(Intent.FLAG_GRANT_PREFIX_URI_PERMISSION)
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
}
if (fragment != null)
fragment?.startActivityForResult(intentOpenDocument, OPEN_DOC)
@@ -108,10 +108,10 @@ class OpenFileHelper {
val intentGetContent = Intent(Intent.ACTION_GET_CONTENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "*/*"
flags = Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION or
Intent.FLAG_GRANT_PREFIX_URI_PERMISSION or
Intent.FLAG_GRANT_READ_URI_PERMISSION or
Intent.FLAG_GRANT_WRITE_URI_PERMISSION
addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
addFlags(Intent.FLAG_GRANT_PREFIX_URI_PERMISSION)
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
}
if (fragment != null)
fragment?.startActivityForResult(intentGetContent, GET_CONTENT)
@@ -226,12 +226,6 @@ class OpenFileHelper {
private const val TAG = "OpenFileHelper"
private var APP_ACTION_OPEN_DOCUMENT: String = try {
Intent::class.java.getField("ACTION_OPEN_DOCUMENT").get(null) as String
} catch (e: Exception) {
"android.intent.action.OPEN_DOCUMENT"
}
const val OPEN_INTENTS_FILE_BROWSE = "org.openintents.action.PICK_FILE"
private const val GET_CONTENT = 25745

View File

@@ -19,9 +19,10 @@
*/
package com.kunzisoft.keepass.activities.lock
import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import com.kunzisoft.keepass.activities.helpers.ReadOnlyHelper
@@ -71,6 +72,7 @@ abstract class LockingActivity : SpecialModeActivity() {
LOCKING_ACTIVITY_UI_VISIBLE_DURING_LOCK = LOCKING_ACTIVITY_UI_VISIBLE
// Add onActivityForResult response
setResult(RESULT_EXIT_LOCK)
closeOptionsMenu()
finish()
}
registerLockReceiver(mLockReceiver)
@@ -151,11 +153,21 @@ abstract class LockingActivity : SpecialModeActivity() {
/**
* To reset the app timeout when a view is focused or changed
*/
@SuppressLint("ClickableViewAccessibility")
protected fun resetAppTimeoutWhenViewFocusedOrChanged(vararg views: View?) {
views.forEach {
it?.setOnTouchListener { _, event ->
when (event.action) {
MotionEvent.ACTION_DOWN -> {
// Log.d(TAG, "View touched, try to reset app timeout")
TimeoutHelper.checkTimeAndLockIfTimeoutOrResetTimeout(this)
}
}
false
}
it?.setOnFocusChangeListener { _, hasFocus ->
if (hasFocus) {
Log.d(TAG, "View focused, reset app timeout")
// Log.d(TAG, "View focused, try to reset app timeout")
TimeoutHelper.checkTimeAndLockIfTimeoutOrResetTimeout(this)
}
}

View File

@@ -46,7 +46,8 @@ class SearchEntryCursorAdapter(private val context: Context,
private val cursorInflater: LayoutInflater? = context.getSystemService(
Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater?
private var displayUsername: Boolean = false
private var mDisplayUsername: Boolean = false
private var mOmitBackup: Boolean = true
private val iconColor: Int
init {
@@ -59,7 +60,8 @@ class SearchEntryCursorAdapter(private val context: Context,
}
fun reInit(context: Context) {
this.displayUsername = PreferencesUtil.showUsernamesListEntries(context)
this.mDisplayUsername = PreferencesUtil.showUsernamesListEntries(context)
this.mOmitBackup = PreferencesUtil.omitBackup(context)
}
override fun newView(context: Context, cursor: Cursor, parent: ViewGroup): View {
@@ -93,7 +95,7 @@ class SearchEntryCursorAdapter(private val context: Context,
// Assign subtitle
viewHolder.textViewSubTitle?.apply {
val entryUsername = currentEntry.username
text = if (displayUsername && entryUsername.isNotEmpty()) {
text = if (mDisplayUsername && entryUsername.isNotEmpty()) {
String.format("(%s)", entryUsername)
} else {
""
@@ -129,7 +131,9 @@ class SearchEntryCursorAdapter(private val context: Context,
if (database.type == DatabaseKDBX.TYPE)
cursorKDBX = EntryCursorKDBX()
val searchGroup = database.createVirtualGroupFromSearch(query, SearchHelper.MAX_SEARCH_ENTRY)
val searchGroup = database.createVirtualGroupFromSearch(query,
mOmitBackup,
SearchHelper.MAX_SEARCH_ENTRY)
if (searchGroup != null) {
// Search in hide entries but not meta-stream
for (entry in searchGroup.getFilteredChildEntries(Group.ChildFilter.getDefaults(context))) {

View File

@@ -52,12 +52,19 @@ class AdvancedUnlockedManager(var context: FragmentActivity,
private var biometricUnlockDatabaseHelper: BiometricUnlockDatabaseHelper? = null
private var biometricMode: Mode = Mode.UNAVAILABLE
/**
* Manage setting to auto open biometric prompt
*/
private var biometricPromptAutoOpenPreference = PreferencesUtil.isBiometricPromptAutoOpenEnable(context)
var isBiometricPromptAutoOpenEnable: Boolean = true
get() {
return field && biometricPromptAutoOpenPreference
}
// Variable to check if the prompt can be open (if the right activity is currently shown)
// checkBiometricAvailability() allows open biometric prompt and onDestroy() removes the authorization
private var allowOpenBiometricPrompt = false
private var cipherDatabaseAction = CipherDatabaseAction.getInstance(context.applicationContext)
init {
@@ -77,6 +84,7 @@ class AdvancedUnlockedManager(var context: FragmentActivity,
// biometric not supported (by API level or hardware) so keep option hidden
// or manually disable
val biometricCanAuthenticate = BiometricManager.from(context).canAuthenticate()
allowOpenBiometricPrompt = true
if (!PreferencesUtil.isBiometricUnlockEnable(context)
|| biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE
@@ -210,7 +218,8 @@ class AdvancedUnlockedManager(var context: FragmentActivity,
cryptoObject: BiometricPrompt.CryptoObject,
promptInfo: BiometricPrompt.PromptInfo) {
context.runOnUiThread {
biometricPrompt?.authenticate(promptInfo, cryptoObject)
if (allowOpenBiometricPrompt)
biometricPrompt?.authenticate(promptInfo, cryptoObject)
}
}
@@ -277,6 +286,7 @@ class AdvancedUnlockedManager(var context: FragmentActivity,
fun destroy() {
// Close the biometric prompt
allowOpenBiometricPrompt = false
biometricUnlockDatabaseHelper?.closeBiometricPrompt()
// Restore the checked listener
checkboxPasswordView?.setOnCheckedChangeListener(onCheckedPasswordChangeListener)

View File

@@ -20,12 +20,10 @@
package com.kunzisoft.keepass.crypto.finalkey
import java.io.IOException
import java.lang.Exception
import java.security.InvalidKeyException
import java.security.MessageDigest
import java.security.NoSuchAlgorithmException
import javax.crypto.Cipher
import javax.crypto.NoSuchPaddingException
import javax.crypto.ShortBufferException
import javax.crypto.spec.SecretKeySpec

View File

@@ -61,10 +61,10 @@ class Argon2Kdf internal constructor() : KdfEngine() {
UnsignedInt(it)
}
val memory = kdfParameters.getUInt64(PARAM_MEMORY)?.div(MEMORY_BLOCK_SIZE)?.let {
UnsignedInt.fromLong(it)
UnsignedInt.fromKotlinLong(it)
}
val iterations = kdfParameters.getUInt64(PARAM_ITERATIONS)?.let {
UnsignedInt.fromLong(it)
UnsignedInt.fromKotlinLong(it)
}
val version = kdfParameters.getUInt32(PARAM_VERSION)?.let {
UnsignedInt(it)
@@ -124,16 +124,16 @@ class Argon2Kdf internal constructor() : KdfEngine() {
override fun getParallelism(kdfParameters: KdfParameters): Long {
return kdfParameters.getUInt32(PARAM_PARALLELISM)?.let {
UnsignedInt(it).toLong()
UnsignedInt(it).toKotlinLong()
} ?: defaultParallelism
}
override fun setParallelism(kdfParameters: KdfParameters, parallelism: Long) {
kdfParameters.setUInt32(PARAM_PARALLELISM, UnsignedInt.fromLong(parallelism))
kdfParameters.setUInt32(PARAM_PARALLELISM, UnsignedInt.fromKotlinLong(parallelism))
}
override val defaultParallelism: Long
get() = DEFAULT_PARALLELISM.toLong()
get() = DEFAULT_PARALLELISM.toKotlinLong()
override val minParallelism: Long
get() = MIN_PARALLELISM
@@ -173,13 +173,13 @@ class Argon2Kdf internal constructor() : KdfEngine() {
private val MAX_VERSION = UnsignedInt(0x13)
private const val MIN_SALT = 8
private val MAX_SALT = UnsignedInt.MAX_VALUE.toLong()
private val MAX_SALT = UnsignedInt.MAX_VALUE.toKotlinLong()
private const val MIN_ITERATIONS: Long = 1L
private const val MAX_ITERATIONS = 4294967295L
private const val MIN_MEMORY = (1024 * 8).toLong()
private val MAX_MEMORY = UnsignedInt.MAX_VALUE.toLong()
private val MAX_MEMORY = UnsignedInt.MAX_VALUE.toKotlinLong()
private const val MEMORY_BLOCK_SIZE: Long = 1024L
private const val MIN_PARALLELISM: Long = 1L

View File

@@ -34,12 +34,12 @@ public class Argon2Native {
return nTransformMasterKey(
password,
salt,
parallelism.toInt(),
memory.toInt(),
iterations.toInt(),
parallelism.toKotlinInt(),
memory.toKotlinInt(),
iterations.toKotlinInt(),
secretKey,
associatedData,
version.toInt());
version.toKotlinInt());
}
private static native byte[] nTransformMasterKey(byte[] password, byte[] salt, int parallelism,

View File

@@ -52,7 +52,7 @@ abstract class KdfEngine : ObjectNameResource, Serializable {
get() = 1
open val maxKeyRounds: Long
get() = UnsignedInt.MAX_VALUE.toLong()
get() = UnsignedInt.MAX_VALUE.toKotlinLong()
/*
* MEMORY
@@ -73,7 +73,7 @@ abstract class KdfEngine : ObjectNameResource, Serializable {
get() = 1
open val maxMemoryUsage: Long
get() = UnsignedInt.MAX_VALUE.toLong()
get() = UnsignedInt.MAX_VALUE.toKotlinLong()
/*
* PARALLELISM
@@ -94,7 +94,7 @@ abstract class KdfEngine : ObjectNameResource, Serializable {
get() = 1L
open val maxParallelism: Long
get() = UnsignedInt.MAX_VALUE.toLong()
get() = UnsignedInt.MAX_VALUE.toKotlinLong()
companion object {
const val UNKNOWN_VALUE: Long = -1L

View File

@@ -27,7 +27,6 @@ import com.kunzisoft.keepass.app.database.FileDatabaseHistoryAction
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.database.exception.DuplicateUuidDatabaseException
import com.kunzisoft.keepass.database.exception.LoadDatabaseException
import com.kunzisoft.keepass.notifications.DatabaseOpenNotificationService
import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.tasks.ActionRunnable
import com.kunzisoft.keepass.tasks.ProgressTaskUpdater
@@ -39,7 +38,6 @@ class LoadDatabaseRunnable(private val context: Context,
private val mKey: Uri?,
private val mReadonly: Boolean,
private val mCipherEntity: CipherDatabaseEntity?,
private val mOmitBackup: Boolean,
private val mFixDuplicateUUID: Boolean,
private val progressTaskUpdater: ProgressTaskUpdater?,
private val mDuplicateUuidAction: ((Result) -> Unit)?)
@@ -58,7 +56,6 @@ class LoadDatabaseRunnable(private val context: Context,
mReadonly,
context.contentResolver,
cacheDirectory,
mOmitBackup,
mFixDuplicateUUID,
progressTaskUpdater)
}
@@ -88,9 +85,6 @@ class LoadDatabaseRunnable(private val context: Context,
// Register the current time to init the lock timer
PreferencesUtil.saveCurrentTime(context)
// Start the opening notification
DatabaseOpenNotificationService.start(context)
} else {
mDatabase.closeAndClear(cacheDirectory)
}

View File

@@ -27,7 +27,6 @@ import android.os.Build
import android.os.Bundle
import android.os.IBinder
import androidx.fragment.app.FragmentActivity
import com.kunzisoft.keepass.activities.lock.LockingActivity
import com.kunzisoft.keepass.app.database.CipherDatabaseEntity
import com.kunzisoft.keepass.crypto.keyDerivation.KdfEngine
import com.kunzisoft.keepass.database.element.Entry
@@ -37,7 +36,6 @@ import com.kunzisoft.keepass.database.element.node.Node
import com.kunzisoft.keepass.database.element.node.NodeId
import com.kunzisoft.keepass.database.element.node.Type
import com.kunzisoft.keepass.database.element.security.EncryptionAlgorithm
import com.kunzisoft.keepass.notifications.DatabaseOpenNotificationService
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_ASSIGN_PASSWORD_TASK
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_COPY_NODES_TASK
@@ -68,7 +66,6 @@ import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Compa
import com.kunzisoft.keepass.tasks.ActionRunnable
import com.kunzisoft.keepass.tasks.ProgressTaskDialogFragment
import com.kunzisoft.keepass.tasks.ProgressTaskDialogFragment.Companion.PROGRESS_TASK_DIALOG_TAG
import com.kunzisoft.keepass.timeout.TimeoutHelper
import com.kunzisoft.keepass.utils.DATABASE_START_TASK_ACTION
import com.kunzisoft.keepass.utils.DATABASE_STOP_TASK_ACTION
import java.util.*
@@ -90,9 +87,6 @@ class ProgressDialogThread(private val activity: FragmentActivity) {
private val actionTaskListener = object: DatabaseTaskNotificationService.ActionTaskListener {
override fun onStartAction(titleId: Int?, messageId: Int?, warningId: Int?) {
TimeoutHelper.temporarilyDisableTimeout()
// Stop the opening notification
DatabaseOpenNotificationService.stop(activity)
startDialog(titleId, messageId, warningId)
}
@@ -102,21 +96,8 @@ class ProgressDialogThread(private val activity: FragmentActivity) {
override fun onStopAction(actionTask: String, result: ActionRunnable.Result) {
onActionFinish?.invoke(actionTask, result)
// Remove the progress task
stopDialog()
TimeoutHelper.releaseTemporarilyDisableTimeout()
val inTime = if (activity is LockingActivity) {
TimeoutHelper.checkTimeAndLockIfTimeout(activity)
} else {
TimeoutHelper.checkTime(activity)
}
// Start the opening notification if in time
// (databaseOpenService is open manually in Action Open Task)
if (actionTask != ACTION_DATABASE_LOAD_TASK && inTime) {
DatabaseOpenNotificationService.start(activity)
}
}
}

View File

@@ -46,7 +46,6 @@ import com.kunzisoft.keepass.database.file.output.DatabaseOutputKDBX
import com.kunzisoft.keepass.database.search.SearchHelper
import com.kunzisoft.keepass.database.search.SearchParameters
import com.kunzisoft.keepass.icons.IconDrawableFactory
import com.kunzisoft.keepass.model.SearchInfo
import com.kunzisoft.keepass.stream.readBytes4ToUInt
import com.kunzisoft.keepass.tasks.ProgressTaskUpdater
import com.kunzisoft.keepass.utils.SingletonHolder
@@ -316,7 +315,6 @@ class Database {
readOnly: Boolean,
contentResolver: ContentResolver,
cacheDirectory: File,
omitBackup: Boolean,
fixDuplicateUUID: Boolean,
progressTaskUpdater: ProgressTaskUpdater?) {
@@ -378,7 +376,7 @@ class Database {
else -> throw SignatureDatabaseException()
}
this.mSearchHelper = SearchHelper(omitBackup)
this.mSearchHelper = SearchHelper()
loaded = true
} catch (e: LoadDatabaseException) {
@@ -393,20 +391,24 @@ class Database {
}
}
fun isGroupSearchable(group: Group, isOmitBackup: Boolean): Boolean {
return mDatabaseKDB?.isGroupSearchable(group.groupKDB, isOmitBackup) ?:
mDatabaseKDBX?.isGroupSearchable(group.groupKDBX, isOmitBackup) ?:
fun isGroupSearchable(group: Group, omitBackup: Boolean): Boolean {
return mDatabaseKDB?.isGroupSearchable(group.groupKDB, omitBackup) ?:
mDatabaseKDBX?.isGroupSearchable(group.groupKDBX, omitBackup) ?:
false
}
fun createVirtualGroupFromSearch(searchQuery: String,
omitBackup: Boolean,
max: Int = Integer.MAX_VALUE): Group? {
return mSearchHelper?.createVirtualGroupWithSearchResult(this, searchQuery, SearchParameters(), max)
return mSearchHelper?.createVirtualGroupWithSearchResult(this,
searchQuery, SearchParameters(), omitBackup, max)
}
fun createVirtualGroupFromSearchInfo(searchInfoString: String,
omitBackup: Boolean,
max: Int = Integer.MAX_VALUE): Group? {
return mSearchHelper?.createVirtualGroupWithSearchResult(this, searchInfoString, SearchParameters().apply {
return mSearchHelper?.createVirtualGroupWithSearchResult(this,
searchInfoString, SearchParameters().apply {
searchInTitles = false
searchInUserNames = false
searchInPasswords = false
@@ -416,7 +418,7 @@ class Database {
searchInUUIDs = false
searchInTags = false
ignoreCase = true
}, max)
}, omitBackup, max)
}
@Throws(DatabaseOutputException::class)

View File

@@ -58,7 +58,7 @@ class AutoType : Parcelable {
override fun writeToParcel(dest: Parcel, flags: Int) {
dest.writeByte((if (enabled) 1 else 0).toByte())
dest.writeInt(obfuscationOptions.toInt())
dest.writeInt(obfuscationOptions.toKotlinInt())
dest.writeString(defaultSequence)
ParcelableUtil.writeStringParcelableMap(dest, windowSeqPairs)
}

View File

@@ -123,7 +123,7 @@ class EntryKDBX : EntryVersioned<UUID, UUID, GroupKDBX, EntryKDBX>, NodeKDBXInte
override fun writeToParcel(dest: Parcel, flags: Int) {
super.writeToParcel(dest, flags)
dest.writeParcelable(iconCustom, flags)
dest.writeLong(usageCount.toLong())
dest.writeLong(usageCount.toKotlinLong())
dest.writeParcelable(locationChanged, flags)
ParcelableUtil.writeStringParcelableMap(dest, customData)
ParcelableUtil.writeStringParcelableMap(dest, flags, fields)
@@ -334,7 +334,7 @@ class EntryKDBX : EntryVersioned<UUID, UUID, GroupKDBX, EntryKDBX>, NodeKDBXInte
override fun touch(modified: Boolean, touchParents: Boolean) {
super.touch(modified, touchParents)
// TODO unsigned long
usageCount = UnsignedLong(usageCount.toLong() + 1)
usageCount = UnsignedLong(usageCount.toKotlinLong() + 1)
}
companion object {

View File

@@ -102,7 +102,7 @@ class GroupKDBX : GroupVersioned<UUID, UUID, GroupKDBX, EntryKDBX>, NodeKDBXInte
override fun writeToParcel(dest: Parcel, flags: Int) {
super.writeToParcel(dest, flags)
dest.writeParcelable(iconCustom, flags)
dest.writeLong(usageCount.toLong())
dest.writeLong(usageCount.toKotlinLong())
dest.writeParcelable(locationChanged, flags)
// TODO ParcelableUtil.writeStringParcelableMap(dest, customData);
dest.writeString(notes)

View File

@@ -97,11 +97,11 @@ class DatabaseHeaderKDB : DatabaseHeader() {
const val BUF_SIZE = 124
fun matchesHeader(sig1: UnsignedInt, sig2: UnsignedInt): Boolean {
return sig1.toInt() == PWM_DBSIG_1.toInt() && sig2.toInt() == DBSIG_2.toInt()
return sig1.toKotlinInt() == PWM_DBSIG_1.toKotlinInt() && sig2.toKotlinInt() == DBSIG_2.toKotlinInt()
}
fun compatibleHeaders(one: UnsignedInt, two: UnsignedInt): Boolean {
return one.toInt() and -0x100 == two.toInt() and -0x100
return one.toKotlinInt() and -0x100 == two.toKotlinInt() and -0x100
}
}

View File

@@ -176,10 +176,10 @@ class DatabaseHeaderKDBX(private val databaseV4: DatabaseKDBX) : DatabaseHeader(
private fun readHeaderField(dis: LittleEndianDataInputStream): Boolean {
val fieldID = dis.read().toByte()
val fieldSize: Int = if (version.toLong() < FILE_VERSION_32_4.toLong()) {
val fieldSize: Int = if (version.toKotlinLong() < FILE_VERSION_32_4.toKotlinLong()) {
dis.readUShort()
} else {
dis.readUInt().toInt()
dis.readUInt().toKotlinInt()
}
var fieldData: ByteArray? = null
@@ -202,20 +202,20 @@ class DatabaseHeaderKDBX(private val databaseV4: DatabaseKDBX) : DatabaseHeader(
PwDbHeaderV4Fields.MasterSeed -> masterSeed = fieldData
PwDbHeaderV4Fields.TransformSeed -> if (version.toLong() < FILE_VERSION_32_4.toLong())
PwDbHeaderV4Fields.TransformSeed -> if (version.toKotlinLong() < FILE_VERSION_32_4.toKotlinLong())
transformSeed = fieldData
PwDbHeaderV4Fields.TransformRounds -> if (version.toLong() < FILE_VERSION_32_4.toLong())
PwDbHeaderV4Fields.TransformRounds -> if (version.toKotlinLong() < FILE_VERSION_32_4.toKotlinLong())
setTransformRound(fieldData)
PwDbHeaderV4Fields.EncryptionIV -> encryptionIV = fieldData
PwDbHeaderV4Fields.InnerRandomstreamKey -> if (version.toLong() < FILE_VERSION_32_4.toLong())
PwDbHeaderV4Fields.InnerRandomstreamKey -> if (version.toKotlinLong() < FILE_VERSION_32_4.toKotlinLong())
innerRandomStreamKey = fieldData
PwDbHeaderV4Fields.StreamStartBytes -> streamStartBytes = fieldData
PwDbHeaderV4Fields.InnerRandomStreamID -> if (version.toLong() < FILE_VERSION_32_4.toLong())
PwDbHeaderV4Fields.InnerRandomStreamID -> if (version.toKotlinLong() < FILE_VERSION_32_4.toKotlinLong())
setRandomStreamID(fieldData)
PwDbHeaderV4Fields.KdfParameters -> databaseV4.kdfParameters = KdfParameters.deserialize(fieldData)
@@ -261,7 +261,7 @@ class DatabaseHeaderKDBX(private val databaseV4: DatabaseKDBX) : DatabaseHeader(
}
val flag = bytes4ToUInt(pbFlags)
if (flag.toLong() < 0 || flag.toLong() >= CompressionAlgorithm.values().size) {
if (flag.toKotlinLong() < 0 || flag.toKotlinLong() >= CompressionAlgorithm.values().size) {
throw IOException("Unrecognized compression flag.")
}
@@ -277,7 +277,7 @@ class DatabaseHeaderKDBX(private val databaseV4: DatabaseKDBX) : DatabaseHeader(
}
val id = bytes4ToUInt(streamID)
if (id.toInt() < 0 || id.toInt() >= CrsAlgorithm.values().size) {
if (id.toKotlinInt() < 0 || id.toKotlinInt() >= CrsAlgorithm.values().size) {
throw IOException("Invalid stream id.")
}
@@ -292,8 +292,8 @@ class DatabaseHeaderKDBX(private val databaseV4: DatabaseKDBX) : DatabaseHeader(
* @return true if it's a supported version
*/
private fun validVersion(version: UnsignedInt): Boolean {
return version.toInt() and FILE_VERSION_CRITICAL_MASK.toInt() <=
FILE_VERSION_32_4.toInt() and FILE_VERSION_CRITICAL_MASK.toInt()
return version.toKotlinInt() and FILE_VERSION_CRITICAL_MASK.toKotlinInt() <=
FILE_VERSION_32_4.toKotlinInt() and FILE_VERSION_CRITICAL_MASK.toKotlinInt()
}
companion object {
@@ -306,7 +306,7 @@ class DatabaseHeaderKDBX(private val databaseV4: DatabaseKDBX) : DatabaseHeader(
val FILE_VERSION_32_4 = UnsignedInt(0x00040000)
fun getCompressionFromFlag(flag: UnsignedInt): CompressionAlgorithm? {
return when (flag.toInt()) {
return when (flag.toKotlinInt()) {
0 -> CompressionAlgorithm.None
1 -> CompressionAlgorithm.GZip
else -> null

View File

@@ -90,16 +90,16 @@ class DatabaseInputKDB(cacheDirectory: File,
// Select algorithm
when {
header.flags.toInt() and DatabaseHeaderKDB.FLAG_RIJNDAEL.toInt() != 0 -> {
header.flags.toKotlinInt() and DatabaseHeaderKDB.FLAG_RIJNDAEL.toKotlinInt() != 0 -> {
mDatabaseToOpen.encryptionAlgorithm = EncryptionAlgorithm.AESRijndael
}
header.flags.toInt() and DatabaseHeaderKDB.FLAG_TWOFISH.toInt() != 0 -> {
header.flags.toKotlinInt() and DatabaseHeaderKDB.FLAG_TWOFISH.toKotlinInt() != 0 -> {
mDatabaseToOpen.encryptionAlgorithm = EncryptionAlgorithm.Twofish
}
else -> throw InvalidAlgorithmDatabaseException()
}
mDatabaseToOpen.numberKeyEncryptionRounds = header.numKeyEncRounds.toLong()
mDatabaseToOpen.numberKeyEncryptionRounds = header.numKeyEncRounds.toKotlinLong()
// Generate transformedMasterKey from masterKey
mDatabaseToOpen.makeFinalKey(
@@ -160,11 +160,11 @@ class DatabaseInputKDB(cacheDirectory: File,
var newEntry: EntryKDB? = null
var currentGroupNumber = 0
var currentEntryNumber = 0
while (currentGroupNumber < header.numGroups.toLong()
|| currentEntryNumber < header.numEntries.toLong()) {
while (currentGroupNumber < header.numGroups.toKotlinLong()
|| currentEntryNumber < header.numEntries.toKotlinLong()) {
val fieldType = cipherInputStream.readBytes2ToUShort()
val fieldSize = cipherInputStream.readBytes4ToUInt().toInt()
val fieldSize = cipherInputStream.readBytes4ToUInt().toKotlinInt()
when (fieldType) {
0x0000 -> {
@@ -175,7 +175,7 @@ class DatabaseInputKDB(cacheDirectory: File,
when (fieldSize) {
4 -> {
newGroup = mDatabaseToOpen.createGroup().apply {
setGroupId(cipherInputStream.readBytes4ToUInt().toInt())
setGroupId(cipherInputStream.readBytes4ToUInt().toKotlinInt())
}
}
16 -> {
@@ -194,7 +194,7 @@ class DatabaseInputKDB(cacheDirectory: File,
} ?:
newEntry?.let { entry ->
val groupKDB = mDatabaseToOpen.createGroup()
groupKDB.nodeId = NodeIdInt(cipherInputStream.readBytes4ToUInt().toInt())
groupKDB.nodeId = NodeIdInt(cipherInputStream.readBytes4ToUInt().toKotlinInt())
entry.parent = groupKDB
}
}
@@ -203,7 +203,7 @@ class DatabaseInputKDB(cacheDirectory: File,
group.creationTime = cipherInputStream.readBytes5ToDate()
} ?:
newEntry?.let { entry ->
var iconId = cipherInputStream.readBytes4ToUInt().toInt()
var iconId = cipherInputStream.readBytes4ToUInt().toKotlinInt()
// Clean up after bug that set icon ids to -1
if (iconId == -1) {
iconId = 0
@@ -237,7 +237,7 @@ class DatabaseInputKDB(cacheDirectory: File,
}
0x0007 -> {
newGroup?.let { group ->
group.icon = mDatabaseToOpen.iconFactory.getIcon(cipherInputStream.readBytes4ToUInt().toInt())
group.icon = mDatabaseToOpen.iconFactory.getIcon(cipherInputStream.readBytes4ToUInt().toKotlinInt())
} ?:
newEntry?.let { entry ->
entry.password = cipherInputStream.readBytesToString(fieldSize,false)
@@ -253,7 +253,7 @@ class DatabaseInputKDB(cacheDirectory: File,
}
0x0009 -> {
newGroup?.let { group ->
group.groupFlags = cipherInputStream.readBytes4ToUInt().toInt()
group.groupFlags = cipherInputStream.readBytes4ToUInt().toKotlinInt()
} ?:
newEntry?.let { entry ->
entry.creationTime = cipherInputStream.readBytes5ToDate()

View File

@@ -132,7 +132,7 @@ class DatabaseInputKDBX(cacheDirectory: File,
}
val isPlain: InputStream
if (mDatabase.kdbxVersion.toLong() < DatabaseHeaderKDBX.FILE_VERSION_32_4.toLong()) {
if (mDatabase.kdbxVersion.toKotlinLong() < DatabaseHeaderKDBX.FILE_VERSION_32_4.toKotlinLong()) {
val decrypted = attachCipherStream(databaseInputStream, cipher)
val dataDecrypted = LittleEndianDataInputStream(decrypted)
@@ -180,7 +180,7 @@ class DatabaseInputKDBX(cacheDirectory: File,
else -> isPlain
}
if (mDatabase.kdbxVersion.toLong() >= DatabaseHeaderKDBX.FILE_VERSION_32_4.toLong()) {
if (mDatabase.kdbxVersion.toKotlinLong() >= DatabaseHeaderKDBX.FILE_VERSION_32_4.toKotlinLong()) {
loadInnerHeader(inputStreamXml, header)
}
@@ -228,7 +228,7 @@ class DatabaseInputKDBX(cacheDirectory: File,
header: DatabaseHeaderKDBX): Boolean {
val fieldId = dataInputStream.read().toByte()
val size = dataInputStream.readUInt().toInt()
val size = dataInputStream.readUInt().toKotlinInt()
if (size < 0) throw IOException("Corrupted file")
var data = ByteArray(0)
@@ -492,7 +492,7 @@ class DatabaseInputKDBX(cacheDirectory: File,
} else if (name.equals(DatabaseKDBXXML.ElemNotes, ignoreCase = true)) {
ctxGroup?.notes = readString(xpp)
} else if (name.equals(DatabaseKDBXXML.ElemIcon, ignoreCase = true)) {
ctxGroup?.icon = mDatabase.iconFactory.getIcon(readUInt(xpp, UnsignedInt(0)).toInt())
ctxGroup?.icon = mDatabase.iconFactory.getIcon(readUInt(xpp, UnsignedInt(0)).toKotlinInt())
} else if (name.equals(DatabaseKDBXXML.ElemCustomIconID, ignoreCase = true)) {
ctxGroup?.iconCustom = mDatabase.iconFactory.getIcon(readUuid(xpp))
} else if (name.equals(DatabaseKDBXXML.ElemTimes, ignoreCase = true)) {
@@ -546,7 +546,7 @@ class DatabaseInputKDBX(cacheDirectory: File,
KdbContext.Entry -> if (name.equals(DatabaseKDBXXML.ElemUuid, ignoreCase = true)) {
ctxEntry?.nodeId = NodeIdUUID(readUuid(xpp))
} else if (name.equals(DatabaseKDBXXML.ElemIcon, ignoreCase = true)) {
ctxEntry?.icon = mDatabase.iconFactory.getIcon(readUInt(xpp, UnsignedInt(0)).toInt())
ctxEntry?.icon = mDatabase.iconFactory.getIcon(readUInt(xpp, UnsignedInt(0)).toKotlinInt())
} else if (name.equals(DatabaseKDBXXML.ElemCustomIconID, ignoreCase = true)) {
ctxEntry?.iconCustom = mDatabase.iconFactory.getIcon(readUuid(xpp))
} else if (name.equals(DatabaseKDBXXML.ElemFgColor, ignoreCase = true)) {
@@ -819,7 +819,7 @@ class DatabaseInputKDBX(cacheDirectory: File,
val sDate = readString(xpp)
var utcDate: Date? = null
if (mDatabase.kdbxVersion.toLong() >= DatabaseHeaderKDBX.FILE_VERSION_32_4.toLong()) {
if (mDatabase.kdbxVersion.toKotlinLong() >= DatabaseHeaderKDBX.FILE_VERSION_32_4.toKotlinLong()) {
var buf = Base64.decode(sDate, BASE_64_FLAG)
if (buf.size != 8) {
val buf8 = ByteArray(8)

View File

@@ -90,7 +90,7 @@ constructor(private val databaseKDBX: DatabaseKDBX,
writeHeaderField(DatabaseHeaderKDBX.PwDbHeaderV4Fields.CompressionFlags, uIntTo4Bytes(DatabaseHeaderKDBX.getFlagFromCompression(databaseKDBX.compressionAlgorithm)))
writeHeaderField(DatabaseHeaderKDBX.PwDbHeaderV4Fields.MasterSeed, header.masterSeed)
if (header.version.toLong() < DatabaseHeaderKDBX.FILE_VERSION_32_4.toLong()) {
if (header.version.toKotlinLong() < DatabaseHeaderKDBX.FILE_VERSION_32_4.toKotlinLong()) {
writeHeaderField(DatabaseHeaderKDBX.PwDbHeaderV4Fields.TransformSeed, header.transformSeed)
writeHeaderField(DatabaseHeaderKDBX.PwDbHeaderV4Fields.TransformRounds, longTo8Bytes(databaseKDBX.numberKeyEncryptionRounds))
} else {
@@ -101,7 +101,7 @@ constructor(private val databaseKDBX: DatabaseKDBX,
writeHeaderField(DatabaseHeaderKDBX.PwDbHeaderV4Fields.EncryptionIV, header.encryptionIV)
}
if (header.version.toLong() < DatabaseHeaderKDBX.FILE_VERSION_32_4.toLong()) {
if (header.version.toKotlinLong() < DatabaseHeaderKDBX.FILE_VERSION_32_4.toKotlinLong()) {
writeHeaderField(DatabaseHeaderKDBX.PwDbHeaderV4Fields.InnerRandomstreamKey, header.innerRandomStreamKey)
writeHeaderField(DatabaseHeaderKDBX.PwDbHeaderV4Fields.StreamStartBytes, header.streamStartBytes)
writeHeaderField(DatabaseHeaderKDBX.PwDbHeaderV4Fields.InnerRandomStreamID, uIntTo4Bytes(header.innerRandomStream!!.id))
@@ -136,7 +136,7 @@ constructor(private val databaseKDBX: DatabaseKDBX,
@Throws(IOException::class)
private fun writeHeaderFieldSize(size: Int) {
if (header.version.toLong() < DatabaseHeaderKDBX.FILE_VERSION_32_4.toLong()) {
if (header.version.toKotlinLong() < DatabaseHeaderKDBX.FILE_VERSION_32_4.toKotlinLong()) {
los.writeUShort(size)
} else {
los.writeInt(size)

View File

@@ -40,7 +40,7 @@ class DatabaseInnerHeaderOutputKDBX(private val database: DatabaseKDBX,
dataOutputStream.writeInt(4)
if (header.innerRandomStream == null)
throw IOException("Can't write innerRandomStream")
dataOutputStream.writeInt(header.innerRandomStream!!.id.toInt())
dataOutputStream.writeInt(header.innerRandomStream!!.id.toKotlinInt())
val streamKeySize = header.innerRandomStreamKey.size
dataOutputStream.write(DatabaseHeaderKDBX.PwDbInnerHeaderV4Fields.InnerRandomstreamKey.toInt())

View File

@@ -118,10 +118,10 @@ class DatabaseOutputKDB(private val mDatabaseKDB: DatabaseKDB,
when {
mDatabaseKDB.encryptionAlgorithm === EncryptionAlgorithm.AESRijndael -> {
header.flags = UnsignedInt(header.flags.toInt() or DatabaseHeaderKDB.FLAG_RIJNDAEL.toInt())
header.flags = UnsignedInt(header.flags.toKotlinInt() or DatabaseHeaderKDB.FLAG_RIJNDAEL.toKotlinInt())
}
mDatabaseKDB.encryptionAlgorithm === EncryptionAlgorithm.Twofish -> {
header.flags = UnsignedInt(header.flags.toInt() or DatabaseHeaderKDB.FLAG_TWOFISH.toInt())
header.flags = UnsignedInt(header.flags.toKotlinInt() or DatabaseHeaderKDB.FLAG_TWOFISH.toKotlinInt())
}
else -> throw DatabaseOutputException("Unsupported algorithm.")
}
@@ -129,7 +129,7 @@ class DatabaseOutputKDB(private val mDatabaseKDB: DatabaseKDB,
header.version = DatabaseHeaderKDB.DBVER_DW
header.numGroups = UnsignedInt(mDatabaseKDB.numberOfGroups())
header.numEntries = UnsignedInt(mDatabaseKDB.numberOfEntries())
header.numKeyEncRounds = UnsignedInt.fromLong(mDatabaseKDB.numberKeyEncryptionRounds)
header.numKeyEncRounds = UnsignedInt.fromKotlinLong(mDatabaseKDB.numberKeyEncryptionRounds)
setIVs(header)

View File

@@ -85,7 +85,7 @@ class DatabaseOutputKDBX(private val mDatabaseKDBX: DatabaseKDBX,
header = outputHeader(mOS)
val osPlain: OutputStream
osPlain = if (header!!.version.toLong() < DatabaseHeaderKDBX.FILE_VERSION_32_4.toLong()) {
osPlain = if (header!!.version.toKotlinLong() < DatabaseHeaderKDBX.FILE_VERSION_32_4.toKotlinLong()) {
val cos = attachStreamEncryptor(header!!, mOS)
cos.write(header!!.streamStartBytes)
@@ -105,7 +105,7 @@ class DatabaseOutputKDBX(private val mDatabaseKDBX: DatabaseKDBX,
else -> osPlain
}
if (header!!.version.toLong() >= DatabaseHeaderKDBX.FILE_VERSION_32_4.toLong()) {
if (header!!.version.toKotlinLong() >= DatabaseHeaderKDBX.FILE_VERSION_32_4.toKotlinLong()) {
val ihOut = DatabaseInnerHeaderOutputKDBX(mDatabaseKDBX, header!!, osXml)
ihOut.output()
}
@@ -209,7 +209,7 @@ class DatabaseOutputKDBX(private val mDatabaseKDBX: DatabaseKDBX,
writeObject(DatabaseKDBXXML.ElemDbDescChanged, mDatabaseKDBX.descriptionChanged.date)
writeObject(DatabaseKDBXXML.ElemDbDefaultUser, mDatabaseKDBX.defaultUserName, true)
writeObject(DatabaseKDBXXML.ElemDbDefaultUserChanged, mDatabaseKDBX.defaultUserNameChanged.date)
writeObject(DatabaseKDBXXML.ElemDbMntncHistoryDays, mDatabaseKDBX.maintenanceHistoryDays.toLong())
writeObject(DatabaseKDBXXML.ElemDbMntncHistoryDays, mDatabaseKDBX.maintenanceHistoryDays.toKotlinLong())
writeObject(DatabaseKDBXXML.ElemDbColor, mDatabaseKDBX.color)
writeObject(DatabaseKDBXXML.ElemDbKeyChanged, mDatabaseKDBX.keyLastChanged.date)
writeObject(DatabaseKDBXXML.ElemDbKeyChangeRec, mDatabaseKDBX.keyChangeRecDays)
@@ -230,7 +230,7 @@ class DatabaseOutputKDBX(private val mDatabaseKDBX: DatabaseKDBX,
writeUuid(DatabaseKDBXXML.ElemLastTopVisibleGroup, mDatabaseKDBX.lastTopVisibleGroupUUID)
// Seem to work properly if always in meta
if (header!!.version.toLong() < DatabaseHeaderKDBX.FILE_VERSION_32_4.toLong())
if (header!!.version.toKotlinLong() < DatabaseHeaderKDBX.FILE_VERSION_32_4.toKotlinLong())
writeMetaBinaries()
writeCustomData(mDatabaseKDBX.customData)
@@ -274,7 +274,7 @@ class DatabaseOutputKDBX(private val mDatabaseKDBX: DatabaseKDBX,
Log.e(TAG, "Unable to retrieve header", unknownKDF)
}
if (header.version.toLong() < DatabaseHeaderKDBX.FILE_VERSION_32_4.toLong()) {
if (header.version.toKotlinLong() < DatabaseHeaderKDBX.FILE_VERSION_32_4.toKotlinLong()) {
header.innerRandomStream = CrsAlgorithm.Salsa20
header.innerRandomStreamKey = ByteArray(32)
} else {
@@ -288,7 +288,7 @@ class DatabaseOutputKDBX(private val mDatabaseKDBX: DatabaseKDBX,
throw DatabaseOutputException("Invalid random cipher")
}
if (header.version.toLong() < DatabaseHeaderKDBX.FILE_VERSION_32_4.toLong()) {
if (header.version.toKotlinLong() < DatabaseHeaderKDBX.FILE_VERSION_32_4.toKotlinLong()) {
random.nextBytes(header.streamStartBytes)
}
@@ -385,7 +385,7 @@ class DatabaseOutputKDBX(private val mDatabaseKDBX: DatabaseKDBX,
@Throws(IllegalArgumentException::class, IllegalStateException::class, IOException::class)
private fun writeObject(name: String, value: Date) {
if (header!!.version.toLong() < DatabaseHeaderKDBX.FILE_VERSION_32_4.toLong()) {
if (header!!.version.toKotlinLong() < DatabaseHeaderKDBX.FILE_VERSION_32_4.toKotlinLong()) {
writeObject(name, DatabaseKDBXXML.DateFormatter.format(value))
} else {
val dt = DateTime(value)
@@ -489,7 +489,7 @@ class DatabaseOutputKDBX(private val mDatabaseKDBX: DatabaseKDBX,
xml.startTag(null, DatabaseKDBXXML.ElemAutoType)
writeObject(DatabaseKDBXXML.ElemAutoTypeEnabled, autoType.enabled)
writeObject(DatabaseKDBXXML.ElemAutoTypeObfuscation, autoType.obfuscationOptions.toLong())
writeObject(DatabaseKDBXXML.ElemAutoTypeObfuscation, autoType.obfuscationOptions.toKotlinLong())
if (autoType.defaultSequence.isNotEmpty()) {
writeObject(DatabaseKDBXXML.ElemAutoTypeDefaultSeq, autoType.defaultSequence, true)
@@ -629,7 +629,7 @@ class DatabaseOutputKDBX(private val mDatabaseKDBX: DatabaseKDBX,
writeObject(DatabaseKDBXXML.ElemLastAccessTime, node.lastAccessTime.date)
writeObject(DatabaseKDBXXML.ElemExpiryTime, node.expiryTime.date)
writeObject(DatabaseKDBXXML.ElemExpires, node.expires)
writeObject(DatabaseKDBXXML.ElemUsageCount, node.usageCount.toLong())
writeObject(DatabaseKDBXXML.ElemUsageCount, node.usageCount.toKotlinLong())
writeObject(DatabaseKDBXXML.ElemLocationChanged, node.locationChanged.date)
xml.endTag(null, DatabaseKDBXXML.ElemTimes)

View File

@@ -104,7 +104,7 @@ class EntryOutputKDB
val binaryData = mEntry.binaryData
val binaryDataLength = binaryData?.length() ?: 0L
// Write data length
mOutputStream.write(uIntTo4Bytes(UnsignedInt.fromLong(binaryDataLength)))
mOutputStream.write(uIntTo4Bytes(UnsignedInt.fromKotlinLong(binaryDataLength)))
// Write data
if (binaryDataLength > 0) {
binaryData?.getInputDataStream().use { inputStream ->

View File

@@ -32,7 +32,7 @@ import com.kunzisoft.keepass.model.getSearchString
import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.timeout.TimeoutHelper
class SearchHelper(private val isOmitBackup: Boolean) {
class SearchHelper {
companion object {
const val MAX_SEARCH_ENTRY = 6
@@ -54,6 +54,7 @@ class SearchHelper(private val isOmitBackup: Boolean) {
// If search provide results
database.createVirtualGroupFromSearchInfo(
searchInfo.getSearchString(context),
PreferencesUtil.omitBackup(context),
MAX_SEARCH_ENTRY
)?.let { searchGroup ->
if (searchGroup.getNumberOfChildEntries() > 0) {
@@ -77,6 +78,7 @@ class SearchHelper(private val isOmitBackup: Boolean) {
fun createVirtualGroupWithSearchResult(database: Database,
searchQuery: String,
searchParameters: SearchParameters,
omitBackup: Boolean,
max: Int): Group? {
val searchGroup = database.createGroup()
@@ -101,7 +103,7 @@ class SearchHelper(private val isOmitBackup: Boolean) {
override fun operate(node: Group): Boolean {
return when {
incrementEntry >= max -> false
database.isGroupSearchable(node, isOmitBackup) -> true
database.isGroupSearchable(node, omitBackup) -> true
else -> false
}
}

View File

@@ -65,6 +65,9 @@ class MagikIME : InputMethodService(), KeyboardView.OnKeyboardActionListener {
removeEntryInfo()
assignKeyboardView()
}
lockReceiver?.backToPreviousKeyboardAction = {
switchToPreviousKeyboard()
}
registerLockReceiver(lockReceiver, true)
}
@@ -262,8 +265,12 @@ class MagikIME : InputMethodService(), KeyboardView.OnKeyboardActionListener {
}
private fun actionGoAutomatically() {
if (PreferencesUtil.isAutoGoActionEnable(this))
if (PreferencesUtil.isAutoGoActionEnable(this)) {
currentInputConnection.performEditorAction(EditorInfo.IME_ACTION_GO)
if (PreferencesUtil.isKeyboardPreviousFillInEnable(this)) {
switchToPreviousKeyboard()
}
}
}
override fun onPress(primaryCode: Int) {

View File

@@ -153,9 +153,6 @@ class ClipboardEntryNotificationService : LockNotificationService() {
val nextField = nextFields[0]
builder.setContentText(getString(R.string.select_to_copy, nextField.label))
builder.setContentIntent(getCopyPendingIntent(nextField, nextFields))
// Else tell to swipe for a clean
} else {
builder.setContentText(getString(R.string.clipboard_swipe_clean))
}
val cleanIntent = Intent(this, ClipboardEntryNotificationService::class.java)

View File

@@ -21,34 +21,41 @@ package com.kunzisoft.keepass.notifications
import android.content.Intent
import android.net.Uri
import android.os.*
import android.os.Binder
import android.os.Bundle
import android.os.IBinder
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.app.database.CipherDatabaseEntity
import com.kunzisoft.keepass.database.action.*
import com.kunzisoft.keepass.database.action.history.DeleteEntryHistoryDatabaseRunnable
import com.kunzisoft.keepass.database.action.history.RestoreEntryHistoryDatabaseRunnable
import com.kunzisoft.keepass.database.action.node.*
import com.kunzisoft.keepass.database.element.*
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.database.element.Entry
import com.kunzisoft.keepass.database.element.Group
import com.kunzisoft.keepass.database.element.database.CompressionAlgorithm
import com.kunzisoft.keepass.database.element.node.Node
import com.kunzisoft.keepass.database.element.node.NodeId
import com.kunzisoft.keepass.database.element.node.Type
import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.tasks.ActionRunnable
import com.kunzisoft.keepass.tasks.ProgressTaskUpdater
import com.kunzisoft.keepass.timeout.TimeoutHelper
import com.kunzisoft.keepass.utils.DATABASE_START_TASK_ACTION
import com.kunzisoft.keepass.utils.DATABASE_STOP_TASK_ACTION
import kotlinx.coroutines.*
import java.util.*
import java.util.concurrent.atomic.AtomicBoolean
import kotlin.collections.ArrayList
class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdater {
override val notificationId: Int = 575
private var actionRunnableAsyncTask: ActionRunnableAsyncTask? = null
private val mainScope = CoroutineScope(Dispatchers.Main)
private var mActionTaskBinder = ActionTaskBinder()
private var mActionTaskListeners = LinkedList<ActionTaskListener>()
private var mAllowFinishAction = AtomicBoolean()
private var mTitleId: Int? = null
private var mMessageId: Int? = null
@@ -60,10 +67,14 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
fun addActionTaskListener(actionTaskListener: ActionTaskListener) {
mActionTaskListeners.add(actionTaskListener)
mAllowFinishAction.set(true)
}
fun removeActionTaskListener(actionTaskListener: ActionTaskListener) {
mActionTaskListeners.remove(actionTaskListener)
if (mActionTaskListeners.size == 0) {
mAllowFinishAction.set(false)
}
}
}
@@ -155,34 +166,79 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
newNotification(intent.getIntExtra(DATABASE_TASK_TITLE_KEY, titleId))
// Build and launch the action
actionRunnableAsyncTask = ActionRunnableAsyncTask(this,
{
sendBroadcast(Intent(DATABASE_START_TASK_ACTION).apply {
putExtra(DATABASE_TASK_TITLE_KEY, titleId)
putExtra(DATABASE_TASK_MESSAGE_KEY, messageId)
putExtra(DATABASE_TASK_WARNING_KEY, warningId)
})
mainScope.launch {
executeAction(this@DatabaseTaskNotificationService,
{
sendBroadcast(Intent(DATABASE_START_TASK_ACTION).apply {
putExtra(DATABASE_TASK_TITLE_KEY, titleId)
putExtra(DATABASE_TASK_MESSAGE_KEY, messageId)
putExtra(DATABASE_TASK_WARNING_KEY, warningId)
})
mActionTaskListeners.forEach { actionTaskListener ->
actionTaskListener.onStartAction(titleId, messageId, warningId)
}
mActionTaskListeners.forEach { actionTaskListener ->
actionTaskListener.onStartAction(titleId, messageId, warningId)
}
}, { result ->
mActionTaskListeners.forEach { actionTaskListener ->
actionTaskListener.onStopAction(intentAction!!, result)
}
},
{
actionRunnableNotNull
},
{ result ->
mActionTaskListeners.forEach { actionTaskListener ->
actionTaskListener.onStopAction(intentAction!!, result)
}
sendBroadcast(Intent(DATABASE_STOP_TASK_ACTION))
sendBroadcast(Intent(DATABASE_STOP_TASK_ACTION))
stopSelf()
}
)
actionRunnableAsyncTask?.execute({ actionRunnableNotNull })
stopSelf()
}
)
}
}
return START_REDELIVER_INTENT
}
/**
* Execute action with a coroutine
*/
private suspend fun executeAction(progressTaskUpdater: ProgressTaskUpdater,
onPreExecute: () -> Unit,
onExecute: (ProgressTaskUpdater?) -> ActionRunnable?,
onPostExecute: (result: ActionRunnable.Result) -> Unit) {
mAllowFinishAction.set(false)
// Stop the opening notification
DatabaseOpenNotificationService.stop(this)
TimeoutHelper.temporarilyDisableTimeout()
onPreExecute.invoke()
withContext(Dispatchers.IO) {
onExecute.invoke(progressTaskUpdater)?.apply {
val asyncResult: Deferred<ActionRunnable.Result> = async {
val startTime = System.currentTimeMillis()
var timeIsUp = false
// Run the actionRunnable
run()
// Wait onBind or 4 seconds max
while (!mAllowFinishAction.get() && !timeIsUp) {
delay(100)
if (startTime + 4000 < System.currentTimeMillis())
timeIsUp = true
}
result
}
withContext(Dispatchers.Main) {
onPostExecute.invoke(asyncResult.await())
TimeoutHelper.releaseTemporarilyDisableTimeout()
// Start the opening notification
if (TimeoutHelper.checkTimeAndLockIfTimeout(this@DatabaseTaskNotificationService)) {
DatabaseOpenNotificationService.start(this@DatabaseTaskNotificationService)
}
}
}
}
}
private fun newNotification(title: Int) {
val builder = buildNewNotification()
@@ -256,7 +312,6 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
keyFileUri,
readOnly,
cipherEntity,
PreferencesUtil.omitBackup(this),
intent.getBooleanExtra(FIX_DUPLICATE_UUID_KEY, false),
this
) { result ->
@@ -564,33 +619,6 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
}
}
private class ActionRunnableAsyncTask(private val progressTaskUpdater: ProgressTaskUpdater,
private val onPreExecute: () -> Unit,
private val onPostExecute: (result: ActionRunnable.Result) -> Unit)
: AsyncTask<((ProgressTaskUpdater?) -> ActionRunnable), Void, ActionRunnable.Result>() {
override fun onPreExecute() {
super.onPreExecute()
onPreExecute.invoke()
}
override fun doInBackground(vararg actionRunnables: ((ProgressTaskUpdater?)-> ActionRunnable)?): ActionRunnable.Result {
var resultTask = ActionRunnable.Result(false)
actionRunnables.forEach {
it?.invoke(progressTaskUpdater)?.apply {
run()
resultTask = result
}
}
return resultTask
}
override fun onPostExecute(result: ActionRunnable.Result) {
super.onPostExecute(result)
onPostExecute.invoke(result)
}
}
companion object {
private val TAG = DatabaseTaskNotificationService::class.java.name

View File

@@ -88,30 +88,36 @@ data class OtpElement(var otpModel: OtpModel = OtpModel()) {
get() = otpModel.counter
@Throws(NumberFormatException::class)
set(value) {
otpModel.counter = if (value < MIN_HOTP_COUNTER || value > MAX_HOTP_COUNTER) {
otpModel.counter = if (isValidCounter(value)) {
value
} else {
TokenCalculator.HOTP_INITIAL_COUNTER
throw IllegalArgumentException()
} else value
}
}
var period
get() = otpModel.period
@Throws(NumberFormatException::class)
set(value) {
otpModel.period = if (value < MIN_TOTP_PERIOD || value > MAX_TOTP_PERIOD) {
otpModel.period = if (isValidPeriod(value)) {
value
} else {
TokenCalculator.TOTP_DEFAULT_PERIOD
throw NumberFormatException()
} else value
}
}
var digits
get() = otpModel.digits
@Throws(NumberFormatException::class)
set(value) {
otpModel.digits = if (value < MIN_OTP_DIGITS|| value > MAX_OTP_DIGITS) {
otpModel.digits = if (isValidDigits(value)) {
value
} else {
TokenCalculator.OTP_DEFAULT_DIGITS
throw NumberFormatException()
} else value
}
}
var algorithm
@@ -144,16 +150,15 @@ data class OtpElement(var otpModel: OtpModel = OtpModel()) {
@Throws(IllegalArgumentException::class)
fun setBase32Secret(secret: String) {
val secretChars = replaceBase32Chars(secret)
if (secretChars.isNotEmpty() && checkBase32Secret(secretChars))
otpModel.secret = Base32().decode(secretChars.toByteArray())
if (isValidBase32(secret))
otpModel.secret = Base32().decode(replaceBase32Chars(secret).toByteArray())
else
throw IllegalArgumentException()
}
@Throws(IllegalArgumentException::class)
fun setBase64Secret(secret: String) {
if (secret.isNotEmpty() && checkBase64Secret(secret))
if (isValidBase64(secret))
otpModel.secret = Base64().decode(secret.toByteArray())
else
throw IllegalArgumentException()
@@ -184,11 +189,33 @@ data class OtpElement(var otpModel: OtpModel = OtpModel()) {
const val MAX_HOTP_COUNTER = Long.MAX_VALUE
const val MIN_TOTP_PERIOD = 1
const val MAX_TOTP_PERIOD = 60
const val MAX_TOTP_PERIOD = 900
const val MIN_OTP_DIGITS = 4
const val MAX_OTP_DIGITS = 18
fun isValidCounter(counter: Long): Boolean {
return counter in MIN_HOTP_COUNTER..MAX_HOTP_COUNTER
}
fun isValidPeriod(period: Int): Boolean {
return period in MIN_TOTP_PERIOD..MAX_TOTP_PERIOD
}
fun isValidDigits(digits: Int): Boolean {
return digits in MIN_OTP_DIGITS..MAX_OTP_DIGITS
}
fun isValidBase32(secret: String): Boolean {
val secretChars = replaceBase32Chars(secret)
return secretChars.isNotEmpty() && checkBase32Secret(secretChars)
}
fun isValidBase64(secret: String): Boolean {
// TODO replace base 64 chars
return secret.isNotEmpty() && checkBase64Secret(secret)
}
fun replaceSpaceChars(parameter: String): String {
return parameter.replace("[\\r|\\n|\\t|\\s|\\u00A0]+".toRegex(), "")
}

View File

@@ -26,8 +26,6 @@ import com.kunzisoft.keepass.database.element.security.ProtectedString
import com.kunzisoft.keepass.model.Field
import com.kunzisoft.keepass.otp.OtpElement.Companion.replaceSpaceChars
import com.kunzisoft.keepass.otp.TokenCalculator.*
import java.lang.Exception
import java.lang.StringBuilder
import java.net.URLEncoder
import java.util.*
import java.util.regex.Pattern

View File

@@ -369,6 +369,18 @@ object PreferencesUtil {
context.resources.getBoolean(R.bool.keyboard_key_sound_default))
}
fun isKeyboardPreviousDatabaseCredentialsEnable(context: Context): Boolean {
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
return prefs.getBoolean(context.getString(R.string.keyboard_previous_database_credentials_key),
context.resources.getBoolean(R.bool.keyboard_previous_database_credentials_default))
}
fun isKeyboardPreviousFillInEnable(context: Context): Boolean {
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
return prefs.getBoolean(context.getString(R.string.keyboard_previous_fill_in_key),
context.resources.getBoolean(R.bool.keyboard_previous_fill_in_default))
}
fun isAutofillAutoSearchEnable(context: Context): Boolean {
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
return prefs.getBoolean(context.getString(R.string.autofill_auto_search_key),

View File

@@ -92,6 +92,9 @@ open class SettingsActivity
lockAndExit()
}
// Focus view to reinitialize timeout
resetAppTimeoutWhenViewFocusedOrChanged(coordinatorLayout)
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction()
.add(R.id.fragment_container, retrieveMainFragment())

View File

@@ -36,7 +36,6 @@ import com.kunzisoft.androidclearchroma.colormode.ColorMode
import com.kunzisoft.androidclearchroma.fragment.ChromaColorFragment
import com.kunzisoft.androidclearchroma.fragment.ChromaColorFragment.*
import com.kunzisoft.keepass.R
import java.lang.Exception
class DatabaseColorPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() {

View File

@@ -81,7 +81,7 @@ class HashedBlockInputStream(inputStream: InputStream) : InputStream() {
bufferPos = 0
val index = baseStream.readUInt()
if (index.toLong() != bufferIndex) {
if (index.toKotlinLong() != bufferIndex) {
throw IOException("Invalid data format")
}
bufferIndex++
@@ -91,7 +91,7 @@ class HashedBlockInputStream(inputStream: InputStream) : InputStream() {
throw IOException("Invalid data format")
}
val bufferSize = baseStream.readBytes4ToUInt().toInt()
val bufferSize = baseStream.readBytes4ToUInt().toKotlinInt()
if (bufferSize == 0) {
for (hash in 0 until HASH_SIZE) {
if (storedHash[hash].toInt() != 0) {
@@ -141,7 +141,7 @@ class HashedBlockInputStream(inputStream: InputStream) : InputStream() {
if (!readHashedBlock()) return -1
}
val output = UnsignedInt.fromByte(buffer[bufferPos]).toInt()
val output = UnsignedInt.fromKotlinByte(buffer[bufferPos]).toKotlinInt()
bufferPos++
return output

View File

@@ -99,7 +99,7 @@ class HashedBlockOutputStream : OutputStream {
@Throws(IOException::class)
private fun writeHashedBlock() {
baseStream.writeUInt(UnsignedInt.fromLong(bufferIndex))
baseStream.writeUInt(UnsignedInt.fromKotlinLong(bufferIndex))
bufferIndex++
if (bufferPos > 0) {

View File

@@ -44,7 +44,7 @@ class HmacBlockInputStream(baseStream: InputStream, private val verify: Boolean,
if (!readSafeBlock()) return -1
}
val output = UnsignedInt.fromByte(buffer[bufferPos]).toInt()
val output = UnsignedInt.fromKotlinByte(buffer[bufferPos]).toKotlinInt()
bufferPos++
return output
@@ -101,7 +101,7 @@ class HmacBlockInputStream(baseStream: InputStream, private val verify: Boolean,
val blockSize = bytes4ToUInt(pbBlockSize)
bufferPos = 0
buffer = baseStream.readBytes(blockSize.toInt())
buffer = baseStream.readBytes(blockSize.toKotlinInt())
if (verify) {
val cmpHmac: ByteArray
@@ -135,7 +135,7 @@ class HmacBlockInputStream(baseStream: InputStream, private val verify: Boolean,
blockIndex++
if (blockSize.toLong() == 0L) {
if (blockSize.toKotlinLong() == 0L) {
endOfStream = true
return false
}

View File

@@ -171,11 +171,11 @@ fun bytes5ToDate(buf: ByteArray, calendar: Calendar = Calendar.getInstance()): D
System.arraycopy(buf, 0, cDate, 0, dateSize)
val readOffset = 0
val dw1 = UnsignedInt.fromByte(cDate[readOffset]).toInt()
val dw2 = UnsignedInt.fromByte(cDate[readOffset + 1]).toInt()
val dw3 = UnsignedInt.fromByte(cDate[readOffset + 2]).toInt()
val dw4 = UnsignedInt.fromByte(cDate[readOffset + 3]).toInt()
val dw5 = UnsignedInt.fromByte(cDate[readOffset + 4]).toInt()
val dw1 = UnsignedInt.fromKotlinByte(cDate[readOffset]).toKotlinInt()
val dw2 = UnsignedInt.fromKotlinByte(cDate[readOffset + 1]).toKotlinInt()
val dw3 = UnsignedInt.fromKotlinByte(cDate[readOffset + 2]).toKotlinInt()
val dw4 = UnsignedInt.fromKotlinByte(cDate[readOffset + 3]).toKotlinInt()
val dw5 = UnsignedInt.fromKotlinByte(cDate[readOffset + 4]).toKotlinInt()
// Unpack 5 byte structure to date and time
val year = dw1 shl 6 or (dw2 shr 2)
@@ -199,7 +199,7 @@ fun bytes5ToDate(buf: ByteArray, calendar: Calendar = Calendar.getInstance()): D
fun uIntTo4Bytes(value: UnsignedInt): ByteArray {
val buf = ByteArray(4)
for (i in 0 until 4) {
buf[i] = (value.toInt().ushr(8 * i) and 0xFF).toByte()
buf[i] = (value.toKotlinInt().ushr(8 * i) and 0xFF).toByte()
}
return buf
}
@@ -246,8 +246,8 @@ fun dateTo5Bytes(date: Date, calendar: Calendar = Calendar.getInstance()): ByteA
val minute = calendar.get(Calendar.MINUTE)
val second = calendar.get(Calendar.SECOND)
buf[0] = UnsignedInt(year shr 6 and 0x0000003F).toByte()
buf[1] = UnsignedInt(year and 0x0000003F shl 2 or (month shr 2 and 0x00000003)).toByte()
buf[0] = UnsignedInt(year shr 6 and 0x0000003F).toKotlinByte()
buf[1] = UnsignedInt(year and 0x0000003F shl 2 or (month shr 2 and 0x00000003)).toKotlinByte()
buf[2] = (month and 0x00000003 shl 6
or (day and 0x0000001F shl 1) or (hour shr 4 and 0x00000001)).toByte()
buf[3] = (hour and 0x0000000F shl 4 or (minute shr 2 and 0x0000000F)).toByte()

View File

@@ -21,7 +21,6 @@ package com.kunzisoft.keepass.tasks
import android.os.Bundle
import com.kunzisoft.keepass.database.exception.DatabaseException
import java.lang.Exception
/**
* Callback after a task is completed.

View File

@@ -38,6 +38,7 @@ object TimeoutHelper {
private const val TAG = "TimeoutHelper"
private var lastAppTimeoutRecord: Long? = null
var temporarilyDisableTimeout = false
private set
@@ -84,9 +85,15 @@ object TimeoutHelper {
* Record the current time, to check it later with checkTime and start a new lock timer
*/
fun recordTime(context: Context) {
// Record timeout time in case timeout service is killed
PreferencesUtil.saveCurrentTime(context)
startLockTimer(context)
// To prevent spam registration, record after at least 2 seconds
if (lastAppTimeoutRecord == null
|| lastAppTimeoutRecord!! + 2000 <= System.currentTimeMillis()) {
Log.d(TAG, "Record app timeout")
// Record timeout time in case timeout service is killed
PreferencesUtil.saveCurrentTime(context)
startLockTimer(context)
lastAppTimeoutRecord = System.currentTimeMillis()
}
}
/**

View File

@@ -42,10 +42,12 @@ const val DATABASE_STOP_TASK_ACTION = "com.kunzisoft.keepass.DATABASE_STOP_TASK_
const val LOCK_ACTION = "com.kunzisoft.keepass.LOCK"
const val REMOVE_ENTRY_MAGIKEYBOARD_ACTION = "com.kunzisoft.keepass.REMOVE_ENTRY_MAGIKEYBOARD"
const val BACK_PREVIOUS_KEYBOARD_ACTION = "com.kunzisoft.keepass.BACK_PREVIOUS_KEYBOARD"
class LockReceiver(var lockAction: () -> Unit) : BroadcastReceiver() {
var mLockPendingIntent: PendingIntent? = null
var backToPreviousKeyboardAction: (() -> Unit)? = null
override fun onReceive(context: Context, intent: Intent) {
// If allowed, lock and exit
@@ -76,7 +78,12 @@ class LockReceiver(var lockAction: () -> Unit) : BroadcastReceiver() {
}
}
LOCK_ACTION,
REMOVE_ENTRY_MAGIKEYBOARD_ACTION -> lockAction.invoke()
REMOVE_ENTRY_MAGIKEYBOARD_ACTION -> {
lockAction.invoke()
}
BACK_PREVIOUS_KEYBOARD_ACTION -> {
backToPreviousKeyboardAction?.invoke()
}
else -> {}
}
}
@@ -93,14 +100,16 @@ class LockReceiver(var lockAction: () -> Unit) : BroadcastReceiver() {
}
fun Context.registerLockReceiver(lockReceiver: LockReceiver?,
registerRemoveEntryMagikeyboard: Boolean = false) {
registerKeyboardAction: Boolean = false) {
lockReceiver?.let {
registerReceiver(it, IntentFilter().apply {
addAction(Intent.ACTION_SCREEN_OFF)
addAction(Intent.ACTION_SCREEN_ON)
addAction(LOCK_ACTION)
if (registerRemoveEntryMagikeyboard)
if (registerKeyboardAction) {
addAction(REMOVE_ENTRY_MAGIKEYBOARD_ACTION)
addAction(BACK_PREVIOUS_KEYBOARD_ACTION)
}
})
}
}

View File

@@ -21,31 +21,31 @@ package com.kunzisoft.keepass.utils
class UnsignedInt(private var unsignedValue: Int) {
constructor(unsignedValue: UnsignedInt) : this(unsignedValue.toInt())
constructor(unsignedValue: UnsignedInt) : this(unsignedValue.toKotlinInt())
/**
* Get the int value
*/
fun toInt(): Int {
fun toKotlinInt(): Int {
return unsignedValue
}
/**
* Convert an unsigned Integer to Long
*/
fun toLong(): Long {
fun toKotlinLong(): Long {
return unsignedValue.toLong() and INT_TO_LONG_MASK
}
/**
* Convert an unsigned Integer to Byte
*/
fun toByte(): Byte {
fun toKotlinByte(): Byte {
return (unsignedValue and 0xFF).toByte()
}
override fun toString():String {
return toLong().toString()
return toKotlinLong().toString()
}
override fun equals(other: Any?): Boolean {
@@ -72,12 +72,12 @@ class UnsignedInt(private var unsignedValue: Int) {
/**
* Convert a byte to an unsigned byte
*/
fun fromByte(value: Byte): UnsignedInt {
fun fromKotlinByte(value: Byte): UnsignedInt {
return UnsignedInt(value.toInt() and 0xFF)
}
@Throws(NumberFormatException::class)
fun fromLong(value: Long): UnsignedInt {
fun fromKotlinLong(value: Long): UnsignedInt {
if (value > UINT_MAX_VALUE)
throw NumberFormatException("UInt value > $UINT_MAX_VALUE")
return UnsignedInt(value.toInt())

View File

@@ -24,7 +24,7 @@ class UnsignedLong(private var unsignedValue: Long) {
/**
* Convert an unsigned Integer to Long
*/
fun toLong(): Long {
fun toKotlinLong(): Long {
return unsignedValue
}

View File

@@ -127,13 +127,13 @@ open class VariantDictionary {
if (bType == VdType.None) {
break
}
val nameLen = inputStream.readUInt().toInt()
val nameLen = inputStream.readUInt().toKotlinInt()
val nameBuf = inputStream.readBytes(nameLen)
if (nameLen != nameBuf.size) {
throw IOException("Invalid format")
}
val name = String(nameBuf, UTF8Charset)
val valueLen = inputStream.readUInt().toInt()
val valueLen = inputStream.readUInt().toKotlinInt()
val valueBuf = inputStream.readBytes(valueLen)
if (valueLen != valueBuf.size) {
throw IOException("Invalid format")
@@ -149,7 +149,7 @@ open class VariantDictionary {
dictionary.setBool(name, valueBuf[0] != 0.toByte())
}
VdType.Int32 -> if (valueLen == 4) {
dictionary.setInt32(name, bytes4ToUInt(valueBuf).toInt())
dictionary.setInt32(name, bytes4ToUInt(valueBuf).toKotlinInt())
}
VdType.Int64 -> if (valueLen == 8) {
dictionary.setInt64(name, bytes64ToLong(valueBuf))

View File

@@ -31,7 +31,7 @@ class SpecialModeView @JvmOverloads constructor(context: Context,
: Toolbar(context, attrs, defStyle) {
init {
setNavigationIcon(R.drawable.ic_close_white_24dp)
setNavigationIcon(R.drawable.ic_arrow_back_white_24dp)
title = resources.getString(R.string.selection_mode)
}

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<group>
<path
android:fillColor="#ffffff"
android:strokeWidth="1.78885484"
android:pathData="M 9.6582031 2.3417969 C 9.4025809 2.3417969 9.1470385 2.4408503 8.9511719 2.6367188 L 3.2929688 8.2929688 C 2.9012354 8.6847056 2.9012354 9.3152944 3.2929688 9.7070312 L 8.9511719 15.363281 C 9.3429052 15.755018 9.973501 15.755018 10.365234 15.363281 C 10.756968 14.971544 10.756968 14.340956 10.365234 13.949219 L 6.4160156 10 L 16 10 L 16 10.03125 A 4.5000001 4.5000001 0 0 1 20 14.5 A 4.5000001 4.5000001 0 0 1 16 18.966797 L 16 19 L 7 19 C 6.4460006 19 6 19.446001 6 20 C 6 20.553999 6.4460006 21 7 21 L 16 21 C 16.123984 21 16.240233 20.970575 16.349609 20.929688 A 6.5000001 6.5000001 0 0 0 22 14.5 A 6.5000001 6.5000001 0 0 0 16 8.0214844 L 16 8 L 6.4160156 8 L 10.365234 4.0507812 C 10.756968 3.6590444 10.756968 3.0284556 10.365234 2.6367188 C 10.169368 2.4408503 9.9138254 2.3417969 9.6582031 2.3417969 z" />
</group>
</vector>

View File

@@ -21,6 +21,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_group_container_view"
android:layout_width="match_parent"
android:layout_height="match_parent">

View File

@@ -140,7 +140,7 @@
android:importantForAutofill="no"
android:hint="@string/otp_period"
tools:text="30"
android:maxLength="2"
android:maxLength="3"
android:digits="0123456789"
tools:targetApi="jelly_bean" />
</com.google.android.material.textfield.TextInputLayout>

View File

@@ -29,7 +29,6 @@
<string name="clipboard_cleared">مُسِحت الحافظة</string>
<string name="clipboard_error_title">خطأ في الحافظة</string>
<string name="clipboard_error_clear">تعذَّر مسح الحافظة</string>
<string name="clipboard_swipe_clean">اسحب لمسح الحافظة فورًا</string>
<string name="database">قاعدة البيانات</string>
<string name="decrypting_db">يفك تعمية محتوى قاعدة البيانات…</string>
<string name="digits">أرقام</string>
@@ -134,21 +133,21 @@
<string name="error_nokeyfile">اختر ملف مفتاح.</string>
<string name="error_out_of_memory">لا ذاكرة لتحميل قاعدة البيانات كاملة.</string>
<string name="error_load_database">تعذر تحميل قاعدة البيانات.</string>
<string name="error_load_database_KDF_memory">غير قادر على تحميل المفتاح، في محاولة لتقليل الذاكرة المستخدمة من قبل KDF.</string>
<string name="error_pass_gen_type">يجب تحديد كلمة مرور واحد على الأقل نوع الجيل</string>
<string name="error_load_database_KDF_memory">لا يمكن تحميل المفتاح، حاول تقليل \"الذاكرة المستخدمة\" من قبل KDF.</string>
<string name="error_pass_gen_type">يجب تحديد على الأقل نوعا واحدا لتوليد كلمة مرور.</string>
<string name="error_rounds_too_large">\"جولات\" كبيرة جداً. الإعداد إلى 2147483648.</string>
<string name="error_string_key">يجب أن يكون لكل سلسلة اسم حقل.</string>
<string name="error_wrong_length">أدخل عددًا صحيحًا موجبًا في حقل «الطول».</string>
<string name="error_autofill_enable_service">تعذر تمكين خدمة الملء التلقائي.</string>
<string name="error_move_folder_in_itself">غير قادر على نقل مجموعة إلى نفسها.</string>
<string name="file_not_found_content">تعذر إيجاد الملف. جرِّب فتحه من متصفح ملفات.</string>
<string name="file_browser">متصفح الملفات</string>
<string name="file_browser">مدير الملفات</string>
<string name="invalid_credentials">تعذرت قراءة كلمة السر أو ملف المفتاح.</string>
<string name="invalid_db_sig">تعذر تمييز نسق قاعدة البيانات.</string>
<string name="keyfile_is_empty">ملف المفتاح فارغ.</string>
<string name="list_entries_show_username_title">أظهر أسماء المستخدمين</string>
<string name="list_entries_show_username_summary">أظهر أسماء المستخدمين في قوائم المدخلات</string>
<string name="hint_generated_password">كلمةالسر المشفرة</string>
<string name="hint_generated_password">كلمةالسر الموَلدة</string>
<string name="hint_keyfile">الملف المفتاحي</string>
<string name="hide_password_title">اخفاء كلمات السر</string>
<string name="copy_field">نُسخ %1$s</string>
@@ -285,4 +284,45 @@
<string name="validate">تأكيد</string>
<string name="security">الأمان</string>
<string name="master_key">المفتاح الرئيسي</string>
<string name="error_otp_period">يجب ان تكون المدة بين %1$d و%2$d ثانية.</string>
<string name="error_otp_secret_key">المفتاح السري يجب ان يكون بصيغة Base32.</string>
<string name="error_save_database">لا يمكن حفظ قاعدة البيانات.</string>
<string name="error_create_database">غير قادر على إنشاء ملف قاعدة البيانات.</string>
<string name="error_copy_group_here">لا يمكنك نسخ مجموعة هنا.</string>
<string name="error_label_exists">هذه التسمية موجودة بالفعل.</string>
<string name="otp_period">المدة (ثواني)</string>
<string name="otp_algorithm">الخوارزمية</string>
<string name="otp_digits">أرقام</string>
<string name="otp_counter">العداد</string>
<string name="entry_setup_otp">عين كلمة المرور للمرة الواحدة</string>
<string name="entry_UUID">UUID</string>
<string name="html_about_contribution">من أجل &lt;strong&gt;حماية خصوصيتا&lt;/strong&gt;٫&lt;strong&gt; إصلاح العلل&lt;/strong&gt;٫ &lt;strong&gt;إضافة مميزات&lt;/strong&gt; &lt;strong&gt;وجعلنا نشطاء دائما&lt;/strong&gt;٫ نحن نعتمد على &lt;strong&gt;مساهمتك&lt;/strong&gt;.</string>
<string name="content_description_keyfile_checkbox">خانة تأشير الملف المفتاحي</string>
<string name="content_description_password_checkbox">خانة تأشير كلمة المرور</string>
<string name="content_description_add_item">أضف عنصر</string>
<string name="warning_permanently_delete_nodes">حذف العقد المحددة نهائيا؟</string>
<string name="filter">مرشح</string>
<string name="command_execution">ينفذ الأمر…</string>
<string name="hide_broken_locations_title">اِخفي روابط قواعد البيانات المعطلة</string>
<string name="show_recent_files_summary">أظهر موقع قواعد البيانات الأخيرة</string>
<string name="show_recent_files_title">أظهر الملفات الأخيرة</string>
<string name="remember_keyfile_locations_summary">تذكر موقع الملفات المفتاحية لقاعدة البيانات</string>
<string name="remember_keyfile_locations_title">احفظ موقع الملف المفتاحي</string>
<string name="remember_database_locations_summary">تذكر موقع قاعدة البيانات</string>
<string name="remember_database_locations_title">موقع تخزين قاعدة البيانات</string>
<string name="contains_duplicate_uuid_procedure">للمتابعة هل تريد حل المشكلة بتوليد UUID للعناصر المكررة ؟</string>
<string name="contains_duplicate_uuid">تحتوي قاعدة البيانات على UUID مكرر.</string>
<string name="auto_focus_search_title">البحث السريع</string>
<string name="omit_backup_search_summary">أزِل مجموعتي \"سلة المحذوفات\" و\" النسخ الاحتياطي\" من نتائج البحث</string>
<string name="menu_delete_entry_history">احذف السجل</string>
<string name="menu_restore_entry_history">استعادة السجل</string>
<string name="menu_empty_recycle_bin">أفرغ سلة المحذوفات</string>
<string name="menu_save_database">اِحفظ قاعدة البيانات</string>
<string name="menu_master_key_settings">إعدادات المفتاح الرئيسي</string>
<string name="menu_security_settings">إعدادات الأمن</string>
<string name="creating_database">ينشئ قاعدة البيانات…</string>
<string name="error_string_type">لا يطابق هذا النص العنصر المطلوب.</string>
<string name="error_otp_counter">على العداد أن يكون ما بين %1$d و %2$d.</string>
<string name="entry_otp">كلمة مرور لمرة واحدة</string>
<string name="otp_type">نوع كلمة المرور لمرة واحدة</string>
</resources>

View File

@@ -295,7 +295,6 @@
<string name="content_description_add_node">Afegeix node</string>
<string name="content_description_open_file">Obre fitxer</string>
<string name="content_description_background">Fons</string>
<string name="clipboard_swipe_clean">Llisqueu per a netejear el porta-retalls ara</string>
<string name="clipboard_error_clear">No ha estat possible netejar el porta-retalls</string>
<string name="clipboard_error">Alguns dispositius no permeten que les aplicacions facin servir el porta-retalls.</string>
<string name="clipboard_error_title">Error del porta-retalls</string>

View File

@@ -156,7 +156,6 @@
<string name="key_derivation_function">Funkce pro tvorbu klíče</string>
<string name="extended_ASCII">Rozšířené ASCII</string>
<string name="allow">Umožnit</string>
<string name="clipboard_swipe_clean">Schránku vymažete přejetím</string>
<string name="error_load_database">Databázi se nedaří načíst.</string>
<string name="error_load_database_KDF_memory">Klíč se nedaří načíst, zkuste snížit množství paměti, využívané funkcí pro tvorbu klíče.</string>
<string name="error_autofill_enable_service">Službu automatického vyplňování se nedaří zapnout.</string>
@@ -280,11 +279,10 @@
<string name="education_entry_new_field_summary">Registrovat další kolonku, zadat hodnotu a volitelně ji ochránit.</string>
<string name="education_unlock_title">Odemknout databázi</string>
<string name="education_read_only_title">Ochraňte svou databázi před zápisem</string>
<string name="education_read_only_summary">Změnit režim otevírání pro dané sezení.
\n
\nV režimu pouze pro čtení zabráníte nechtěným změnám do databáze.
\n
\nV režimu zápisu je možné přidávat, mazat nebo měnit všechny prvky dle libosti.</string>
<string name="education_read_only_summary">Změnit režim otevírání pro dané sezení.
\n
\nV režimu pouze pro čtení zabráníte nechtěným změnám do databáze.
\n V režimu zápisu je možné přidávat, mazat nebo měnit všechny prvky dle libosti.</string>
<string name="education_field_copy_title">Zkopírujte kolonku</string>
<string name="education_field_copy_summary">Zkopírované kolonky lze vkládat kam chcete
\n
@@ -469,7 +467,7 @@
<string name="validate">Ověřit</string>
<string name="education_setup_OTP_summary">Nastavit správu One-Time hesla (HOTP / TOTP) pro založení tokenu požadovaného pro dvoufázové ověření (2FA).</string>
<string name="education_setup_OTP_title">Nastavit OTP</string>
<string name="autofill_auto_search_summary">Automaticky navrhne výsledky hledání z webové domény nebo Id aplikace</string>
<string name="autofill_auto_search_summary">Automaticky navrhnout výsledky hledání z webové domény nebo ID aplikace</string>
<string name="autofill_auto_search_title">Samočinné hledání</string>
<string name="lock_database_show_button_summary">Ukáže tlačítko zámku v uživatelském rozhraní</string>
<string name="lock_database_show_button_title">Ukázat tlačítko zámku</string>
@@ -478,4 +476,15 @@
<string name="error_label_exists">Tento štítek již existuje.</string>
<string name="keyboard_search_share_summary">Automaticky vyhledat sdílené informace pro naplnění klávesnice</string>
<string name="keyboard_search_share_title">Prohledat sdílené info</string>
<string name="autofill_block_restart">Aktivovat zamezení restartováním aplikace obsahující formulář.</string>
<string name="autofill_block">Zamezit samovyplnění</string>
<string name="autofill_web_domain_blocklist_summary">Seznam domén, pro něž se zamezí samovyplnění</string>
<string name="autofill_web_domain_blocklist_title">Seznam blokovaných webových domén</string>
<string name="autofill_application_id_blocklist_summary">Seznam aplikací, v nichž se zamezí samovyplnění</string>
<string name="autofill_application_id_blocklist_title">Seznam blokovaných aplikací</string>
<string name="filter">Vytřídit</string>
<string name="subdomain_search_summary">Hledat ve webových doménách s omezením subdomén</string>
<string name="subdomain_search_title">Hledat v subdoméně</string>
<string name="error_string_type">Tento text se s požadovanou položkou neshoduje.</string>
<string name="content_description_add_item">Přidat položku</string>
</resources>

View File

@@ -155,7 +155,6 @@
<string name="key_derivation_function">Nøgleafledningsfunktion</string>
<string name="extended_ASCII">Udvidet ASCII</string>
<string name="allow">Tillad</string>
<string name="clipboard_swipe_clean">Stryg for at at rydde udklipsholder nu</string>
<string name="error_load_database">Databasen kunne ikke indlæses.</string>
<string name="error_load_database_KDF_memory">Kunne ikke indlæse nøglen. Prøv at reducere KDF \"hukommelsesforbrug\".</string>
<string name="error_autofill_enable_service">Kunne ikke aktivere autofyld tjenesten.</string>

View File

@@ -186,7 +186,7 @@
<string name="list_password_generator_options_summary">Erlaubte Zeichen für Passwortgenerator festlegen</string>
<string name="list_password_generator_options_title">Passwortzeichen</string>
<string name="configure_biometric">Die biometrische Abfrage wird unterstützt, ist aber nicht eingerichtet.</string>
<string name="open_biometric_prompt_unlock_database">Biometrie-Abfrage öffnen, um die Datenbank zu entsperrenœ</string>
<string name="open_biometric_prompt_unlock_database">Biometrie-Abfrage öffnen, um die Datenbank zu entsperren</string>
<string name="encrypted_value_stored">Verschlüsseltes Passwort wurde gespeichert</string>
<string name="biometric_invalid_key">Der biometrische Schlüssel kann nicht gelesen werden. Bitte löschen Sie ihn und wiederholen Sie den biometrischen Erkennungsprozess.</string>
<string name="biometric_scanning_error">Biometrischer Fehler: %1$s</string>
@@ -198,7 +198,6 @@
<string name="key_derivation_function">Schlüsselableitungsfunktion</string>
<string name="extended_ASCII">Erweiterte ASCII</string>
<string name="allow">Erlauben</string>
<string name="clipboard_swipe_clean">Wischen, um Zwischenablage jetzt zu leeren</string>
<string name="error_autofill_enable_service">Autofill-Dienst kann nicht aktiviert werden.</string>
<string name="copy_field">Kopie von %1$s</string>
<string name="menu_form_filling_settings">Formularausfüllung</string>
@@ -479,7 +478,7 @@
<string name="discard">Verwerfen</string>
<string name="discard_changes">Änderungen verwerfen\?</string>
<string name="validate">Validieren</string>
<string name="autofill_auto_search_summary">Suchergebnissen aus der Web-Domain oder Anwendung-ID automatisch vorschlagen</string>
<string name="autofill_auto_search_summary">Suchergebnisse aus der Web-Domain oder Anwendungs-ID automatisch vorschlagen</string>
<string name="autofill_auto_search_title">Automatische Suche</string>
<string name="lock_database_show_button_summary">Zeigt die Sperrtaste in der Benutzeroberfläche an</string>
<string name="lock_database_show_button_title">Sperrtaste anzeigen</string>
@@ -488,4 +487,15 @@
<string name="error_label_exists">Diese Bezeichnung existiert bereits.</string>
<string name="keyboard_search_share_summary">Automatische Suche nach gemeinsam genutzten Informationen zur Belegung der Tastatur</string>
<string name="keyboard_search_share_title">Gemeinsame Infos durchsuchen</string>
<string name="autofill_block_restart">Starten Sie die Anwendung, die das Formular enthält, neu, um die Sperrung zu aktivieren.</string>
<string name="autofill_block">Automatisches Füllen blockieren</string>
<string name="autofill_web_domain_blocklist_summary">Blockliste, die das automatische Füllen von Web-Domains verhindert</string>
<string name="autofill_web_domain_blocklist_title">Web-Domain-Blockliste</string>
<string name="autofill_application_id_blocklist_summary">Blockliste, die das automatische Füllen von Apps verhindert</string>
<string name="autofill_application_id_blocklist_title">Anwendungs-Blockliste</string>
<string name="subdomain_search_summary">Suche Web-Domains mit Subdomain-Beschränkungen</string>
<string name="subdomain_search_title">Subdomain-Suche</string>
<string name="error_string_type">Dieser Text stimmt nicht mit dem angeforderten Element überein.</string>
<string name="content_description_add_item">Element hinzufügen</string>
<string name="filter">Filter</string>
</resources>

View File

@@ -157,7 +157,6 @@
<string name="key_derivation_function">Λειτουργία εξαγωγής κλειδιών</string>
<string name="extended_ASCII">Extended ASCII</string>
<string name="allow">Δέχομαι</string>
<string name="clipboard_swipe_clean">Σύρετε για να διαγράψετε το πρόχειρο τώρα</string>
<string name="error_autofill_enable_service">Δεν ήταν δυνατή η ενεργοποίηση της υπηρεσίας αυτόματης συμπλήρωσης.</string>
<string name="file_not_found_content">Δεν ήταν δυνατή η εύρεση αρχείου. Δοκιμάστε να το ανοίξετε ξανά από το πρόγραμμα περιήγησης αρχείων σας.</string>
<string name="copy_field">Αντιγραφή του %1$s</string>

View File

@@ -148,7 +148,6 @@
<string name="clipboard_error_title">Error del portapapeles</string>
<string name="clipboard_error">Algunos dispositivos Android tienen un error en la implementación del portapapeles que provoca fallos al copiar desde las aplicaciones.</string>
<string name="clipboard_error_clear">Falló la limpieza del portapapeles</string>
<string name="clipboard_swipe_clean">Deslizar ahora para limpiar el portapapeles</string>
<string name="error_string_key">Cada cadena debe tener un nombre de campo.</string>
<string name="error_autofill_enable_service">No se pudo activar el servicio de compleción automática.</string>
<string name="field_name">Nombre del campo</string>

View File

@@ -39,10 +39,11 @@
<string name="select_to_copy">Valitse kopioidaksesi %1$s</string>
<string name="retrieving_db_key">Luodaan tietokanta-avainta…</string>
<string name="database">Tietokanta</string>
<string name="decrypting_db">Puretaan tietokannan salausta</string>
<string name="decrypting_db">Puretaan tietokannan sisältöä</string>
<string name="default_checkbox">Käytä tätä oletustietokantana</string>
<string name="digits">Numerot</string>
<string name="html_about_licence">KeePassDX © %1$d Kunzisoft comes with absolutely no warranty. This is free software, and you are welcome to redistribute it under the conditions of the GPL version 3 or later.</string>
<string name="html_about_licence">KeePassDX © %1$d Kunzisoft on &lt;strong&gt;avointa lähdekoodia&lt;/strong&gt; ja &lt;strong&gt;mainokseton&lt;/strong&gt;.
\nSe tarjotaan sellaisenaan &lt;strong&gt;GPLv3&lt;/strong&gt; lisenssillä ja ilman takuuta.</string>
<string name="select_database_file">Anna tietokannan tiedostonimi</string>
<string name="entry_accessed">Käytetty</string>
<string name="entry_cancel">Peruuta</string>
@@ -58,18 +59,18 @@
<string name="entry_title">Nimi</string>
<string name="entry_url">URL-osoite</string>
<string name="entry_user_name">Käyttäjänimi</string>
<string name="error_arc4">The Arcfour stream cipher ei ole tuettu.</string>
<string name="error_arc4">Arcfour stream cipher ei ole tuettu.</string>
<string name="error_can_not_handle_uri">KeePassDX ei osaa käsitellä tätä osoitetta.</string>
<string name="error_file_not_create">Tiedoston luonti epäonnistui:</string>
<string name="error_invalid_db">Viallinen salasanatietokanta.</string>
<string name="error_invalid_path">Viallinen hakemistopolku.</string>
<string name="error_no_name">Nimi puuttuu.</string>
<string name="error_nokeyfile">Salasana tai avaintiedosto puuttuu.</string>
<string name="error_out_of_memory">Puhelimesta loppui muisti salasanatietokantaa avatessa. Tietokanta voi olla liian suuri tälle puhelinmallille.</string>
<string name="error_invalid_db">Tietokantaa ei pystytty lukemaan.</string>
<string name="error_invalid_path">Varmista että polku on oikein.</string>
<string name="error_no_name">Anna nimi.</string>
<string name="error_nokeyfile">Valitse avaintiedosto.</string>
<string name="error_out_of_memory">Ei tarpeeksi tallennustilaa ladatakseen koko tietokantaa.</string>
<string name="error_pass_gen_type">Vähintään yksi salasanagenerointitapa täytyy olla valittuna.</string>
<string name="error_pass_match">Salasanat eivät täsmää.</string>
<string name="error_rounds_too_large">Kierroksia on liian paljon. Asetetaan se arvoon 2147483648.</string>
<string name="error_string_key">Kentän nimi on pakollinen joka tekstille.</string>
<string name="error_string_key">Jokaisella tekstillä tulee olla kentässä nimi.</string>
<string name="error_wrong_length">Syötä positiivinen kokonaisluku pituus-kenttään</string>
<string name="field_name">Kentän nimi</string>
<string name="field_value">Kentän arvo</string>
@@ -149,7 +150,6 @@
<item>Keskikokoinen</item>
<item>Suuri</item>
</string-array>
<string name="clipboard_swipe_clean">Pyyhkäise tyhjentääksesi leikepöydän</string>
<string name="allow">Salli</string>
<string name="extended_ASCII">Laajennettu ASCII</string>
<string name="key_derivation_function">Avaimen derivointifunktio</string>
@@ -160,4 +160,40 @@
<string name="encryption">Salaus</string>
<string name="security">Turvallisuus</string>
<string name="edit_entry">Muokkaa merkintää</string>
</resources>
<string name="error_disallow_no_credentials">Ainakin yksi pääsytieto tulee olla asetettuna.</string>
<string name="error_load_database_KDF_memory">Avainta ei pystytty lataamaan. Kokeile vähentää KDF \"Muistin käyttöä\".</string>
<string name="error_load_database">Tietokantaa ei pystytty avaamaan.</string>
<string name="error_invalid_OTP">Virheellinen OTP salaisuus.</string>
<string name="entry_otp">OTP</string>
<string name="otp_algorithm">Algoritmi</string>
<string name="otp_digits">Numerot</string>
<string name="otp_counter">Laskuri</string>
<string name="otp_period">Ajanjakso (sekunteina)</string>
<string name="otp_secret">Salaisuus</string>
<string name="otp_type">OTP tyyppi</string>
<string name="entry_setup_otp">Luo kertakäyttöinen salasana</string>
<string name="entry_attachments">Liitetiedostot</string>
<string name="entry_history">Historia</string>
<string name="entry_UUID">UUID</string>
<string name="html_about_contribution">Pitääksemme &lt;strong&gt;vapaudemme&lt;/strong&gt;, &lt;strong&gt;korjataksemme bugeja&lt;/strong&gt;, &lt;strong&gt;lisätäksemme ominaisuuksia&lt;/strong&gt; ja &lt;strong&gt;ollaksemme aina ajantasalla&lt;/strong&gt;, luotamme teidän &lt;strong&gt;apuun&lt;/strong&gt;.</string>
<string name="content_description_keyboard_close_fields">Sulje kenttä</string>
<string name="content_description_update_from_list">Päivitä</string>
<string name="entry_add_field">Lisää kenttä</string>
<string name="content_description_remove_field">Poista kenttä</string>
<string name="entry_add_attachment">Lisää liite</string>
<string name="content_description_password_length">Salasanan pituus</string>
<string name="entry_password_generator">Salanan generaattori</string>
<string name="discard">Hylkää</string>
<string name="discard_changes">Hylkää muutokset\?</string>
<string name="validate">Vahvista</string>
<string name="content_description_entry_icon">Merkintä kuvake</string>
<string name="content_description_repeat_toggle_password_visibility">Toista salasanan näkyvyyden vaihto</string>
<string name="content_description_keyfile_checkbox">Avaintiedoston valintaruutu</string>
<string name="content_description_password_checkbox">Salasanan valintaruutu</string>
<string name="content_description_file_information">Tietoja tiedostosta</string>
<string name="content_description_add_item">Lisää esine</string>
<string name="content_description_add_group">Lisää ryhmä</string>
<string name="content_description_add_entry">Lisää kohta</string>
<string name="content_description_add_node">Lisää solmu</string>
<string name="content_description_background">Tausta</string>
</resources>

View File

@@ -40,8 +40,7 @@
<string name="clipboard_error">Certains appareils ne permettent pas aux applications dutiliser le presse-papier.</string>
<string name="clipboard_error_clear">Impossible de vider le presse-papier</string>
<string name="clipboard_timeout">Expiration du presse-papier</string>
<string name="clipboard_timeout_summary">Durée de stockage dans le presse-papier</string>
<string name="clipboard_swipe_clean">Glisser pour vider le presse-papier maintenant</string>
<string name="clipboard_timeout_summary">Durée de stockage dans le presse-papier (si supporté par votre appareil)</string>
<string name="select_to_copy">Copier %1$s dans le presse-papier</string>
<string name="retrieving_db_key">Récupération de la clé de la base de données…</string>
<string name="database">Base de données</string>
@@ -210,7 +209,7 @@
<string name="monospace_font_fields_enable_summary">Change la fonte utilisée dans les champs pour une meilleure visibilité des caractères</string>
<string name="allow_copy_password_title">Faire confiance au presse-papier</string>
<string name="allow_copy_password_summary">Autorise la copie du mot de passe de lentrée et des champs protégés dans le presse-papier</string>
<string name="allow_copy_password_warning">Attention : Le presse-papiers est partagé par toutes les applications. Si des données sensibles sont copiées, dautres logiciels peuvent les récupérer.</string>
<string name="allow_copy_password_warning">Attention : Le presse-papier est partagé par toutes les applications. Si des données sensibles sont copiées, dautres logiciels peuvent les récupérer.</string>
<string name="database_name_title">Nom de la base de données</string>
<string name="database_description_title">Description de la base de données</string>
<string name="database_version_title">Version de la base de données</string>
@@ -219,7 +218,7 @@
<string name="other">Autres</string>
<string name="keyboard">Clavier</string>
<string name="magic_keyboard_title">Magiclavier</string>
<string name="magic_keyboard_explanation_summary">Active un clavier personnalisé pour remplir vos mots de passe et tous les champs didentité</string>
<string name="magic_keyboard_explanation_summary">Activer un clavier personnalisé pour remplir vos mots de passe et tous les champs didentité</string>
<string name="enable_education_screens_title">Conseils pédagogiques</string>
<string name="enable_education_screens_summary">Met en surbrillance les éléments pour apprendre le fonctionnement de lapplication</string>
<string name="reset_education_screens_title">Réinitialiser les conseils pédagogiques</string>
@@ -349,12 +348,12 @@
<string name="lock_database_back_root_title">Appuyer sur «Retour» pour verrouiller</string>
<string name="lock_database_back_root_summary">Verrouille la base de données lorsque lutilisateur clique sur le bouton retour de lécran racine</string>
<string name="clear_clipboard_notification_title">Suppression à la fermeture</string>
<string name="clear_clipboard_notification_summary">Verrouille la base de données lors de la fermeture de la notification</string>
<string name="clear_clipboard_notification_summary">Verrouille la base de données lorsque la durée du presse-papier expire ou que la notification est fermée après avoir commencé à lutiliser</string>
<string name="recycle_bin">Corbeille</string>
<string name="keyboard_selection_entry_title">Sélection de lentrée</string>
<string name="keyboard_selection_entry_summary">Affiche les champs de saisie dans le Magiclavier lors de laffichage dune entrée</string>
<string name="delete_entered_password_title">Supprimer le mot de passe</string>
<string name="delete_entered_password_summary">Supprime le mot de passe saisi après une tentative de connexion</string>
<string name="delete_entered_password_summary">Supprime le mot de passe saisi après une tentative de connexion à une base de données</string>
<string name="content_description_open_file">Ouvrir le fichier</string>
<string name="content_description_add_node">Ajouter un nœud</string>
<string name="content_description_add_entry">Ajouter une entrée</string>
@@ -413,7 +412,7 @@
<string name="contains_duplicate_uuid">La base de données contient des doublons dUUID.</string>
<string name="contains_duplicate_uuid_procedure">Résoudre le problème en générant de nouveaux UUID pour les doublons et continuer\?</string>
<string name="database_opened">Base de données ouverte</string>
<string name="clipboard_explanation_summary">Copie les champs dune entrée à laide du presse-papier de votre appareil</string>
<string name="clipboard_explanation_summary">Copier les champs dune entrée à laide du presse-papier de votre appareil</string>
<string name="advanced_unlock_explanation_summary">Utilise le déverrouillage avancé pour ouvrir plus facilement une base de données</string>
<string name="database_data_compression_title">Compression de données</string>
<string name="database_data_compression_summary">La compression des données réduit la taille de la base de données.</string>
@@ -476,11 +475,24 @@
<string name="discard">Abandonner</string>
<string name="discard_changes">Abandonner les modifications\?</string>
<string name="validate">Valider</string>
<string name="autofill_auto_search_summary">Suggérer automatiquement des résultats de recherche à partir du domaine Web ou de l\'identifiant de l\'appli</string>
<string name="autofill_auto_search_summary">Suggérer automatiquement des résultats de recherche à partir du domaine Web ou de l\'application ID</string>
<string name="autofill_auto_search_title">Recherche automatique</string>
<string name="lock_database_show_button_summary">Affiche le bouton de verrouillage dans l\'interface utilisateur</string>
<string name="lock_database_show_button_title">Afficher le bouton de verrouillage</string>
<string name="autofill_preference_title">Paramètres de remplissage automatique</string>
<string name="warning_database_link_revoked">Accès au fichier révoqué par le gestionnaire de fichiers</string>
<string name="error_label_exists">Ce label existe déjà.</string>
</resources>
<string name="autofill_block_restart">Redémarrez l\'application contenant le formulaire pour activer le blocage.</string>
<string name="autofill_block">Blocker le remplissage automatique</string>
<string name="autofill_web_domain_blocklist_summary">Liste de blocage qui empêche le remplissage automatique des domaines Web</string>
<string name="autofill_web_domain_blocklist_title">Liste de blocage de domaine Web</string>
<string name="autofill_application_id_blocklist_summary">Liste de blocage qui empêche le remplissage automatique des applications</string>
<string name="autofill_application_id_blocklist_title">Liste de blocage d\'application</string>
<string name="keyboard_search_share_summary">Rechercher automatiquement les informations partagées pour remplir le clavier</string>
<string name="keyboard_search_share_title">Rechercher les informations partagées</string>
<string name="filter">Filtre</string>
<string name="subdomain_search_summary">Rechercher des domaines Web avec des contraintes de sous-domaines</string>
<string name="subdomain_search_title">Recherche de sous-domaine</string>
<string name="error_string_type">Ce texte ne correspond pas à l\'élément demandé.</string>
<string name="content_description_add_item">Ajouter un élément</string>
</resources>

View File

@@ -37,7 +37,6 @@
<string name="clipboard_error_clear">Fallou a limpeza do portapapeis</string>
<string name="clipboard_timeout">Tempo límite para o portapapeis</string>
<string name="clipboard_timeout_summary">Tempo antes de limpar o portapapeis após copiar usuario ou contrasinal</string>
<string name="clipboard_swipe_clean">Deslice para limpar agora o portapapeis</string>
<string name="edit_entry">Editar entrada</string>
<string name="select_to_copy">Seleccione para copiar %1$s para o portapapeis</string>
<string name="retrieving_db_key">A criar a chave da base de dados…</string>

View File

@@ -40,7 +40,6 @@
<string name="clipboard_error_clear">क्लिपबोर्ड को साफ़ नहीं किया जा सका</string>
<string name="clipboard_timeout">क्लिपबोर्ड टाइमआउट</string>
<string name="clipboard_timeout_summary">क्लिपबोर्ड में भंडारण की अवधि</string>
<string name="clipboard_swipe_clean">अब क्लिपबोर्ड को साफ करने के लिए स्वाइप करें</string>
<string name="select_to_copy">क्लिपबोर्ड पर %1$s को कॉपी करने के लिए चयन करें</string>
<string name="retrieving_db_key">डेटाबेस कुंजी पुनर्प्राप्त कर रहा है…</string>
<string name="database">डेटाबेस</string>

View File

@@ -20,25 +20,24 @@
<string name="about_description">Android implementacija KeePass upravitelja lozinki</string>
<string name="accept">Prihvati</string>
<string name="add_entry">Dodaj unos</string>
<string name="edit_entry">Uređivanje unosa</string>
<string name="edit_entry">Uredi unos</string>
<string name="add_group">Dodaj grupu</string>
<string name="master_key">Glavni ključ</string>
<string name="security">Sigurnost</string>
<string name="encryption">Šifriranje</string>
<string name="encryption_algorithm">Algoritam šifriranja</string>
<string name="key_derivation_function">Funkcija izvedbe ključa</string>
<string name="key_derivation_function">Funkcija za generiranje ključeva</string>
<string name="app_timeout_summary">Vrijeme neaktivnosti prije zaključavanja baze podataka</string>
<string name="application">Aplikacija</string>
<string name="brackets">Zagrade</string>
<string name="extended_ASCII">Prošireni ASCII kod</string>
<string name="file_manager_install_description">Za stvaranje, otvaranje i pohranu datoteka baze podataka potreban je upravitelj datoteka koji prihvaća zahtjeve ACTION_CREATE_DOCUMENT i ACTION_OPEN_DOCUMENT.</string>
<string name="extended_ASCII">Prošireni ASCII</string>
<string name="file_manager_install_description">Za stvaranje, otvaranje i spremanje datoteka baze podataka potreban je upravitelj datoteka koji prihvaća zahtjeve ACTION_CREATE_DOCUMENT i ACTION_OPEN_DOCUMENT.</string>
<string name="allow">Dozvoli</string>
<string name="clipboard_cleared">Međuspremnik je ispražnjen</string>
<string name="clipboard_error_title">Pogreška međuspremnika</string>
<string name="clipboard_cleared">Međuspremnik ispražnjen</string>
<string name="clipboard_error_title">Greška međuspremnika</string>
<string name="clipboard_error">Neki uređaji neće dopustiti aplikacijama korištenje međuspremnika.</string>
<string name="clipboard_error_clear">Nije moguće isprazniti međuspremnik</string>
<string name="clipboard_timeout_summary">Trajanje pohrane u međuspremniku</string>
<string name="clipboard_swipe_clean">Prijeđite prstom da biste odmah ispraznili međuspremnik</string>
<string name="content_description_background">Pozadina</string>
<string name="content_description_open_file">Otvori datoteku</string>
<string name="content_description_add_node">Dodaj čvor</string>
@@ -54,30 +53,30 @@
<string name="content_description_remove_from_list">Ukloni</string>
<string name="content_description_keyboard_close_fields">Zatvori polja</string>
<string name="select_to_copy">Kopiraj %1$s u međuspremnik</string>
<string name="retrieving_db_key">Dohvaćanje ključa baze podataka…</string>
<string name="retrieving_db_key">Dohvaćanje ključa baze podataka </string>
<string name="database">Baza podataka</string>
<string name="decrypting_db">Dešifriranje sadržaja baze podataka…</string>
<string name="default_checkbox">Koristi kao zadanu bazu podataka</string>
<string name="decrypting_db">Dešifriranje sadržaja baze podataka </string>
<string name="default_checkbox">Koristi kao standardnu bazu podataka</string>
<string name="digits">Znamenke</string>
<string name="entry_cancel">Odustani</string>
<string name="entry_notes">Bilješke</string>
<string name="entry_confpassword">Potvrdi lozinku</string>
<string name="entry_created">Kreirano</string>
<string name="entry_created">Stvoreno</string>
<string name="entry_expires">Istječe</string>
<string name="entry_UUID">UUID</string>
<string name="entry_history">Povijest</string>
<string name="entry_attachments">Privitci</string>
<string name="entry_modified">Zadnja izmjena</string>
<string name="entry_not_found">Nije moguće pronaći podatke o unosu.</string>
<string name="entry_modified">Promijenjeno</string>
<string name="entry_not_found">Nije moguće pronaći podatke unosa.</string>
<string name="content_description_password_checkbox">Potvrdni okvir lozinke</string>
<string name="content_description_keyfile_checkbox">Potvrdni okvir datoteke ključa</string>
<string name="entry_keyfile">Datoteka ključa</string>
<string name="entry_password">Lozinka</string>
<string name="entry_save">Spremi</string>
<string name="entry_title">Naslov</string>
<string name="entry_setup_otp">Postavi jednokratnu zaporku</string>
<string name="entry_setup_otp">Postavi jednokratnu lozinku</string>
<string name="otp_type">Tip OTP-a</string>
<string name="otp_secret">Tajni ključ</string>
<string name="otp_secret">Tajna</string>
<string name="otp_period">Razdoblje (u sekundama)</string>
<string name="otp_counter">Brojač</string>
<string name="otp_digits">Znamenke</string>
@@ -86,19 +85,19 @@
<string name="entry_url">URL</string>
<string name="entry_user_name">Korisničko ime</string>
<string name="error_nokeyfile">Odaberi datoteku ključa.</string>
<string name="error_pass_gen_type">Bar jedan tip generiranja lozinke mora biti odabran.</string>
<string name="error_pass_match">Lozinke se ne podudaraju.</string>
<string name="error_wrong_length">Unesi pozitivan cijeli broj u polje \"Duljina\".</string>
<string name="error_pass_gen_type">Barem jedan tip generiranja lozinke mora biti odabran.</string>
<string name="error_pass_match">Lozinke se ne poklapaju.</string>
<string name="error_wrong_length">Upiši pozitivan cijeli broj u polje Duljina.</string>
<string name="error_otp_secret_key">Tajni ključ mora biti u Base32 formatu.</string>
<string name="error_otp_counter">Brojač mora biti između %1$d i %2$d.</string>
<string name="error_otp_digits">Token mora sadržavati %1$d do %2$d znamenki.</string>
<string name="field_name">Naziv polja</string>
<string name="field_name">Ime polja</string>
<string name="field_value">Vrijednost polja</string>
<string name="file_browser">Upravitelj datoteka</string>
<string name="generate_password">Generiraj lozinku</string>
<string name="hint_conf_pass">Potvrdi lozinku</string>
<string name="hint_generated_password">Generirana lozinka</string>
<string name="hint_group_name">Naziv grupe</string>
<string name="hint_group_name">Ime grupe</string>
<string name="hint_keyfile">Datoteka ključa</string>
<string name="hint_length">Duljina</string>
<string name="hint_pass">Lozinka</string>
@@ -109,16 +108,16 @@
<string name="keyfile_is_empty">Datoteka ključa je prazna.</string>
<string name="length">Duljina</string>
<string name="list_entries_show_username_title">Prikaži korisnička imena</string>
<string name="list_entries_show_username_summary">Prikaži korisnička imena u listi unosa</string>
<string name="list_entries_show_username_summary">Prikaži korisnička imena u popisima unosa</string>
<string name="list_groups_show_number_entries_title">Prikaži broj unosa</string>
<string name="list_groups_show_number_entries_summary">Prikaži broj unosa u grupi</string>
<string name="creating_database">Kreiranje baze podataka…</string>
<string name="loading_database">Učitavanje baze podataka…</string>
<string name="creating_database">Stvaranje baze podataka </string>
<string name="loading_database">Učitavanje baze podataka </string>
<string name="hide_password_title">Sakrij lozinke</string>
<string name="menu_change_key_settings">Promjeni glavni ključ</string>
<string name="settings">Postavke</string>
<string name="menu_app_settings">Postavke aplikacije</string>
<string name="menu_form_filling_settings">Ispunjavanje forme</string>
<string name="menu_form_filling_settings">Ispunjavanje obrasca</string>
<string name="menu_advanced_unlock_settings">Napredno otključavanje</string>
<string name="menu_database_settings">Postavke baze podataka</string>
<string name="menu_security_settings">Postavke sigurnosti</string>
@@ -126,17 +125,17 @@
<string name="menu_donate">Doniraj</string>
<string name="menu_edit">Izmjeni</string>
<string name="menu_copy">Kopiraj</string>
<string name="menu_paste">Zalijepi</string>
<string name="menu_paste">Umetni</string>
<string name="menu_delete">Izbriši</string>
<string name="menu_hide_password">Sakrij lozinku</string>
<string name="menu_lock">Zaključaj bazu podataka</string>
<string name="menu_save_database">Spremi bazu podataka</string>
<string name="menu_open">Otvori</string>
<string name="menu_search">Pretraži</string>
<string name="menu_search">Traži</string>
<string name="menu_showpass">Prikaži lozinku</string>
<string name="menu_biometric_remove_key">Izbriši spremljene biometričke ključeve</string>
<string name="menu_biometric_remove_key">Izbriši spremljene biometrijske ključeve</string>
<string name="menu_url">Idi na URL</string>
<string name="menu_open_file_read_and_write">Promijenjivo</string>
<string name="menu_open_file_read_and_write">Promjenjivo</string>
<string name="menu_empty_recycle_bin">Isprazni koš za smeće</string>
<string name="menu_restore_entry_history">Vrati povijest</string>
<string name="menu_delete_entry_history">Izbriši povijest</string>
@@ -145,163 +144,163 @@
<string name="no_results">Nema rezultata pretraživanja</string>
<string name="no_url_handler">Instalirajte web preglednik da bi ste otvorili ovaj URL.</string>
<string name="select_database_file">Otvori postojeću bazu podataka</string>
<string name="create_keepass_file">Kreiraj novu bazu podataka</string>
<string name="create_keepass_file">Stvori novu bazu podataka</string>
<string name="omit_backup_search_title">Ne pretražuj kopije unosa</string>
<string name="progress_create">Kreiranje nove baze podataka…</string>
<string name="progress_create">Stvaranje nove baze podataka </string>
<string name="protection">Zaštita</string>
<string name="contains_duplicate_uuid">Baza podataka sadrži duplicirane UUID-ove.</string>
<string name="selection_mode">Mod odabira</string>
<string name="encryption_explanation">Odaberite algoritam za šifriranje svih podataka.</string>
<string name="encryption_explanation">Algoritam šifriranja baze podataka koji se koristi za sve podatke.</string>
<string name="memory_usage">Korištenje memorije</string>
<string name="parallelism">Paralelnost</string>
<string name="parallelism_explanation">Stupanj paralelnosti (odnosno broj threadova) koji će koristiti funkcija izvedbe ključa.</string>
<string name="saving_database">Spremanje baze podataka…</string>
<string name="command_execution">Izvršavanje naredbe…</string>
<string name="parallelism_explanation">Stupanj paralelnosti (odnosno broj threadova) koji će koristiti funkcija za generiranje ključeva.</string>
<string name="saving_database">Spremanje baze podataka </string>
<string name="command_execution">Izvršavanje naredbe </string>
<string name="space">Razmak</string>
<string name="search_label">Pretraži</string>
<string name="search_label">Pretraga</string>
<string name="sort_menu">Sortiraj po</string>
<string name="sort_ascending">Uzlazno</string>
<string name="sort_ascending">Počevši s najnižim ↓</string>
<string name="sort_groups_before">Grupe prije</string>
<string name="sort_recycle_bin_bottom">Koš za smeće na dnu</string>
<string name="sort_db">Prirodnom poredku</string>
<string name="sort_db">Prirodnom poretku</string>
<string name="sort_title">Naslovu</string>
<string name="sort_username">Korisničkom imenu</string>
<string name="sort_creation_time">Vremenu kreiranja</string>
<string name="sort_last_modify_time">Vremenu zadnje izmjene</string>
<string name="search">Pretraži</string>
<string name="search_results">Rezultati pretraživanja</string>
<string name="sort_last_modify_time">Zadnja promjena</string>
<string name="search">Pretraga</string>
<string name="search_results">Rezultati pretrage</string>
<string name="unsupported_db_version">Nepodržana verzija baze podataka.</string>
<string name="warning">Upozorenje</string>
<string name="warning_empty_password">Jeste li sigurni da ne želite zaštititi otključavanje lozinkom\?</string>
<string name="warning_no_encryption_key">Jeste li sigurni da ne želite koristiti nijedan ključ šifriranja\?</string>
<string name="warning_permanently_delete_nodes">Jeste li sigurni da želite trajno izbrisati odabrane čvorove\?</string>
<string name="warning_empty_password">Nastaviti bez zaštitite otključavanja lozinkom\?</string>
<string name="warning_no_encryption_key">Nastaviti bez ključa šifriranja\?</string>
<string name="warning_permanently_delete_nodes">Trajno izbrisati odabrane čvorove\?</string>
<string name="version_label">Verzija %1$s</string>
<string name="build_label">Build %1$s</string>
<string name="biometric_prompt_store_credential_message">Upozorenje: Ako koristite biometričko prepoznavanje i dalje morate zapamtiti vašu glavnu lozinku.</string>
<string name="biometric_prompt_extract_credential_title">Otvori bazu podataka pomoću biometričkog prepoznavanja</string>
<string name="build_label">Izgradnja %1$s</string>
<string name="biometric_prompt_store_credential_message">Upozorenje: Ako koristiš biometrijsko prepoznavanje i dalje moraš zapamtiti svoju glavnu lozinku.</string>
<string name="biometric_prompt_extract_credential_title">Otvori bazu podataka pomoću biometrijskog prepoznavanja</string>
<string name="encrypted_value_stored">Šifrirana lozinka pohranjena</string>
<string name="biometric_invalid_key">Nije moguće pročitati biometrički ključ. Molimo izbrišite ga i ponovite postupak prepoznavanje.</string>
<string name="biometric_invalid_key">Nije moguće pročitati biometrijski ključ. Izbriši ga i ponovi postupak prepoznavanja.</string>
<string name="database_history">Povijest</string>
<string name="menu_appearance_settings">Izgled</string>
<string name="general">Općenito</string>
<string name="general">Opće</string>
<string name="autofill">Automatsko ispunjavanje</string>
<string name="autofill_service_name">KeepassDX automatsko ispunjavanje forme</string>
<string name="set_autofill_service_title">Postavi zadani servis automatskog ispunjavanja</string>
<string name="autofill_service_name">Automatsko ispunjavanje obrazaca KeepassDX</string>
<string name="set_autofill_service_title">Postavi standardnu uslugu automatskog ispunjavanja</string>
<string name="list_password_generator_options_title">Znakovi lozinke</string>
<string name="list_password_generator_options_summary">Postavi dozvoljene znakove za generiranje lozinke</string>
<string name="database_opened">Baza podataka otvorena</string>
<string name="clipboard">Međuspremnik</string>
<string name="clipboard_notifications_title">Obavijesti međuspremnika</string>
<string name="clipboard_warning">Ako automatsko brisanje međuspremnika ne uspije, izbrišite njegovu povijest ručno.</string>
<string name="clipboard_warning">Ako automatsko brisanje međuspremnika ne uspije, izbriši njegovu povijest ručno.</string>
<string name="lock_database_screen_off_summary">Zaključaj bazu podataka kada je ekran ugašen</string>
<string name="lock_database_back_root_title">Pritisni \'Natrag\' za zaključavanje</string>
<string name="advanced_unlock">Napredno otključavanje</string>
<string name="advanced_unlock_explanation_summary">Koristite napredno otključavanje za jednostavnije otvaranje baze podataka</string>
<string name="biometric_unlock_enable_title">Biometričko otključavanje</string>
<string name="advanced_unlock_explanation_summary">Koristi napredno otključavanje za jednostavnije otvaranje baze podataka</string>
<string name="biometric_unlock_enable_title">Biometrijsko otključavanje</string>
<string name="biometric_unlock_enable_summary">Otvaranje baze podataka skeniranjem biometrike</string>
<string name="biometric_delete_all_key_title">Izbriši ključeve šifriranja</string>
<string name="biometric_delete_all_key_summary">Izbriši sve ključeve šifriranja povezane s biometričkim prepoznavanjem</string>
<string name="biometric_delete_all_key_warning">Jeste li sigurni da želite izbrisati sve ključeve povezane s biometričkim prepoznavanjem\?</string>
<string name="biometric_delete_all_key_summary">Izbriši sve ključeve šifriranja povezane s biometrijskim prepoznavanjem</string>
<string name="biometric_delete_all_key_warning">Izbrisati sve ključeve povezane s biometrijskim prepoznavanjem\?</string>
<string name="unavailable_feature_hardware">Nije moguće pronaći odgovarajući hardver.</string>
<string name="file_name">Naziv datoteke</string>
<string name="file_name">Ime datoteke</string>
<string name="path">Putanja</string>
<string name="assign_master_key">Pridruži glavni ključ</string>
<string name="assign_master_key">Zadaj glavni ključ</string>
<string name="full_file_path_enable_title">Putanja datoteke</string>
<string name="full_file_path_enable_summary">Prikaži punu putanju do datoteke</string>
<string name="database_data_compression_title">Kompresija podataka</string>
<string name="database_data_compression_summary">Kompresija podataka smanjuje veličinu baze podataka.</string>
<string name="database_data_compression_title">Komprimiranje podataka</string>
<string name="database_data_compression_summary">Komprimiranje podataka smanjuje veličinu baze podataka.</string>
<string name="max_history_items_title">Maksimalni broj</string>
<string name="max_history_size_title">Maksimalna veličina</string>
<string name="settings_database_recommend_changing_master_key_title">Preporučeno obnavljanje</string>
<string name="settings_database_recommend_changing_master_key_summary">Preporuči promjenu glavnog ključa (u danima)</string>
<string name="settings_database_force_changing_master_key_title">Prisilno obnavljanje</string>
<string name="settings_database_force_changing_master_key_summary">Zahtjevaj promjenu glavnog ključa (u dani)</string>
<string name="settings_database_force_changing_master_key_next_time_title">Prisilno obnavljanje sljedeći put</string>
<string name="settings_database_force_changing_master_key_next_time_summary">Zahtjevaj promjenu glavnog ključa sljedeći put</string>
<string name="settings_database_recommend_changing_master_key_title">Preporuči obnavljanje</string>
<string name="settings_database_recommend_changing_master_key_summary">Preporuči mijenjanje glavnog ključa (u danima)</string>
<string name="settings_database_force_changing_master_key_title">Prisili obnavljanje</string>
<string name="settings_database_force_changing_master_key_summary">Zahtijevaj promjenu glavnog ključa (u danima)</string>
<string name="settings_database_force_changing_master_key_next_time_title">Prisili obnavljanje sljedeći put</string>
<string name="settings_database_force_changing_master_key_next_time_summary">Zahtijevaj promjenu glavnog ključa sljedeći put (jednom)</string>
<string name="monospace_font_fields_enable_title">Font polja</string>
<string name="monospace_font_fields_enable_summary">Promjeni font u poljima za bolju vidljivost znakova</string>
<string name="enable">Omogući</string>
<string name="disable">Onemogući</string>
<string name="enable">Anktiviraj</string>
<string name="disable">Deaktiviraj</string>
<string name="clear_clipboard_notification_title">Isprazni pri zatvaranju</string>
<string name="clear_clipboard_notification_summary">Zaključaj bazu podataka pri zatvaranju obavijesti</string>
<string name="database_name_title">Ime baze podataka</string>
<string name="database_description_title">Opis baze podataka</string>
<string name="database_default_username_title">Zadano korisničko ime</string>
<string name="database_default_username_title">Standardno korisničko ime</string>
<string name="database_custom_color_title">Proizvoljna boja baze podataka</string>
<string name="database_version_title">Verzija baze podataka</string>
<string name="text_appearance">Tekst</string>
<string name="application_appearance">Aplikacija</string>
<string name="other">Ostalo</string>
<string name="compression">Kompresija</string>
<string name="compression_none">Bez kompresije</string>
<string name="compression">Komprimiranje</string>
<string name="compression_none">Bez</string>
<string name="compression_gzip">gzip</string>
<string name="recycle_bin">Koš za smeće</string>
<string name="content_description_node_children">Pod-čvor</string>
<string name="entry_accessed">Zadnji pristup</string>
<string name="error_arc4">Arcfour stream cipher nije podržan.</string>
<string name="error_file_not_create">Nije moguće kreirati datoteku:</string>
<string name="error_invalid_db">Baza podataka se ne može pročitati.</string>
<string name="error_invalid_path">Provjerite putanju do datoteke.</string>
<string name="entry_accessed">Pristupljeno</string>
<string name="error_arc4">Arcfour šifriranje nije podržano.</string>
<string name="error_file_not_create">Nije moguće stvoriti datoteku:</string>
<string name="error_invalid_db">Nije moguće čitati bazu podataka.</string>
<string name="error_invalid_path">Provjeri putanju do datoteke.</string>
<string name="error_invalid_OTP">Neispravan OTP tajni ključ.</string>
<string name="error_no_name">Unesite naziv.</string>
<string name="error_no_name">Upiši ime.</string>
<string name="error_out_of_memory">Nema dovoljno memorije za učitavanje cijele baze podataka.</string>
<string name="error_load_database">Nije moguće učitati bazu podataka.</string>
<string name="error_load_database_KDF_memory">Nije moguće učitati ključ. Pokušaje smanjiti uporabu memorije KDF.</string>
<string name="error_disallow_no_credentials">Bar jedna akreditacija mora biti postavljena.</string>
<string name="error_disallow_no_credentials">Barem jedna akreditacija mora biti postavljena.</string>
<string name="error_string_key">Svaki niz mora imati ime polja.</string>
<string name="error_autofill_enable_service">Nije moguće omogućiti servis automatskog ispunjavanja.</string>
<string name="error_move_folder_in_itself">Nije moguće grupu premijestiti u samu sebe.</string>
<string name="error_autofill_enable_service">Nije moguće aktivirati uslugu automatskog ispunjavanja.</string>
<string name="error_move_folder_in_itself">Nije moguće premjestiti grupu u samu sebe.</string>
<string name="error_move_entry_here">Unos se ne može ovdje premijestiti.</string>
<string name="error_copy_entry_here">Unos se ne može ovdje kopirati.</string>
<string name="error_copy_group_here">Grupa se ne može ovjde kopirati.</string>
<string name="error_create_database_file">Nije moguće kreirati bazu podataka s ovom lozinkom i datotekom ključa.</string>
<string name="error_create_database_file">Nije moguće stvoriti bazu podataka s ovom lozinkom i datotekom ključa.</string>
<string name="error_save_database">Nije moguće spremiti bazu podataka.</string>
<string name="error_otp_period">Razdoblje mora biti između %1$d i %2$d sekundi.</string>
<string name="file_not_found_content">Nije moguće pronaći datoteku. Probajte je ponovno otvoriti iz vašeg upravitelja datotekama.</string>
<string name="invalid_credentials">Akreditacija se ne može pročitati.</string>
<string name="list_size_title">Veličina članova liste</string>
<string name="list_size_summary">Veličina teksta članova liste</string>
<string name="file_not_found_content">Nije moguće pronaći datoteku. Probaj je ponovo otvoriti iz upravitelja datoteka.</string>
<string name="invalid_credentials">Nije moguće čitati akreditacije.</string>
<string name="list_size_title">Veličina elemenata popisa</string>
<string name="list_size_summary">Veličina teksta u popisu elemenata</string>
<string name="lowercase">Mala slova</string>
<string name="hide_password_summary">Sakrij lozinke (***) pod zadano</string>
<string name="hide_password_summary">Standardno sakrij lozinke (***)</string>
<string name="about">O aplikaciji</string>
<string name="copy_field">Kopiraj %1$s</string>
<string name="menu_move">Premijesti</string>
<string name="copy_field">Kopija od %1$s</string>
<string name="menu_move">Premjesti</string>
<string name="menu_cancel">Otkaži</string>
<string name="menu_file_selection_read_only">Zaštićeno od pisanja</string>
<string name="omit_backup_search_summary">Izostavi grupe \"Backup\" i \"Recycle bin\" iz rezultata pretraživanja</string>
<string name="progress_title">Obrada</string>
<string name="progress_title">Rad u tijeku </string>
<string name="read_only">Zaštićeno od pisanja</string>
<string name="read_only_warning">Zavisno o vašem upravitelju datotekama, KeePassDX možda neće moći zapisivati u vašu pohranu.</string>
<string name="contains_duplicate_uuid_procedure">Riješi problem generiranjem novih UUID-ova za duplikate\?</string>
<string name="read_only_warning">Ovisno o upravitelju datoteka, KeePassDX možda neće moći pisati u tvoje spremište.</string>
<string name="contains_duplicate_uuid_procedure">Riješiti problem generiranjem novih UUID-ova za duplikate\?</string>
<string name="root">Korijen</string>
<string name="memory_usage_explanation">Količina memorije (u bajtovima) koju će koristiti funkcija izvedbe ključa.</string>
<string name="do_not_kill_app">Ne zatvarajte aplikaciju…</string>
<string name="sort_last_access_time">Vremenu pristupa</string>
<string name="memory_usage_explanation">Količina memorije (u bajtovima) koju će koristiti funkcija za generiranje ključeva.</string>
<string name="do_not_kill_app">Ne zatvaraj aplikaciju </string>
<string name="sort_last_access_time">Zadnji pristup</string>
<string name="special">Posebni znakovi</string>
<string name="underline">Donja crta</string>
<string name="underline">Podcrtaj</string>
<string name="uppercase">Velika slova</string>
<string name="biometric_prompt_store_credential_title">Spremi biometrijsko prepoznavanje</string>
<string name="biometric_prompt_extract_credential_message">Izvadi akreditaciju baze podataka s biometrijskim podatcima</string>
<string name="biometric_prompt_extract_credential_message">Izvadi akreditaciju baze podataka s biometrijskim podacima</string>
<string name="biometric_not_recognized">Nije moguće prepoznati biometriju</string>
<string name="no_credentials_stored">Ova baza podataka još nema spremljenu akreditaciju.</string>
<string name="credential_before_click_biometric_button">Upišite lozinku prije nego kliknete na biometriju.</string>
<string name="credential_before_click_biometric_button">Upiši lozinku, zatim klikne gumb „Biometrija”.</string>
<string name="biometric">Biometrija</string>
<string name="autofill_sign_in_prompt">Prijavite se s KeePassDX</string>
<string name="autofill_explanation_summary">Omogući automatsko ispunjavanje za brzo ispunjavanje formi u drugim aplikacijama</string>
<string name="autofill_sign_in_prompt">Prijavi se s KeePassDX</string>
<string name="autofill_explanation_summary">Aktiviraj automatsko ispunjavanje za brzo ispunjavanje obrazaca u drugim aplikacijama</string>
<string name="password_size_title">Duljina generirane lozinke</string>
<string name="password_size_summary">Postavi zadanu duljinu generirane lozinke</string>
<string name="clipboard_explanation_summary">Kopiraj polja unosa koristeći međuspremnik uređaja</string>
<string name="clipboard_notifications_summary">Omogući obavijesti međuspremnika za kopiranje polja unosa</string>
<string name="password_size_summary">Postavlja standardnu duljinu generiranih lozinki</string>
<string name="clipboard_explanation_summary">Kopiraj polja unosa koristeći međuspremnik tvog uređaja</string>
<string name="clipboard_notifications_summary">Aktiviraj obavijesti međuspremnika za kopiranje polja prilikom prikaza unosa</string>
<string name="lock">Zaključavanje</string>
<string name="lock_database_screen_off_title">Zaključavanje ekrana</string>
<string name="recycle_bin_title">Koristi koš za smeće</string>
<string name="recycle_bin_summary">Premijesti grupe i unose u koš za smeće prije brisanja</string>
<string name="recycle_bin_group_title">Grupa koša za smeće</string>
<string name="max_history_items_summary">Postavi broj spremljenih povijesti po unosu</string>
<string name="max_history_size_summary">Postavi veličinu povijesti (u bajtovima) po unosu</string>
<string name="max_history_items_summary">Ograniči broj spremljenih povijesti po unosu</string>
<string name="max_history_size_summary">Ograniči veličinu povijesti (u bajtovima) po unosu</string>
<string name="allow_copy_password_title">Povjerenje međuspremniku</string>
<string name="allow_copy_password_summary">Dozvoli kopiranje lozinke i zaštićenih polja u međuspremnik</string>
<string name="allow_copy_password_warning">Upozorenje: Međuspremnik dijele sve aplikacije. Ako kopirate osjetljive podatke, druga aplikacija ih može vidjeti.</string>
<string name="allow_copy_password_warning">Upozorenje: Međuspremnik dijele sve aplikacije. Ako se kopiraju osjetljivi podaci, druga aplikacija ih može vidjeti.</string>
<string name="keyboard">Tipkovnica</string>
<string name="magic_keyboard_title">Magikeyboard</string>
<string name="magic_keyboard_explanation_summary">Aktivirajte prilagođenu tipkovnicu za popunjavanje lozinki i identifikacijskih polja</string>
@@ -312,8 +311,8 @@
<string name="keyboard_entry_category">Unos</string>
<string name="keyboard_selection_entry_title">Odabir unosa</string>
<string name="keyboard_notification_entry_title">Obavijesti</string>
<string name="keyboard_notification_entry_summary">Prikaži obavijest kada je neki unos dostupan</string>
<string name="keyboard_notification_entry_clear_close_title">Zatvaranje obavijesti</string>
<string name="keyboard_notification_entry_summary">Prikaži obavijest kad je neki unos dostupan</string>
<string name="keyboard_notification_entry_clear_close_title">Isprazni pri zatvaranju</string>
<string name="keyboard_notification_entry_clear_close_summary">Zatvori bazu podataka nakon zatvaranja obavijesti</string>
<string name="keyboard_notification_entry_content_title_text">Unos</string>
<string name="keyboard_notification_entry_content_title">%1$s je na Magikeyboard</string>
@@ -324,31 +323,151 @@
<string name="keyboard_key_vibrate_title">Vibracija tipki</string>
<string name="keyboard_key_sound_title">Zvuk tipki</string>
<string name="allow_no_password_title">Dozvoli bez lozinke</string>
<string name="allow_no_password_summary">Omogući dugme \"Otvori\" bez odabrane akreditacije</string>
<string name="allow_no_password_summary">Aktiviraj gumb „Otvori”, ako nijedna akreditacija nije odabrana</string>
<string name="delete_entered_password_title">Izbriši lozinku</string>
<string name="delete_entered_password_summary">Izbriši unešenu lozinku nakon pokušaja prijave</string>
<string name="delete_entered_password_summary">Briše upisanu lozinku nakon pokušaja povezivanja s bazom podataka</string>
<string name="enable_read_only_title">Zaštićeno od pisanja</string>
<string name="enable_read_only_summary">Otvori bazu podataka samo za čitanje pod zadano</string>
<string name="enable_auto_save_database_title">Automatsko spremanje baze podataka</string>
<string name="enable_auto_save_database_summary">Automatski spremi bazu podataka nakon važnih promjena ( samo u modu za mijenjanje)</string>
<string name="enable_read_only_summary">Standardno otvori bazu podataka u zaštićenom stanju</string>
<string name="enable_auto_save_database_title">Automatski spremi bazu podataka</string>
<string name="enable_auto_save_database_summary">Automatski spremi bazu podataka nakon svake važne radnje (samo u modusu „Promjenjivo”)</string>
<string name="enable_education_screens_title">Edukativne poruke</string>
<string name="enable_education_screens_summary">Istakni elemente za prikaz rada aplikacije</string>
<string name="reset_education_screens_title">Resetiranje edukativnih poruka</string>
<string name="reset_education_screens_summary">Ponovno prikaži sve edukativne poruke</string>
<string name="reset_education_screens_text">Resetiraj edukativne poruke</string>
<string name="education_create_database_title">Kreiranje vaše baze podataka</string>
<string name="education_create_database_summary">Kreirajte svoju prvu datoteku za upravljanje lozinkama.</string>
<string name="education_select_database_title">Otvaranje postojeće baze podataka</string>
<string name="education_select_database_summary">Otvorite vašu prijašnju bazu podataka iz vašeg upravitelja datotekama kako bi je nastavili koristiti.</string>
<string name="remember_database_locations_title">Zapamti lokaciju baze podataka</string>
<string name="auto_focus_search_title">Brzo pretraživanje</string>
<string name="error_create_database">Nije moguće kreirati datoteku baze podataka.</string>
<string name="error_rounds_too_large">Prevelik broj \"transformacijskih rundi\". Postavljeno na 2147483648.</string>
<string name="html_about_licence">KeePassDX © %1$d Kunzisoft je &lt;strong&gt;open source&lt;/strong&gt; te &lt;strong&gt;bez reklama&lt;/strong&gt;.
\nDostupan kakav je, pod &lt;strong&gt;GPLv3&lt;/strong&gt; licencom, bez ikakvog jamstva.</string>
<string name="reset_education_screens_title">Resetirj edukativne poruke</string>
<string name="reset_education_screens_summary">Ponovo prikaži sve edukativne poruke</string>
<string name="reset_education_screens_text">Resetiranje edukativnih poruka</string>
<string name="education_create_database_title">Stvori svoju bazu podataka</string>
<string name="education_create_database_summary">Stvori svoju prvu datoteku za upravljanje lozinkama.</string>
<string name="education_select_database_title">Otvori jednu postojeću bazu podataka</string>
<string name="education_select_database_summary">Za daljnju upotrebu prijašnje datoteke baze podataka, otvori je iz upravitelja datoteka.</string>
<string name="remember_database_locations_title">Spremi mjesto baze podataka</string>
<string name="auto_focus_search_title">Brza pretraga</string>
<string name="error_create_database">Nije moguće stvoriti datoteku baze podataka.</string>
<string name="error_rounds_too_large">Previše „transformacijskih prolaza”. Postavlja se na 2147483648.</string>
<string name="html_about_licence">KeePassDX © %1$d. Kunzisoft je softver &lt;strong&gt;otvorenog koda&lt;/strong&gt; i &lt;strong&gt;ne sadrži oglase&lt;/strong&gt;.
\nNudi se kakav je, pod &lt;strong&gt;GPLv3&lt;/strong&gt; licencom, bez jamstva.</string>
<string name="entry_add_attachment">Dodaj privitak</string>
<string name="discard">Odbaci</string>
<string name="discard_changes">Odbaci promjene\?</string>
<string name="discard_changes">Odbaciti promjene\?</string>
<string name="contact">Kontakt</string>
<string name="homepage">Početna stranica</string>
<string name="remember_keyfile_locations_title">Spremi mjesto datoteke ključa</string>
<string name="unavailable_feature_version">Tvoja Android verzija %1$s ne odgovara minimalno potrebnoj verziji %2$s.</string>
<string name="autofill_auto_search_summary">Automatski predloži rezultate pretrage od web domene ili ID-a aplikacije</string>
<string name="hide_broken_locations_summary">Sakrij pokvarene poveznice u popisu nedavnih baza podataka</string>
<string name="html_text_dev_feature">Ova se funkcija nalazi &lt;strong&gt;u razvoju&lt;/strong&gt; i treba tvoj &lt;strong&gt;doprinos&lt;/strong&gt; kako bi uskoro bila dostupna.</string>
<string name="education_generate_password_title">Stvori sigurnu lozinku</string>
<string name="education_entry_new_field_summary">Registriraj dodatno polje, dodaj vrijednost i po želji ga zaštiti.</string>
<string name="lock_database_show_button_title">Prikaži gumb za zaključavanje</string>
<string name="style_choose_summary">U aplikaciji korištena tema</string>
<string name="autofill_application_id_blocklist_title">Popis blokiranja aplikacija</string>
<string name="validate">Provjeri valjanost</string>
<string name="education_entry_edit_title">Uredi unos</string>
<string name="autofill_auto_search_title">Automatska pretraga</string>
<string name="html_text_dev_feature_work_hard">Trudimo se brzo izdati ovu funkciju.</string>
<string name="html_text_dev_feature_encourage">potičeš programere da stvore &lt;strong&gt;nove funkcije&lt;/strong&gt; i &lt;strong&gt;isprave greške&lt;/strong&gt; na osnovi tvojih napomena.</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="keyboard_auto_go_action_summary">Radnja tipke „Idi” nakon pritiskanja tipke „Polje”</string>
<string name="html_about_contribution">Kako bismo &lt;strong&gt;zadržali našu slobodu&lt;/strong&gt;, &lt;strong&gt;ispravljali greške&lt;/strong&gt;, &lt;strong&gt;dodavali funkcije&lt;/strong&gt; i &lt;strong&gt;uvijek bili aktivni&lt;/strong&gt;, računamo na tvoj &lt;strong&gt;doprinos&lt;/strong&gt;.</string>
<string name="autofill_web_domain_blocklist_summary">Popis blokiranja koja sprečavaju automatsko ispunjavanje web domena</string>
<string name="feedback">Povratne informacije</string>
<string name="autofill_preference_title">Postavke automatskog ispunjavanja</string>
<string name="education_generate_password_summary">Stvori snažnu lozinku za tvoj unosu, jednostavno je definiraj prema kriterijima obrasca i ne zaboravi sigurnu lozinku.</string>
<string name="style_choose_title">Tema aplikacije</string>
<string name="error_can_not_handle_uri">Nije moguće baratati ovim URI-jem u KeePassDX-u.</string>
<string name="keyboard_entry_timeout_summary">Istek vremena za brisanje unosa tipkovnicom</string>
<string name="education_read_only_title">Zaštiti bazu podataka od pisanja</string>
<string name="autofill_web_domain_blocklist_title">Popis blokiranja web domena</string>
<string name="education_biometric_title">Otključaj bazu podataka pomoću biometrije</string>
<string name="kdf_AES">AES</string>
<string name="contribution">Doprinos</string>
<string name="open_biometric_prompt_store_credential">Za spremanje akreditacija, otvori biometrijsku prijavu</string>
<string name="error_label_exists">Ova oznaka već postoji.</string>
<string name="warning_database_read_only">Za spremanje promjena u bazi podataka, datoteci dozvoli pisanje</string>
<string name="app_timeout">Istek vremena aplikacije</string>
<string name="content_description_repeat_toggle_password_visibility">Ponovo uklj/isklj vidljivosti lozinke</string>
<string name="warning_password_encoding">Izbjegni u lozinkama koristiti znakove koji su izvan formata kodiranja teksta u datoteci baze podataka (neprepoznati znakovi pretvaraju se u isto slovo).</string>
<string name="rounds_explanation">Dodatni prolazi šifriranja pružaju veću zaštitu od brutalnih napada, ali stvarno mogu usporiti učitavanje i spremanje.</string>
<string name="subdomain_search_summary">Traži web domene s ograničenjima poddomena</string>
<string name="keyboard_search_share_title">Traži dijeljene informacije</string>
<string name="html_text_dev_feature_upgrade">Ne zaboravi aktualizirati aplikaciju najnovijim verzijama.</string>
<string name="autofill_block_restart">Za aktiviranje blokiranja, ponovo pokreni aplikaciju koja sadrži obrazac.</string>
<string name="education_sort_summary">Odaberi način razvrstavanja unosa i grupa.</string>
<string name="warning_database_link_revoked">Pristup datoteci koju je opozvao upravitelj datoteka</string>
<string name="download_attachment">Preuzmi %1$s</string>
<string name="keyboard_entry_timeout_title">Istek vremena</string>
<string name="auto_focus_search_summary">Pokreni pretragu prilikom otvaranja baze podataka</string>
<string name="education_entry_edit_summary">Uredi svoj unos pomoću prilagođenih polja. Moguće je unakrsno pozivanje podataka između različitih polja unosa.</string>
<string name="remember_database_locations_summary">Zapamti mjesto baza podataka</string>
<string name="education_field_copy_summary">Kopirana polja mogu se umetnuti bilo gdje.
\n
\nKoristi preferirani način ispunjavanja obrazaca.</string>
<string name="filter">Filtar</string>
<string name="encryption_chacha20">ChaCha20</string>
<string name="show_recent_files_title">Prikaži nedavne datoteke</string>
<string name="html_text_dev_feature_contibute">&lt;strong&gt;Doprinosom&lt;/strong&gt;,</string>
<string name="education_entry_new_field_title">Dodaj prilagođena polja</string>
<string name="education_lock_summary">Zaključaj bazu podataka brzo, aplikaciju možeš postaviti tako da bazu nakon nekog vremena zaključa i kad se ekran isključi.</string>
<string name="kdf_Argon2">Argon2</string>
<string name="encryption_twofish">Twofish</string>
<string name="show_recent_files_summary">Prikaži mjesto nedavnih baza podataka</string>
<string name="education_biometric_summary">Za brzo otključavanje baze podataka, poveži lozinku sa skeniranom biometrijom.</string>
<string name="html_text_donation">Kako bismo zadržali našu slobodu i uvijek bili aktivni, računamo na tvoj&lt;strong&gt;doprinos.&lt;/strong&gt;</string>
<string name="kdf_explanation">Za stvaranje ključa za algoritam šifriranja, glavni ključ se transformira pomoću funkcije za generiranje ključeva koja sadrži slučajnu komponentu.</string>
<string name="lock_database_back_root_summary">Zaključaj bazu podataka kad korisnik pritisne gumb za natrag na ekranu</string>
<string name="hide_broken_locations_title">Sakrij pokvarene poveznice baze podataka</string>
<string name="autofill_block">Blokiranje automatskog ispunjavanja</string>
<string name="keystore_not_accessible">Baza ključeva nije ispravno inicijalizirana.</string>
<string name="icon_pack_choose_summary">Paket ikona, koji se koristi u aplikaciji</string>
<string name="hide_expired_entries_summary">Istekli unosi su skrivaju</string>
<string name="education_lock_title">Zaključaj bazu podataka</string>
<string name="open_biometric_prompt_unlock_database">Za otključavanje baze podataka, otvori biometrijsku prijavu</string>
<string name="education_unlock_title">Otključaj bazu podataka</string>
<string name="biometric_auto_open_prompt_summary">Automatski traži biometriju, ako je baza podataka tako postavljena</string>
<string name="unavailable_feature_text">Nije moguće pokrenuti ovu funkciju.</string>
<string name="biometric_auto_open_prompt_title">Automatski otvori biometrijsku prijavu</string>
<string name="clipboard_timeout">Istek vremena međuspremnika</string>
<string name="education_search_title">Pretraži unose</string>
<string name="education_field_copy_title">Kopiraj jedno polje</string>
<string name="icon_pack_choose_title">Paket ikona</string>
<string name="contribute">Doprinesi</string>
<string name="html_text_dev_feature_thanks">Zahvaljujemo na doprinosu.</string>
<string name="education_setup_OTP_title">Postavi OTP</string>
<string name="content_description_add_item">Dodaj element</string>
<string name="html_text_dev_feature_buy_pro">Kupnjom &lt;strong&gt;pro&lt;/strong&gt; verzije,</string>
<string name="keyboard_selection_entry_summary">Prikaži polja unosa u Magikeyboardu prilikom prikaza unosa</string>
<string name="education_new_node_title">Dodaj elemente u bazu podataka</string>
<string name="keyboard_search_share_summary">Automatski traži dijeljene informacije radi punjenja tipkovnice</string>
<string name="education_donation_summary">Pomogni povećati stabilnost i sigurnost dodavanjem dodatnih funkcija.</string>
<string name="error_string_type">Ovaj se tekst ne poklapa sa zatraženim elementom.</string>
<string name="html_text_buy_pro">Kupnjom pro verzije imat ćaš pristup ovom &lt;strong&gt;vizualnom stilu&lt;/strong&gt; i k tome ćeš pomoći &lt;strong&gt;u realizaciji projekata zajednice.&lt;/strong&gt;</string>
<string name="keyboard_auto_go_action_title">Automatska radnja tipke</string>
<string name="education_sort_title">Razvrstavanje elemenata</string>
<string name="autofill_application_id_blocklist_summary">Popis blokiranja koja sprečavaju automatsko ispunjavanje aplikacija</string>
<string name="education_read_only_summary">Promijeni način otvaranja sesije.
\n
\n„Zaštićeno od pisanja” sprečava nenamjerne promjene u bazi podataka.
\n„Promjenjivo” omogućuje dodavanje, brisanje ili mijenjanje svih elemenata.</string>
<string name="education_search_summary">Upiši naslov, korisničko ime ili sadržaj drugih polja za pronalaženje lozinki.</string>
<string name="html_text_feature_generosity">Ovaj &lt;strong&gt;visualni stil&lt;/strong&gt; dostupan je zahvaljujući tvojoj darežljivosti.</string>
<string name="education_unlock_summary">Upiši lozinku i/ili datoteku ključa za otključavanje baze podataka.
\n
\nSpremi sigurnosnu kopiju datoteke baze podataka na sigurno mjesto nakon svake promjene.</string>
<string name="configure_biometric">Biometrijska prijava je podržana, ali nije postavljena.</string>
<string name="subdomain_search_title">Pretraživanje poddomenom</string>
<string name="education_setup_OTP_summary">Postavi upravljanje jednokratnih lozinki (HOTP / TOTP) za generiranje tokena koji je potreban za dvofaktorsku autentifikaciju (2FA).</string>
<string name="hide_expired_entries_title">Sakrij istekle unose</string>
<string name="download_finalization">Završavanje …</string>
<string name="download">Preuzimanje</string>
<string name="lock_database_show_button_summary">Prikazuje gumb za zaključavanje u korisničkom sučelju</string>
<string name="remember_keyfile_locations_summary">Zapamti mjesto datoteka ključeva baze podataka</string>
<string name="html_text_ad_free">Za razliku od mnogih aplikacija za upravljanje lozinkama, ova je &lt;strong&gt;bez oglasa&lt;/strong&gt;, &lt;strong&gt;copylefted slobodan softver&lt;/strong&gt; i ne prikuplja osobne podatke na svojim poslužiteljima, bez obzira na korištenu verziju.</string>
<string name="rounds">Transformacijski prolazi</string>
<string name="download_initialization">Inicijaliziranje …</string>
<string name="biometric_scanning_error">Biometrijska greška: %1$s</string>
<string name="education_donation_title">Sudjeluj</string>
<string name="education_new_node_summary">Unosi pomažu u upravljanju digitalnim identitetom.
\n
\nGrupe (~mape) organiziraju unose u bazi podataka.</string>
<string name="download_progression">U tijeku: %1$d%%</string>
<string name="download_complete">Gotovo! Dodirni, za otvaranje datoteke.</string>
</resources>

View File

@@ -312,7 +312,6 @@
<string name="education_sort_title">Elemek rendezése</string>
<string name="education_sort_summary">Válasszon, hogy az elemek és csoportok hogyan legyenek rendezve.</string>
<string name="education_donation_title">Közreműködés</string>
<string name="clipboard_swipe_clean">Seprés a vágólap azonnali törléséhez</string>
<string name="education_entry_edit_summary">Szerkessze a bejegyzése egyéni mezőit. Az adatok hivatkozhatóak a különböző mezők között.</string>
<string name="education_donation_summary">Segítsen a stabilitás és a biztonság növelésében, és az új funkciók hozzáadásában.</string>
<string name="html_text_ad_free">Számos más jelszókezelő alkalmazással ellentétben, ez egy &lt;strong&gt;reklámmentes&lt;/strong&gt;, &lt;strong&gt;copyleft licencelésű szabad szoftver&lt;/strong&gt;, amely nem gyűjt személyes adatokat a kiszolgálókon, bármelyik verziót is használja.</string>

View File

@@ -168,7 +168,6 @@
<string name="encryption">Cifratura</string>
<string name="key_derivation_function">Funzione di derivazione chiave</string>
<string name="extended_ASCII">ASCII esteso</string>
<string name="clipboard_swipe_clean">Scorri per pulire gli appunti ora</string>
<string name="error_nokeyfile">Seleziona un file chiave.</string>
<string name="error_autofill_enable_service">Attivazione del servizio di auto-completamento fallita.</string>
<string name="error_move_folder_in_itself">Non puoi spostare un gruppo in se stesso.</string>
@@ -253,9 +252,9 @@
<string name="enable_read_only_summary">Apri il database in sola lettura in modo predefinito</string>
<string name="enable_education_screens_title">Suggerimenti educativi</string>
<string name="enable_education_screens_summary">Evidenzia gli elementi per imparare come funziona l\'app</string>
<string name="reset_education_screens_title">Ripristina le schermate educative</string>
<string name="reset_education_screens_summary">Mostra di nuovo tutti gli elementi educativi</string>
<string name="reset_education_screens_text">Schermate educative ripristinate</string>
<string name="reset_education_screens_title">Ripristina i suggerimenti educativi</string>
<string name="reset_education_screens_summary">Mostra di nuovo tutte le informazioni educative</string>
<string name="reset_education_screens_text">Suggerimenti educativi ripristinati</string>
<string name="education_create_database_title">Crea il tuo file di database</string>
<string name="education_create_database_summary">Crea il tuo primo file di gestione password.</string>
<string name="education_select_database_title">Apri un database esistente</string>
@@ -270,10 +269,10 @@
<string name="education_biometric_summary">Collega la password alla tua impronta digitale per sbloccare velocemente il database.</string>
<string name="education_entry_edit_title">Modifica l\'elemento</string>
<string name="education_entry_edit_summary">Modifica l\'elemento con campi personalizzati. I dati possono fare riferimento ad altri campi.</string>
<string name="education_generate_password_title">Crea una password robusta per l\'elemento.</string>
<string name="education_generate_password_title">Crea una password robusta</string>
<string name="education_generate_password_summary">Genera una password robusta da associare all\'elemento, definiscila a seconda dei criteri del modulo e non dimenticare di tenerla al sicuro.</string>
<string name="education_entry_new_field_title">Aggiungi campi personalizzati</string>
<string name="education_entry_new_field_summary">Registra un campo base non fornito, inserendone uno nuovo che puoi anche proteggere.</string>
<string name="education_entry_new_field_summary">Registra un campo aggiuntivo, inserisci delle informazioni e proteggilo se necessario.</string>
<string name="education_unlock_title">Sblocca il tuo database</string>
<string name="education_read_only_title">Proteggi da scrittura il tuo database</string>
<string name="education_read_only_summary">Cambia la modalità di apertura per la sessione.
@@ -291,9 +290,8 @@
<string name="education_donation_title">Partecipa</string>
<string name="education_donation_summary">Aiuta a migliorare la stabilità, la sicurezza e ad aggiungere nuove funzioni.</string>
<string name="html_text_ad_free">Diversamente da molte app di gestione password, questa è &lt;strong&gt;senza pubblicità&lt;/strong&gt;, &lt;strong&gt;software libero (copyleft)&lt;/strong&gt; 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 questa &lt;strong&gt;funzione visiva&lt;/strong&gt; e soprattutto aiuterai nella &lt;strong&gt;realizzazione di progetti della comunità.&lt;/strong&gt;
</string>
<string name="html_text_feature_generosity">Questa &lt;strong&gt;funzione visiva&lt;/strong&gt; è disponibile grazie alla tua generosità.</string>
<string name="html_text_buy_pro">Acquistando la versione pro, avrai accesso a questo &lt;strong&gt;tema&lt;/strong&gt; e soprattutto aiuterai nella &lt;strong&gt;realizzazione di progetti della comunità.&lt;/strong&gt;</string>
<string name="html_text_feature_generosity">Questo&lt;strong&gt;tema&lt;/strong&gt; è disponibile grazie alla tua generosità.</string>
<string name="html_text_donation">Per mantenere la nostra libertà ed essere sempre attivi, contiamo sul tuo &lt;strong&gt;contributo.&lt;/strong&gt;
</string>
<string name="html_text_dev_feature">Questa funzione è &lt;strong&gt;in sviluppo&lt;/strong&gt; e richiede il tuo &lt;strong&gt;contributo&lt;/strong&gt; per essere disponibile a breve.</string>
@@ -309,7 +307,7 @@
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="encryption_twofish">Twofish</string>
<string name="encryption_chacha20">ChaCha20</string>
<string name="kdf_AES">AES KDF</string>
<string name="kdf_AES">AES</string>
<string name="kdf_Argon2">Argon2</string>
<string name="style_choose_title">Tema dell\'app</string>
<string name="style_choose_summary">Tema usato nell\'app</string>
@@ -345,12 +343,12 @@
<string name="lock_database_back_root_title">Premere \'\'Indietro\'\' per bloccare</string>
<string name="lock_database_back_root_summary">Bloccare il database quando l\'utente preme il pulsante Indietro nella schermata principale</string>
<string name="clear_clipboard_notification_title">Pulisci alla chiusura</string>
<string name="clear_clipboard_notification_summary">Chiudere il database alla chiusura della notifica</string>
<string name="clear_clipboard_notification_summary">Blocca il database alla chiusura della notifica</string>
<string name="recycle_bin">Cestino</string>
<string name="keyboard_selection_entry_title">Selezione elemento</string>
<string name="keyboard_selection_entry_summary">Mostra i campi di input nella Magitastiera durante la visualizzazione di un elemento</string>
<string name="delete_entered_password_title">Elimina password</string>
<string name="delete_entered_password_summary">Elimina la password immessa dopo un tentativo di connessione</string>
<string name="delete_entered_password_summary">Elimina la password immessa dopo un tentativo di connessione al database</string>
<string name="content_description_open_file">Apri il file</string>
<string name="content_description_node_children">Figli del nodo</string>
<string name="content_description_add_node">Aggiungi un nodo</string>
@@ -437,7 +435,7 @@
<string name="recycle_bin_group_title">Gruppo cestino</string>
<string name="database_data_compression_summary">La compressione dei dati riduce le dimensioni del database.</string>
<string name="database_data_compression_title">Compressione dati</string>
<string name="biometric_auto_open_prompt_summary">Apri automaticamente il prompt biometrico quando viene definita una chiave biometrica per un database</string>
<string name="biometric_auto_open_prompt_summary">Proponi l\'autenticazione biometrica quando il database è configurato per usarla</string>
<string name="advanced_unlock_explanation_summary">Utilizza lo sblocco avanzato per aprire il database più facilmente</string>
<string name="clipboard_explanation_summary">Copia i campi di immissione utilizzando gli appunti del tuo dispositivo</string>
<string name="database_opened">Database aperto</string>
@@ -479,4 +477,17 @@
<string name="warning_database_link_revoked">Accesso al file revocato dal file manager</string>
<string name="remember_keyfile_locations_summary">Ricorda la posizione dei keyfiles dei database</string>
<string name="error_label_exists">Questa etichetta esiste già.</string>
</resources>
<string name="autofill_block_restart">Riavvia l\'app contenente il campo per attivare il blocco.</string>
<string name="autofill_block">Blocca riempimento automatico</string>
<string name="autofill_web_domain_blocklist_summary">La lista di blocco impedisce l\'auto riempimento nei domini web</string>
<string name="autofill_web_domain_blocklist_title">Lista di blocco per domini web</string>
<string name="autofill_application_id_blocklist_title">Lista di blocco per app</string>
<string name="autofill_application_id_blocklist_summary">La lista di blocco impedisce l\'auto riempimento nelle app</string>
<string name="keyboard_search_share_summary">Cerca automaticamente le informazioni condivise per compilare la tastiera</string>
<string name="keyboard_search_share_title">Cerca informazioni condivise</string>
<string name="filter">Filtro</string>
<string name="error_string_type">Questo testo non soddisfa l\'elemento richiesto.</string>
<string name="subdomain_search_summary">Cerca nei domini web includendo i sotto-domini</string>
<string name="subdomain_search_title">Ricerca per sotto-dominio</string>
<string name="content_description_add_item">Aggiungi elemento</string>
</resources>

View File

@@ -149,7 +149,6 @@
<string name="edit_entry">ערוך רשומה</string>
<string name="encryption">הצפנה</string>
<string name="allow">אפשר</string>
<string name="clipboard_swipe_clean">החלק לניקוי לוח העתקה עכשיו</string>
<string name="entry_url">כתובת URL</string>
<string name="error_load_database">לא ניתן לטעון את בסיס הנתונים</string>
</resources>

View File

@@ -147,7 +147,6 @@
<string name="clipboard_error_title">クリップボードエラー</string>
<string name="clipboard_error">一部の端末ではアプリからクリップボードを使用できません。</string>
<string name="clipboard_error_clear">クリップボードをクリアできません</string>
<string name="clipboard_swipe_clean">スワイプすると今すぐクリップボードをクリアします</string>
<string name="entry_not_found">エントリデータが見つかりませんでした。</string>
<string name="error_load_database">データベースを読み込みできませんでした。</string>
<string name="error_load_database_KDF_memory">鍵を読み込みできませんでした。KDF の \"メモリ使用量\" を下げてみてください。</string>

View File

@@ -41,7 +41,6 @@
<string name="clipboard_error_clear">클립보드를 비울 수 없음</string>
<string name="clipboard_timeout">클립보드 시간 초과</string>
<string name="clipboard_timeout_summary">클립보드 저장이 유지될 시간</string>
<string name="clipboard_swipe_clean">클립보드를 지우기 위해 스와이프</string>
<string name="select_to_copy">%1$s 을(를) 클립보드에 복사하려면 선택하십시오.</string>
<string name="retrieving_db_key">데이터베이스 키를 검색하는 중…</string>
<string name="database">데이터베이스</string>

View File

@@ -40,7 +40,6 @@
<string name="clipboard_error_clear">Kunne ikke tømme utklippstavle</string>
<string name="clipboard_timeout">Tidsavbrudd for utklippstavle</string>
<string name="clipboard_timeout_summary">Tid før utklippstavlen tømmes etter kopiering av brukernavn og passord</string>
<string name="clipboard_swipe_clean">Dra for å tømme utklippstavlen nå</string>
<string name="select_to_copy">Velg for å kopier %1$s til utklippstavlen</string>
<string name="retrieving_db_key">Oppretter databasenøkkel…</string>
<string name="database">Database</string>

View File

@@ -151,7 +151,6 @@
<string name="clipboard_error_title">Klembordfout</string>
<string name="clipboard_error">Sommige apparaten staan niet toe dat apps het klembord gebruiken.</string>
<string name="clipboard_error_clear">Wissen van klembord mislukt</string>
<string name="clipboard_swipe_clean">Veeg om klembord nu te wissen</string>
<string name="entry_not_found">Geen iteminhoud gevonden.</string>
<string name="error_load_database">Je database kan niet worden geladen.</string>
<string name="error_load_database_KDF_memory">De sleutel kan niet worden geladen. Probeer om het \"geheugengebruik\" van KDF te verminderen.</string>
@@ -476,4 +475,17 @@
<string name="contact">Contact</string>
<string name="keyboard_search_share_summary">Zoek automatisch naar gedeelde informatie om het toetsenbord te vullen</string>
<string name="keyboard_search_share_title">Gedeelde informatie zoeken</string>
<string name="autofill_block_restart">Start de app met het formulier opnieuw op om de blokkering te activeren.</string>
<string name="autofill_block">Blokkering van automatisch invullen</string>
<string name="autofill_web_domain_blocklist_summary">Lijst die het automatisch invullen bij webdomeinen voorkomt</string>
<string name="autofill_web_domain_blocklist_title">Webdomein blokkeringslijst</string>
<string name="autofill_application_id_blocklist_summary">Lijst die het automatisch invullen bij apps voorkomt</string>
<string name="autofill_application_id_blocklist_title">Applicatieblokkering</string>
<string name="filter">Filteren</string>
<string name="subdomain_search_summary">Zoeken op webdomein met beperkingen voor subdomein</string>
<string name="subdomain_search_title">Zoeken op subdomein</string>
<string name="error_string_type">Deze tekst komt niet overeen met het gevraagde item.</string>
<string name="content_description_add_item">Item toevoegen</string>
<string name="keyboard_auto_go_action_summary">\"Gaan\"-toetsactie na het indrukken van een \"Veld\"-toets</string>
<string name="keyboard_auto_go_action_title">Auto-type actie</string>
</resources>

View File

@@ -0,0 +1,250 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hide_expired_entries_summary">ਮਿਆਦ ਪੁੱਗੀਆਂ ਐਂਟਰੀਆਂ ਨੂੰ ਲੁਕਾ ਕੇ ਰੱਖੋ</string>
<string name="hide_expired_entries_title">ਮਿਆਦ ਪੁੱਗੀਆਂ ਐਂਟਰੀਆਂ ਲੁਕਾਓ</string>
<string name="icon_pack_choose_summary">ਐਪ ਵਿੱਚ ਵਰਤਿਆ ਆਈਕਾਨ ਪੈਕ</string>
<string name="icon_pack_choose_title">ਆਈਕਾਨ ਪੈਕ</string>
<string name="style_choose_summary">ਐਪ ਵਿੱਚ ਵਰਤਿਆ ਥੀਮ</string>
<string name="style_choose_title">ਐਪ ਦਾ ਥੀਮ</string>
<string name="download_complete">ਪੂਰਾ ਹੋਇਆ! ਫ਼ਾਇਲ ਖੋਲ੍ਹਣ ਲਈ ਛੂਹੋ।</string>
<string name="download_finalization">…ਪੂਰਾ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</string>
<string name="download_progression">ਜਾਰੀ ਹੈ: %1$d%%</string>
<string name="download_initialization">…ਸ਼ੁਰੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</string>
<string name="download_attachment">%1$s ਡਾਊਨਲੋਡ ਕਰੋ</string>
<string name="contribute">ਯੋਗਦਾਨ</string>
<string name="download">ਡਾਊਨਲੋਡ ਕਰੋ</string>
<string name="education_setup_OTP_title">OTP ਸੈਟਅੱਪ ਕਰੋ</string>
<string name="education_create_database_title">ਆਪਣੀ ਡਾਟਾਬੇਸ ਫ਼ਾਇਲ ਬਣਾਓ</string>
<string name="delete_entered_password_title">ਪਾਸਵਰਡ ਹਟਾਓ</string>
<string name="keyboard_appearance_category">ਦਿੱਖ</string>
<string name="keyboard_notification_entry_title">ਨੋਟੀਫਿਕੇਸ਼ਨ ਜਾਣਕਾਰੀ</string>
<string name="compression_none">ਕੋਈ ਨਹੀਂ</string>
<string name="clear_clipboard_notification_title">ਬੰਦ ਕਰਨ ਉੱਤੇ ਸਾਫ਼ ਕਰੋ</string>
<string name="disable">ਅਸਮਰੱਥ</string>
<string name="enable">ਸਮਰੱਥ</string>
<string name="full_file_path_enable_title">ਫ਼ਾਇਲ ਦਾ ਮਾਰਗ</string>
<string name="assign_master_key">ਮਾਸਟਰ ਕੁੰਜੀ ਦਿਓ</string>
<string name="path">ਮਾਰਗ</string>
<string name="file_name">ਫ਼ਾਇਲ ਦਾ ਨਾਂ</string>
<string name="lock_database_screen_off_title">ਸਕਰੀਨ ਲਾਕ</string>
<string name="lock">ਲਾਕ</string>
<string name="clipboard">ਕਲਿੱਪਬੋਰਡ</string>
<string name="database_opened">ਡਾਟਾਬੇਸ ਖੁੱਲ੍ਹਾ ਹੈ</string>
<string name="autofill_sign_in_prompt">KeePassDX ਨਾਲ ਸਾਇਨ ਇਨ ਕਰੋ</string>
<string name="autofill">ਆਪੇ-ਭਰਨ</string>
<string name="general">ਸਧਾਰਨ</string>
<string name="biometric">ਬਾਇਓਮੈਟਰਿਕ</string>
<string name="menu_appearance_settings">ਦਿੱਖ</string>
<string name="database_history">ਅਤੀਤ</string>
<string name="warning">ਚੇਤਾਵਨੀ</string>
<string name="uppercase">ਵੱਡੇ ਅੱਖਰ (ਅੰਗਰੇਜ਼ੀ)</string>
<string name="unsupported_db_version">ਗ਼ੈਰ-ਸਹਾਇਕ ਡਾਟਾਬੇਸ ਵਰਜ਼ਨ ਹੈ।</string>
<string name="underline">ਹੇਠਾਂ ਲਾਈਨ</string>
<string name="search_results">ਖੋਜ ਨਤੀਜੇ</string>
<string name="search">ਖੋਜ</string>
<string name="special">ਖਾਸ</string>
<string name="sort_last_access_time">ਪਹੁੰਚ</string>
<string name="sort_last_modify_time">ਸੋਧ</string>
<string name="sort_creation_time">ਨਿਰਮਾਣ</string>
<string name="sort_username">ਵਰਤੋਂਕਾਰ-ਨਾਂ</string>
<string name="sort_groups_before">ਗਰੁੱਪ ਪਹਿਲਾਂ</string>
<string name="sort_ascending">ਸਭ ਤੋਂ ਘੱਟ ਪਹਿਲਾਂ ↓</string>
<string name="sort_menu">ਲੜੀਬੱਧ</string>
<string name="filter">ਫਿਲਟਰ</string>
<string name="search_label">ਖੋਜੋ</string>
<string name="space">ਥਾਂ</string>
<string name="saving_database">…ਡਾਟਾਬੇਸ ਸੰਭਾਲਿਆ ਜਾ ਰਿਹਾ ਹੈ</string>
<string name="memory_usage">ਮੈਮੋਰੀ ਵਰਤੋਂ</string>
<string name="root">ਰੂਟ</string>
<string name="hide_broken_locations_summary">ਤਾਜ਼ਾ ਡਾਟਾਬੇਸਾਂ ਦੀ ਸੂਚੀ ਵਿੱਚ ਖ਼ਰਾਬ ਹੋਏ ਲਿੰਕ ਲੁਕਾਓ</string>
<string name="hide_broken_locations_title">ਖ਼ਰਾਬ ਹੋਏ ਡਾਟਾਬੇਸ ਲਿੰਕ ਲੁਕਾਓ</string>
<string name="show_recent_files_summary">ਤਾਜ਼ਾ ਡਾਟਾਬੇਸਾਂ ਦੇ ਟਿਕਾਣੇ ਵਿਖਾਓ</string>
<string name="show_recent_files_title">ਤਾਜ਼ਾ ਫ਼ਾਇਲਾਂ ਵਿਖਾਓ</string>
<string name="remember_database_locations_title">ਡਾਟਾਬੇਸਾਂ ਦਾ ਟਿਕਾਣਾ ਸੰਭਾਲੋ</string>
<string name="remember_keyfile_locations_title">ਕੁੰਜੀ-ਫ਼ਾਇਲਾਂ ਦਾ ਟਿਕਾਣਾ ਸੰਭਾਲੋ</string>
<string name="remember_database_locations_summary">ਡਾਟਾਬੇਸ ਦੇ ਟਿਕਾਣੇ ਨੂੰ ਯਾਦ ਰੱਖੋ</string>
<string name="selection_mode">ਚੋਣ ਦਾ ਢੰਗ</string>
<string name="contains_duplicate_uuid">ਡਾਟਾਬੇਸ ਵਿੱਚ ਡੁਪਲੀਕੇਟ UUID ਹਨ।</string>
<string name="read_only_warning">ਤੁਹਾਡੇ ਫ਼ਾਇਲ ਮੈਨੇਜਰ ਦੇ ਮੁਤਾਬਕ KeePassDX ਨੂੰ ਤੁਹਾਡੇ ਸਟੋਰੇਜ਼ ਵਿੱਚ ਲਿਖਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੋ ਸਕਦੀ ਹੈ।</string>
<string name="read_only">ਲਿਖਣ-ਤੋਂ-ਬਚਾਅ</string>
<string name="protection">ਸੁਰੱਖਿਆ</string>
<string name="progress_title">…ਕੰਮ ਜਾਰੀ ਹੈ</string>
<string name="progress_create">…ਨਵਾਂ ਡਾਟਾਬੇਸ ਬਣਾਇਆ ਜਾ ਰਿਹਾ ਹੈ</string>
<string name="subdomain_search_title">ਅਧੀਨ-ਡੋਮੇਨ ਖੋਜ</string>
<string name="auto_focus_search_summary">ਜਦੋਂ ਡਾਟਾਬੇਸ ਖੋਲ੍ਹਣਾ ਹੋਵੇ ਤਾਂ ਖੋਜ ਦੀ ਮੰਗ ਕਰੋ</string>
<string name="auto_focus_search_title">ਫ਼ੌਰੀ ਖੋਜ</string>
<string name="omit_backup_search_title">ਬੈਕਐਪ ਐਂਟਰੀਆਂ ਰਾਹੀਂ ਨਾ ਖੋਜੋ</string>
<string name="create_keepass_file">ਨਵਾਂ ਡਾਟਾਬੇਸ ਬਣਾਓ</string>
<string name="select_database_file">ਮੌਜੂਦਾ ਡਾਟਾਬੇਸ ਨੂੰ ਖੋਲ੍ਹੋ</string>
<string name="no_url_handler">ਇਹ URL ਖੋਲ੍ਹਣ ਲਈ ਵੈੱਬ ਬਰਾਊਜ਼ਰ ਇੰਸਟਾਲ ਕਰੋ।</string>
<string name="no_results">ਕੋਈ ਖੋਜ ਨਤੀਜੇ ਨਹੀਂ</string>
<string name="never">ਕਦੇ ਵੀ ਨਹੀਂ</string>
<string name="minus">ਘਟਾਓ</string>
<string name="menu_delete_entry_history">ਅਤੀਤ ਨੂੰ ਹਟਾਓ</string>
<string name="menu_restore_entry_history">ਅਤੀਤ ਨੂੰ ਬਹਾਲ ਕਰੋ</string>
<string name="menu_empty_recycle_bin">ਰੱਦੀ ਨੂੰ ਖਾਲੀ ਕਰੋ</string>
<string name="menu_open_file_read_and_write">ਸੋਧ-ਯੋਗ</string>
<string name="menu_file_selection_read_only">ਲਿਖਣ-ਤੋਂ-ਬਚਾਅ</string>
<string name="menu_url">URL ਉੱਤੇ ਜਾਓ</string>
<string name="menu_biometric_remove_key">ਸੰਭਾਲੀ ਬਾਇਓਮੈਟਰਿਕ ਕੁੰਜੀ ਹਟਾਓ</string>
<string name="menu_showpass">ਪਾਸਵਰਡ ਵਿਖਾਓ</string>
<string name="menu_search">ਖੋਜੋ</string>
<string name="menu_open">ਖੋਲ੍ਹੋ</string>
<string name="menu_save_database">ਡਾਟਾਬੇਸ ਸੰਭਾਲੋ</string>
<string name="menu_lock">ਡਾਟਾਬੇਸ ਲਾਕ ਕਰੋ</string>
<string name="menu_hide_password">ਪਾਸਵਰਡ ਲੁਕਾਓ</string>
<string name="menu_cancel">ਰੱਦ ਕਰੋ</string>
<string name="menu_delete">ਹਟਾਓ</string>
<string name="menu_paste">ਚੇਪੋ</string>
<string name="menu_move">ਭੇਜੋ</string>
<string name="menu_copy">ਕਾਪੀ ਕਰੋ</string>
<string name="menu_edit">ਸੋਧੋ</string>
<string name="menu_donate">ਦਾਨ ਦਿਓ</string>
<string name="menu_master_key_settings">ਮਾਸਟਰ ਕੁੰਜੀ ਸੈਟਿੰਗਾਂ</string>
<string name="menu_security_settings">ਸੁਰੱਖਿਆ ਸੈਟਿੰਗਾਂ</string>
<string name="menu_database_settings">ਡਾਟਾਬੇਸ ਸੈਟਿੰਗਾਂ</string>
<string name="menu_advanced_unlock_settings">ਤਕਨੀਕੀ ਅਣ-ਲਾਕ</string>
<string name="menu_form_filling_settings">ਫਾਰਮ ਭਰਨਾ</string>
<string name="menu_app_settings">ਐਪ ਸੈਟਿੰਗਾਂ</string>
<string name="settings">ਸੈਟਿੰਗਾਂ</string>
<string name="copy_field">%1$s ਦੀ ਕਾਪੀ</string>
<string name="menu_change_key_settings">ਮਾਸਟਰ ਕੁੰਜੀ ਬਦਲੋ</string>
<string name="about">ਇਸ ਬਾਰੇ</string>
<string name="hide_password_summary">ਪਾਸਵਰਡਾਂ ਨੂੰ ਮੂਲ ਰੂਪ ਵਿੱਚ ਲੁਕਾਓ (***)</string>
<string name="hide_password_title">ਪਾਸਵਰਡ ਲੁਕਾਓ</string>
<string name="lowercase">ਛੋਟੇ ਅੱਖਰ (ਅੰਗਰੇਜ਼ੀ)</string>
<string name="loading_database">…ਡਾਟਾਬੇਸ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</string>
<string name="creating_database">…ਡਾਟਾਬੇਸ ਬਣਾਇਆ ਜਾ ਰਿਹਾ ਹੈ</string>
<string name="list_size_summary">ਭਾਗ ਸੂਚੀ ਵਿੱਚ ਲਿਖਤ ਦਾ ਆਕਾਰ</string>
<string name="list_size_title">ਸੂਚੀ ਚੀਜ਼ਾਂ ਦਾ ਆਕਾਰ</string>
<string name="list_groups_show_number_entries_summary">ਗਰੁੱਪ ਵਿੱਚ ਐਂਟਰੀਆਂ ਦੀ ਗਿਣਤੀ ਵਿਖਾਓ</string>
<string name="list_groups_show_number_entries_title">ਐਂਟਰੀਆਂ ਦੀ ਗਿਣਤੀ ਵਿਖਾਓ</string>
<string name="list_entries_show_username_summary">ਐਂਟਰੀ ਸੂਚੀਆਂ ਵਿੱਚ ਵਰਤੋਂਕਾਰ-ਨਾਂ ਵਿਖਾਓ</string>
<string name="list_entries_show_username_title">ਵਰਤੋਂਕਾਰ-ਨਾਂ ਵਿਖਾਓ</string>
<string name="length">ਲੰਬਾਈ</string>
<string name="invalid_algorithm">ਗ਼ਲਤ ਐਲਗੋਰਿਥ ਹੈ।</string>
<string name="invalid_credentials">ਸਨਦ ਪੜ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕੀ।</string>
<string name="password">ਪਾਸਵਰਡ</string>
<string name="hint_pass">ਪਾਸਵਰਡ</string>
<string name="hint_length">ਲੰਬਾਈ</string>
<string name="hint_keyfile">ਕੁੰਜੀ-ਫ਼ਾਇਲ</string>
<string name="hint_group_name">ਗਰੁੱਪ ਦਾ ਨਾਂ</string>
<string name="hint_generated_password">ਪਾਸਵਰਡ ਬਣਾਇਆ</string>
<string name="hint_conf_pass">ਪਾਸਵਰਡ ਤਸਦੀਕ ਕਰੋ</string>
<string name="generate_password">ਪਾਸਵਰਡ ਬਣਾਓ</string>
<string name="file_browser">ਫ਼ਾਇਲ ਮੈਨੇਜਰ</string>
<string name="file_not_found_content">ਫ਼ਾਇਲ ਲੱਭੀ ਨਹੀਂ ਜਾ ਸਕੀ। ਆਪਣੇ ਫ਼ਾਇਲ ਬਰਾਊਜ਼ਰ ਤੋਂ ਮੁੜ ਖੋਲ੍ਹ ਕੇ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</string>
<string name="field_value">ਖੇਤਰ ਦਾ ਮੁੱਲ</string>
<string name="field_name">ਖ਼ੇਤਰ ਦਾ ਨਾਂ</string>
<string name="error_string_type">ਇਹ ਲਿਖਤ ਮੰਗੀ ਕੀਤੀ ਚੀਜ਼ ਨਾਲ ਮਿਲਦੀ ਨਹੀਂ ਹੈ।</string>
<string name="error_otp_digits">ਟੋਕਨ ਵਿੱਚ %1$d ਤੋਂ %2$d ਅੰਕ ਹੋਣੇ ਚਾਹੀਦੇ ਹਨ।</string>
<string name="error_otp_period">ਅੰਤਰਾਲ %1$d ਅਤੇ %2$d ਸਕਿੰਟਾਂ ਵਿਚਾਲੇ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।</string>
<string name="error_otp_counter">ਗਿਣਤੀ %1$d ਅਤੇ %2$d ਦੇ ਵਿਚਾਲੇ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ।</string>
<string name="error_otp_secret_key">ਭੇਤ ਕੁੰਜੀ Base32 ਫਾਰਮੈਟ ਵਿੱਚ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ।</string>
<string name="error_save_database">ਡਾਟਾਬੇਸ ਸੰਭਾਲਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ।</string>
<string name="error_create_database_file">ਇਸ ਪਾਸਵਰਡ ਅਤੇ ਕੁੰਜੀ-ਫ਼ਾਇਲ ਲਈ ਡਾਟਾਬੇਸ ਬਣਾਉਣ ਲਈ ਅਸਮਰੱਥ ਹੈ।</string>
<string name="error_label_exists">ਇਹ ਲੇਬਲ ਪਹਿਲਾਂ ਹੀ ਵਰਤਿਆ ਗਿਆ ਹੈ।</string>
<string name="error_string_key">ਹਰ ਸਤਰ ਲਈ ਖੇਤਰ ਨਾਂ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।</string>
<string name="error_pass_match">ਪਾਸਵਰਡ ਮਿਲਦੇ ਨਹੀਂ ਹਨ।</string>
<string name="error_disallow_no_credentials">ਘੱਟੋ-ਘੱਟ ਇੱਕ ਸਨਦ ਸੈੱਟ ਕੀਤੀ ਜਾਣੀ ਚਾਹੀਦੀ ਹੈ।</string>
<string name="error_pass_gen_type">ਘੱਟੋ-ਘੱਟ ਇੱਕ ਪਾਸਵਰਡ ਜਰਨੇਟਰ ਕਿਸਮ ਚੁਣਨੀ ਲਾਜ਼ਮੀ ਹੈ।</string>
<string name="error_load_database_KDF_memory">ਕੁੰਜੀ ਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ। KDF \"ਮੈਮੋਰੀ ਵਰਤੋਂ\" ਘਟਾ ਕੇ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</string>
<string name="error_load_database">ਤੁਹਾਡੇ ਡਾਟਾਬੇਸ ਨੂੰ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।</string>
<string name="error_out_of_memory">ਤੁਹਾਡੇ ਪੂਰੇ ਡਾਟਾਬੇਸ ਨੂੰ ਲੋਡ ਕਰਨ ਲਈ ਮੈਮੋਰੀ ਨਹੀਂ ਹੈ।</string>
<string name="error_nokeyfile">ਕੁੰਜੀ-ਫ਼ਾਇਲ ਚੁਣੋ।</string>
<string name="error_no_name">ਨਾਂ ਦਿਓ।</string>
<string name="error_invalid_OTP">ਗ਼ਲਤ OTP ਭੇਤ ਹੈ।</string>
<string name="error_invalid_path">ਪਾਥ ਦੇ ਠੀਕ ਹੋਣ ਨੂੰ ਯਕੀਨੀ ਬਣਾਓ।</string>
<string name="error_invalid_db">ਡਾਟਾਬੇਸ ਪੜ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ।</string>
<string name="error_file_not_create">ਫ਼ਾਇਲ ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕੀ:</string>
<string name="error_can_not_handle_uri">ਇਹ URI KeePassDX ਵਿੱਚ ਹੈਂਡਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।</string>
<string name="error_arc4">Arcfour ਸਟਰੀਮ ਸੀਫ਼ਰ ਸਹਾਇਕ ਨਹੀਂ ਹੈ।</string>
<string name="entry_user_name">ਵਰਤੋਂਕਾਰ-ਨਾਂ</string>
<string name="entry_url">URL</string>
<string name="entry_otp">OTP</string>
<string name="otp_algorithm">ਐਲਗੋਰਿਥਮ</string>
<string name="otp_digits">ਅੰਕ</string>
<string name="otp_counter">ਗਿਣਤੀ</string>
<string name="otp_period">ਅੰਤਰਾਲ (ਸਕਿੰਟ)</string>
<string name="otp_secret">ਗੁਪਤ</string>
<string name="otp_type">OTP ਦੀ ਕਿਸਮ</string>
<string name="entry_setup_otp">ਇਕੇਹਰਾ ਪਾਸਵਰਡ ਸੈਟਅੱਪ ਕਰੋ</string>
<string name="entry_title">ਨਾਂ</string>
<string name="entry_save">ਸੰਭਾਲੋ</string>
<string name="entry_password">ਪਾਸਵਰਡ</string>
<string name="entry_not_found">ਐਂਟਰੀ ਡਾਟਾ ਲੱਭਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ।</string>
<string name="entry_modified">ਸੋਧ ਕੀਤੀ</string>
<string name="entry_keyfile">ਕੁੰਜੀ-ਫ਼ਾਇਲ</string>
<string name="entry_attachments">ਨੱਥੀ ਕੀਤੇ</string>
<string name="entry_history">ਅਤੀਤ</string>
<string name="entry_UUID">UUID</string>
<string name="entry_expires">ਮਿਆਦ ਪੁੱਗਦੀ ਹੈ</string>
<string name="entry_created">ਬਣਾਇਆ</string>
<string name="entry_confpassword">ਪਾਸਵਰਡ ਤਸਦੀਕ ਕਰੋ</string>
<string name="entry_notes">ਨੋਟਿਸ</string>
<string name="entry_cancel">ਰੱਦ ਕਰੋ</string>
<string name="entry_accessed">ਅਸੈਸ ਕੀਤਾ</string>
<string name="html_about_contribution">&lt;strong&gt;ਸਾਡੀ ਆਜ਼ਾਦੀ ਬਣਾਈ ਰੱਖਣ&lt;/strong&gt;, &lt;strong&gt;ਬੱਗ ਠੀਕ ਕਰਨ&lt;/strong&gt;, &lt;strong&gt;ਹੋਰ ਫ਼ੀਚਰ ਜੋੜਨ&lt;/strong&gt; ਅਤੇ &lt;strong&gt;ਹਮੇਸ਼ਾਂ ਸਰਗਰਮ ਰਹਿਣ&lt;/strong&gt; ਵਾਸਤੇ ਅਸੀਂ ਤੁਹਾਡੇ &lt;strong&gt;ਯੋਗਦਾਨ&lt;/strong&gt; ਉੱਤੇ ਨਿਰਭਰ ਕਰਦੇ ਹਾਂ।</string>
<string name="html_about_licence">KeePassDX © %1$d Kunzisoft &lt;strong&gt;ਆਜ਼ਾਦ ਸਰੋਤ&lt;/strong&gt; ਅਤੇ &lt;strong&gt;ਬਿਨਾਂ ਇਸ਼ਤਿਹਾਰਾਂ&lt;/strong&gt; ਤੋਂ ਹੈ।
\nਇਸ ਨੂੰ &lt;strong&gt;GPLv3&lt;/strong&gt; ਲਸੰਸ ਦੇ ਅਧੀਨ ਬਿਨਾਂ ਕਿਸੇ ਵਾਰੰਟੀ ਦੇ ਦਿੱਤਾ ਜਾ ਰਿਹਾ ਹੈ।</string>
<string name="digits">ਅੰਕ</string>
<string name="default_checkbox">ਮੂਲ ਡਾਟਾਬੇਸ ਵਜੋਂ ਵਰਤੋਂ</string>
<string name="decrypting_db">…ਡਾਟਾਬੇਸ ਸਮੱਗਰੀ ਡਿਕ੍ਰਿਪਟ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ</string>
<string name="database">ਡਾਟਾਬੇਸ</string>
<string name="retrieving_db_key">ਡਾਟਾਬੇਸ ਕੁੰਜੀ ਲਈ ਜਾ ਰਹੀ ਹੈ…</string>
<string name="select_to_copy">%1$s ਨੂੰ ਕਲਿੱਪਬੋਰਡ ਵਿੱਚ ਕਾਪੀ ਕਰਨ ਲਈ ਚੁਣੋ</string>
<string name="content_description_keyboard_close_fields">ਖੇਤਰਾਂ ਨੂੰ ਬੰਦ ਕਰੋ</string>
<string name="content_description_remove_from_list">ਹਟਾਓ</string>
<string name="content_description_update_from_list">ਅੱਪਡੇਟ ਕਰੋ</string>
<string name="content_description_remove_field">ਖੇਤਰ ਹਟਾਓ</string>
<string name="entry_add_attachment">ਨੱਥੀ ਕਰੋ</string>
<string name="entry_add_field">ਖੇਤਰ ਜੋੜੋ</string>
<string name="content_description_password_length">ਪਾਸਵਰਡ ਦੀ ਲੰਬਾਈ</string>
<string name="entry_password_generator">ਪਾਸਵਰਡ ਜਰਨੇਟਰ</string>
<string name="discard">ਅਣਡਿੱਠਾ</string>
<string name="discard_changes">ਤਬਦੀਲੀਆਂ ਅਣਡਿੱਠੀਆਂ ਕਰਨੀਆਂ ਹਨ\?</string>
<string name="validate">ਵੈਧਤਾ</string>
<string name="content_description_entry_icon">ਐਂਟਰੀ ਆਈਕਾਨ</string>
<string name="content_description_repeat_toggle_password_visibility">ਪਾਸਵਰਡ ਦਿੱਖ ਨੂੰ ਦੁਬਾਰਾ ਬਦਲੋ</string>
<string name="content_description_keyfile_checkbox">ਕੁੰਜੀ-ਫ਼ਾਇਲ ਚੈਕ-ਬਕਸਾ</string>
<string name="content_description_password_checkbox">ਪਾਸਵਰਡ ਚੈਕ-ਬਕਸਾ</string>
<string name="content_description_file_information">ਫ਼ਾਇਲ ਦੀ ਜਾਣਕਾਰੀ</string>
<string name="content_description_add_item">ਚੀਜ਼ ਜੋੜੋ</string>
<string name="content_description_add_group">ਗਰੁੱਪ ਜੋੜੋ</string>
<string name="content_description_add_entry">ਐਂਟਰੀ ਜੋੜੋ</string>
<string name="content_description_add_node">ਨੋਡ ਜੋੜੋ</string>
<string name="content_description_node_children">ਨੋਡ ਚਾਈਲਡ</string>
<string name="content_description_open_file">ਫ਼ਾਇਲ ਖੋਲ੍ਹੋ</string>
<string name="content_description_background">ਬੈਕਗਰਾਊਂਡ</string>
<string name="clipboard_timeout_summary">ਕਲਿੱਪਬੋਰਡ ਵਿੱਚ ਸਟੋਰ ਕਰਕੇ ਰੱਖਣ ਦੀ ਮਿਆਦ</string>
<string name="clipboard_timeout">ਕਲਿੱਪਬੋਰਡ ਲਈ ਸਮਾਂ-ਮਿਆਦ</string>
<string name="clipboard_error_clear">ਕਲਿੱਪਬੋਰਡ ਸਾਫ਼ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ</string>
<string name="clipboard_error">ਕੁਝ ਡਿਵਾਈਸ ਐਪਾਂ ਨੂੰ ਕਲਿੱਪਬੋਰਡ ਵਰਤਣ ਨਹੀਂ ਦੇਣਗੇ।</string>
<string name="clipboard_error_title">ਕਲਿੱਪਬੋਰਡ ਗ਼ਲਤੀ</string>
<string name="clipboard_cleared">ਕਲਿੱਪਬੋਰਡ ਸਾਫ਼ ਕੀਤਾ</string>
<string name="allow">ਮਨਜ਼ੂਰ</string>
<string name="extended_ASCII">ASCII ਵਾਧਰਾ</string>
<string name="brackets">ਬਰੈਕਟਾਂ</string>
<string name="application">ਐਪ</string>
<string name="app_timeout_summary">ਡਾਟਾਬੇਸ ਲਾਕ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਨਾ ਵਰਤਣ ਦਾ ਸਮਾਂ</string>
<string name="app_timeout">ਐਪ ਸਮਾਂ-ਮਿਆਦ</string>
<string name="key_derivation_function">ਕੁੰਜੀ ਡੇਰੀਵੇਸ਼ਨ ਫੰਕਸ਼ਨ</string>
<string name="encryption_algorithm">ਇੰਕ੍ਰਿਪਸ਼ਨ ਐਲਗੋਰਿਥਮ</string>
<string name="encryption">ਇੰਕ੍ਰਿਪਸ਼ਨ</string>
<string name="security">ਸੁਰੱਖਿਆ</string>
<string name="master_key">ਮਾਸਟਰ ਕੁੰਜੀ</string>
<string name="add_group">ਗਰੁੱਪ ਜੋੜੋ</string>
<string name="edit_entry">ਐਂਟਰੀ ਸੋਧੋ</string>
<string name="add_entry">ਐਂਟਰੀ ਜੋੜੋ</string>
<string name="accept">ਮਨਜ਼ੂਰ</string>
<string name="about_description">ਐਂਡਰਾਇਡ ਲਈ ਬਣਾਇਆ KeePass ਪਾਸਵਰਡ ਮੈਨੇਜਰ</string>
<string name="homepage">ਮੁੱਖ-ਸਫ਼ਾ</string>
<string name="feedback">ਸੁਝਾਅ</string>
<string name="contribution">ਯੋਗਦਾਨ</string>
<string name="contact">ਸੰਪਰਕ</string>
<string name="keyfile_is_empty">ਕੁੰਜੀ ਫਾਇਲ ਖਾਲੀ ਹੈ।</string>
<string name="error_create_database">ਡਾਟਾਬੇਸ ਫਾਈਲ ਬਣਾਉਣ ਲਈ ਅਸਮਰੱਥ।</string>
<string name="error_copy_group_here">ਤੁਸੀਂ ਗਰੁੱਪ ਨੂੰ ਇੱਥੇ ਕਾਪੀ ਨਹੀਂ ਕਰ ਸਕਦੇ ਹੋ।</string>
<string name="error_copy_entry_here">ਤੁਸੀੰ ਇਸ ਐੰਟਰੀ ਨੂੰ ਇੱਥੇ ਕਾਪੀ ਨਹੀਂ ਕਰ ਸਕਦੇ ਹੋ।</string>
<string name="error_move_folder_in_itself">ਤੁਸੀੰ ਗਰੁੱਪ ਨੂੰ ਖੁਦ ਵਿੱਚ ਨਹੀਂ ਭੇਜ ਸਕਦੇ ਹੋ।</string>
</resources>

View File

@@ -146,7 +146,6 @@
<string name="clipboard_error_title">Błąd schowka</string>
<string name="clipboard_error">Niektóre urządzenia nie pozwalają aplikacjom korzystać ze schowka.</string>
<string name="clipboard_error_clear">Nie można wyczyścić schowka</string>
<string name="clipboard_swipe_clean">Przesuń, by wyczyścić schowek</string>
<string name="html_about_licence">KeePassDX © %1$d Kunzisoft jest &lt;strong&gt;open source&lt;/strong&gt; i &lt;strong&gt;bez reklam&lt;/strong&gt;.
\nJest on dostarczany w stanie, zgodnie z licencją &lt;strong&gt;GPLv3&lt;/strong&gt; bez żadnych gwarancji.</string>
<string name="entry_not_found">Nie znaleziono danych wejściowych.</string>
@@ -476,4 +475,15 @@
<string name="error_label_exists">Ta etykieta już istnieje.</string>
<string name="keyboard_search_share_summary">Automatyczne wyszukiwanie udostępnionych informacji w celu zapełnienia klawiatury</string>
<string name="keyboard_search_share_title">Wyszukaj udostępnione informacje</string>
<string name="autofill_block_restart">Zrestartuj aplikację zawierającą formularz, aby aktywować blokadę.</string>
<string name="autofill_block">Blokowanie autouzupełniania</string>
<string name="autofill_application_id_blocklist_summary">Lista zablokowanych, która uniemożliwia automatyczne wypełnianie aplikacji</string>
<string name="filter">Filtr</string>
<string name="subdomain_search_title">Wyszukiwanie subdomen</string>
<string name="subdomain_search_summary">Wyszukiwanie domen internetowych z ograniczeniami związanymi z subdomenami</string>
<string name="error_string_type">Ten tekst nie pasuje do żądanej pozycji.</string>
<string name="content_description_add_item">Dodaj pozycję</string>
<string name="autofill_web_domain_blocklist_summary">Lista zablokowanych, która uniemożliwia automatyczne wypełnianie aplikacji</string>
<string name="autofill_web_domain_blocklist_title">Lista zablokowanych domen internetowych</string>
<string name="autofill_application_id_blocklist_title">Lista zablokowanych aplikacji</string>
</resources>

View File

@@ -147,7 +147,6 @@
<string name="clipboard_error_title">Erro na área de transferência</string>
<string name="clipboard_error">Alguns dispositivos não permitem que aplicativos usem a área de transferência.</string>
<string name="clipboard_error_clear">Não foi possível limpar a área de transferência</string>
<string name="clipboard_swipe_clean">Deslize para limpar a área de transferência agora</string>
<string name="entry_not_found">Não pôde encontrar dado de entrada.</string>
<string name="error_string_key">Um nome do campo é necessário para cada string.</string>
<string name="error_autofill_enable_service">Não pôde ser habilitado o serviço de preenchimento automático.</string>

View File

@@ -208,7 +208,6 @@
<string name="edit_entry">Editar entrada</string>
<string name="encryption">Encriptação</string>
<string name="key_derivation_function">Função de derivação de chave</string>
<string name="clipboard_swipe_clean">Deslize para o lado para limpar agora a área de transferência</string>
<string name="error_autofill_enable_service">Não pôde ser habilitado o serviço de preenchimento automático.</string>
<string name="encryption_explanation">Algoritmo de encriptação usado para todos os dados.</string>
<string name="password_size_summary">Define o tamanho padrão para palavras-passe geradas</string>

View File

@@ -40,7 +40,6 @@
<string name="clipboard_error_clear">Nu s-a putut curata memoria carnetelului</string>
<string name="clipboard_timeout">Timp expirat de citire a carnetelului</string>
<string name="clipboard_timeout_summary">Durata de memorare din carnetel</string>
<string name="clipboard_swipe_clean">Schimba ca sa cureti carnetelul acum</string>
<string name="content_description_background">In spate</string>
<string name="content_description_open_file">Deschide fisier</string>
<string name="content_description_node_children">Copil nod</string>

View File

@@ -184,7 +184,6 @@
<string name="sort_last_access_time">Время последнего доступа</string>
<string name="edit_entry">Изменить</string>
<string name="allow">Разрешить</string>
<string name="clipboard_swipe_clean">Смахните для очистки буфера обмена</string>
<string name="error_load_database">Невозможно загрузить базу.</string>
<string name="error_load_database_KDF_memory">Невозможно загрузить ключ. Попробуйте уменьшить размер памяти, используемой функцией формирования ключа (KDF).</string>
<string name="error_move_folder_in_itself">Нельзя переместить группу в саму себя.</string>
@@ -467,7 +466,7 @@
<string name="error_create_database">Невозможно создать файл базы.</string>
<string name="education_setup_OTP_title">Настройте OTP</string>
<string name="education_setup_OTP_summary">Настройте управление одноразовыми паролями (HOTP / TOTP) для создания токена, запрашиваемого при двухфакторной аутентификации (2FA).</string>
<string name="autofill_auto_search_summary">Автоматически предлагать результаты поиска из веб-домена или идентификатора приложения</string>
<string name="autofill_auto_search_summary">Автоматически предлагать результаты поиска для домена или идентификатора приложения</string>
<string name="lock_database_show_button_summary">Использовать кнопку блокировки в интерфейсе</string>
<string name="lock_database_show_button_title">Показывать кнопку блокировки</string>
<string name="error_label_exists">Такая метка уже существует.</string>
@@ -476,4 +475,15 @@
<string name="autofill_preference_title">Настройки автозаполнения</string>
<string name="keyboard_search_share_summary">Выполнять автоматический поиск общедоступной информации для подстановки в клавиатуру</string>
<string name="keyboard_search_share_title">Поиск доступной информации</string>
<string name="subdomain_search_title">Поиск поддоменов</string>
<string name="subdomain_search_summary">Выполнять поиск доменов с некоторыми поддоменами</string>
<string name="autofill_block_restart">Перезапустите приложение, содержащее форму, чтобы активировать отключение.</string>
<string name="autofill_block">Отключить автозаполнение</string>
<string name="error_string_type">Текст не соответствует запрошенному элементу.</string>
<string name="autofill_web_domain_blocklist_summary">Список доменов, для которых функция автозаполнения не применяется</string>
<string name="autofill_web_domain_blocklist_title">Чёрный список доменов</string>
<string name="autofill_application_id_blocklist_summary">Список приложений, для которых функция автозаполнения не применяется</string>
<string name="autofill_application_id_blocklist_title">Чёрный список приложений</string>
<string name="filter">Фильтр</string>
<string name="content_description_add_item">Добавить элемент</string>
</resources>

View File

@@ -147,7 +147,6 @@
<string name="clipboard_error_title">Chyba schránky</string>
<string name="clipboard_error">Niektoré zariadenia nedovolia aplikáciám používať schránku.</string>
<string name="clipboard_error_clear">Nepodarilo sa vymazať schránku</string>
<string name="clipboard_swipe_clean">Schránku vymažete potiahnutím prsta cez políčko</string>
<string name="entry_not_found">Nenašli sa údaje záznamu</string>
<string name="contact">Kontakt</string>
<string name="content_description_open_file">Otvoriť súbor</string>

View File

@@ -156,7 +156,6 @@
<string name="key_derivation_function">Nyckelhärledningsfunktion</string>
<string name="extended_ASCII">Utökad ASCII</string>
<string name="allow">Tillåt</string>
<string name="clipboard_swipe_clean">Svep för att rensa urklipp nu</string>
<string name="content_description_open_file">Öppna fil</string>
<string name="content_description_add_node">Lägg till nod</string>
<string name="content_description_add_entry">Ny post</string>

View File

@@ -57,7 +57,6 @@
<string name="error_invalid_db">Veritabanı okunamadı.</string>
<string name="error_invalid_path">Yolun doğru olduğundan emin olun.</string>
<string name="error_no_name">Bir isim girin.</string>
<string name="clipboard_swipe_clean">Şimdi panoyu temizlemek için kaydırın</string>
<string name="select_to_copy">%1$s dosyasını panoya kopyalamak için seçin</string>
<string name="retrieving_db_key">Veritabanı anahtarı alınıyor…</string>
<string name="decrypting_db">Veritabanı içeriği deşifre ediliyor…</string>
@@ -99,7 +98,7 @@
<string name="length">Uzunluk</string>
<string name="list_entries_show_username_title">Kullanıcı adlarını göster</string>
<string name="list_entries_show_username_summary">Giriş listelerinde kullanıcı adlarını göster</string>
<string name="list_size_title">Liste öğelerinin boyutu</string>
<string name="list_size_title">Liste ögelerinin boyutu</string>
<string name="list_size_summary">Öğe listesindeki metin boyutu</string>
<string name="loading_database">Veritabanı yükleniyor…</string>
<string name="lowercase">Küçük harf</string>
@@ -264,7 +263,7 @@
<string name="education_create_database_summary">İlk parola yönetim dosyanızı oluşturun.</string>
<string name="education_select_database_title">Mevcut bir veritabanını</string>
<string name="education_select_database_summary">Kullanmaya devam etmek için önceki veritabanı dosyanızı dosya tarayıcınızdan açın.</string>
<string name="education_new_node_title">Veritabanınıza öğe ekleyin</string>
<string name="education_new_node_title">Veri tabanınıza öge ekleyin</string>
<string name="education_new_node_summary">Girdiler dijital kimliğinizi yönetmenize yardımcı olur.
\n
\nGruplar (~klasörler) veritabanınızdaki girdileri düzenler.</string>
@@ -293,7 +292,7 @@
\nTercih ettiğiniz form doldurma yöntemini kullanın.</string>
<string name="education_lock_title">Veritabanını kilitle</string>
<string name="education_lock_summary">Veritabanınızı hızlıca kilitleyin, uygulamayı bir süre sonra kilitlemek için ve ekran kapandığında ayarlayabilirsiniz.</string>
<string name="education_sort_title">Öğe sıralama</string>
<string name="education_sort_title">Öge sıralama</string>
<string name="education_sort_summary">Girdilerin ve grupların nasıl sıralandığını seçin.</string>
<string name="education_donation_title">Katıl</string>
<string name="education_donation_summary">Daha fazla özellik ekleyerek istikrarı, güvenliği artırmaya yardımcı olun.</string>
@@ -393,7 +392,7 @@
<string name="database_data_compression_title">Veri sıkıştırma</string>
<string name="database_data_compression_summary">Veri sıkıştırma veritabanı boyutunu azaltır.</string>
<string name="max_history_items_title">Maksimum sayı</string>
<string name="max_history_items_summary">Giriş başına geçmiş öğelerinin sayısını sınırla</string>
<string name="max_history_items_summary">Girdi başına geçmiş ögelerinin sayısını sınırla</string>
<string name="max_history_size_title">Maksimum boyut</string>
<string name="max_history_size_summary">Giriş başına geçmiş boyutunu (bayt olarak) sınırlama</string>
<string name="settings_database_recommend_changing_master_key_title">Yenilemeyi öner</string>
@@ -460,4 +459,15 @@
<string name="error_label_exists">Bu etiket zaten var.</string>
<string name="keyboard_search_share_summary">Klavyeyi doldurmak için paylaşılan bilgileri otomatik olarak ara</string>
<string name="keyboard_search_share_title">Paylaşılan bilgileri ara</string>
<string name="filter">Filtre</string>
<string name="autofill_block_restart">Engellemeyi etkinleştirmek için formu içeren uygulamayı yeniden başlatın.</string>
<string name="autofill_block">Otomatik doldurmayı engelle</string>
<string name="autofill_web_domain_blocklist_summary">Web etki alanlarının otomatik olarak doldurulmasını engelleme listesi</string>
<string name="autofill_web_domain_blocklist_title">Web etki alanı engelleme listesi</string>
<string name="autofill_application_id_blocklist_summary">Uygulamaların otomatik olarak doldurulmasını engelleme listesi</string>
<string name="autofill_application_id_blocklist_title">Uygulama engelleme listesi</string>
<string name="subdomain_search_summary">Web etki alanlarını alt alan kısıtlamaları ile arayın</string>
<string name="subdomain_search_title">Alt etki alanı arama</string>
<string name="error_string_type">Bu metin istenen ögeyle eşleşmiyor.</string>
<string name="content_description_add_item">Öge ekle</string>
</resources>

View File

@@ -43,7 +43,7 @@
\nЗастосунок постачається як є, на умовах ліцензії &lt;strong&gt;GPLv3&lt;/strong&gt;, без будь-яких гарантій.</string>
<string name="select_database_file">Відкрити наявну базу даних</string>
<string name="entry_accessed">Доступ</string>
<string name="entry_cancel">Скасовано</string>
<string name="entry_cancel">Скасувати</string>
<string name="entry_notes">Примітки</string>
<string name="entry_confpassword">Підтвердження пароля</string>
<string name="entry_created">Створено</string>
@@ -83,7 +83,7 @@
<string name="list_size_summary">Розмір тексту у переліку груп</string>
<string name="loading_database">Завантаження бази даних…</string>
<string name="lowercase">Малі літери</string>
<string name="hide_password_title">Приховати паролі</string>
<string name="hide_password_title">Приховувати паролі</string>
<string name="hide_password_summary">Типово приховувати паролі за (***)</string>
<string name="about">Про KeePassDX</string>
<string name="menu_change_key_settings">Змінити головний ключ</string>
@@ -147,7 +147,6 @@
<string name="content_description_open_file">Відкрити файл</string>
<string name="extended_ASCII">Розширений ASCII</string>
<string name="edit_entry">Змінити запис</string>
<string name="clipboard_swipe_clean">Проведіть пальцем, щоб очистити буфер обміну зараз</string>
<string name="clear_clipboard_notification_summary">Блокувати базу даних під час закриття сповіщення</string>
<string name="configure_biometric">Розблокування біометричними даними підтримується, але не налаштоване.</string>
<string name="content_description_add_group">Додати групу</string>
@@ -178,14 +177,14 @@
<string name="encryption">Шифрування</string>
<string name="security">Безпека</string>
<string name="master_key">Головний ключ</string>
<string name="hide_broken_locations_summary">Приховати пошкоджені посилання до недавніх баз даних</string>
<string name="hide_broken_locations_title">Приховати пошкоджені посилання до баз даних</string>
<string name="show_recent_files_summary">Показати розташування недавніх баз даних</string>
<string name="show_recent_files_title">Показати недавні файли</string>
<string name="remember_keyfile_locations_summary">Запам\'ятати розташування файлів ключів баз даних</string>
<string name="remember_keyfile_locations_title">Зберегти розташування файлів ключів</string>
<string name="remember_database_locations_summary">Запам\'ятати розташування баз даних</string>
<string name="remember_database_locations_title">Зберегти розташування баз даних</string>
<string name="hide_broken_locations_summary">Приховувати пошкоджені посилання до недавніх баз даних</string>
<string name="hide_broken_locations_title">Приховувати пошкоджені посилання до баз даних</string>
<string name="show_recent_files_summary">Показувати розташування недавніх баз даних</string>
<string name="show_recent_files_title">Показувати недавні файли</string>
<string name="remember_keyfile_locations_summary">Пам\'ятати розташування файлів ключів баз даних</string>
<string name="remember_keyfile_locations_title">Зберігати розташування файлів ключів</string>
<string name="remember_database_locations_summary">Пам\'ятати розташування баз даних</string>
<string name="remember_database_locations_title">Зберігати розташування баз даних</string>
<string name="selection_mode">Режим вибору</string>
<string name="contains_duplicate_uuid">База даних містить дублікати UUID.</string>
<string name="contains_duplicate_uuid_procedure">Розв\'язати проблему, створивши нові UUID для дублікатів щоби продовжити\?</string>
@@ -216,7 +215,7 @@
<string name="list_groups_show_number_entries_summary">Показувати кількість записів у групі</string>
<string name="list_groups_show_number_entries_title">Показувати кількість записів</string>
<string name="list_entries_show_username_summary">Показувати імена користувачів у переліках записів</string>
<string name="list_entries_show_username_title">Показати імена користувачів</string>
<string name="list_entries_show_username_title">Показувати імена користувачів</string>
<string name="keyfile_is_empty">Файл ключа порожній.</string>
<string name="invalid_db_same_uuid">%1$s з таким самим UUID %2$s вже існує.</string>
<string name="invalid_algorithm">Неправильний алгоритм.</string>
@@ -272,8 +271,8 @@
<string name="biometric_invalid_key">Не вдалося розпізнати біометричний ключ. Видаліть його та повторіть процедуру створення ключа.</string>
<string name="biometric_prompt_store_credential_message">Попередження: Якщо ви користуєтеся біометричним ключем, вам однаково необхідно пам\'ятати головний пароль.</string>
<string name="hide_expired_entries_summary">Застарілі записи приховано</string>
<string name="hide_expired_entries_title">Приховати застарілі записи</string>
<string name="icon_pack_choose_summary">Набір піктограм у застосунку</string>
<string name="hide_expired_entries_title">Приховувати застарілі записи</string>
<string name="icon_pack_choose_summary">Набір піктограм застосунку</string>
<string name="icon_pack_choose_title">Набір піктограм</string>
<string name="style_choose_summary">Тема застосунку</string>
<string name="style_choose_title">Тема застосунку</string>
@@ -331,7 +330,7 @@
\n
\nСтворюйте групи (~теки) для впорядкування записів у вашій базі даних.</string>
<string name="device_keyboard_setting_title">Налаштування клавіатури пристрою</string>
<string name="education_new_node_title">Додайте елементи до вашої бази даних</string>
<string name="education_new_node_title">Додавайте елементи до вашої бази даних</string>
<string name="education_select_database_title">Відкрийте наявну базу даних</string>
<string name="education_select_database_summary">Відкрийте файл раніше створеної бази даних з файлового менеджера, щоб продовжити користуватися ним.</string>
<string name="education_create_database_summary">Створіть ваш перший файл керування паролями.</string>
@@ -345,10 +344,10 @@
<string name="enable_read_only_summary">Типово відкривати базу даних лише для читання</string>
<string name="enable_read_only_title">Захист від запису</string>
<string name="delete_entered_password_summary">Видаляти пароль, введений після спроби з\'єднання з базою даних</string>
<string name="delete_entered_password_title">Видалити пароль</string>
<string name="delete_entered_password_title">Видаляти пароль</string>
<string name="allow_no_password_summary">Увімкнути кнопку \"Відкрити\", якщо не вибрано головний пароль</string>
<string name="allow_no_password_title">Дозволити без головного ключа</string>
<string name="autofill_auto_search_summary">Автоматично пропонувати результати пошуку з вебдомену або ідентифікатора застосунку</string>
<string name="autofill_auto_search_summary">Автоматично пропонувати результати пошуку з вебдомену або ID застосунку</string>
<string name="autofill_auto_search_title">Автоматичний пошук</string>
<string name="keyboard_key_sound_title">Звук під час натискання</string>
<string name="keyboard_key_vibrate_title">Вібрація під час натискання</string>
@@ -366,13 +365,13 @@
<string name="keyboard_notification_entry_clear_close_title">Очищати під час закриття</string>
<string name="keyboard_notification_entry_summary">Показувати сповіщення, коли запис доступний</string>
<string name="keyboard_notification_entry_title">Інформаційне сповіщення</string>
<string name="keyboard_selection_entry_summary">Показати поля введення в Magikeyboard під час перегляду запису</string>
<string name="keyboard_selection_entry_summary">Показувати поля введення в Magikeyboard під час перегляду запису</string>
<string name="keyboard_selection_entry_title">Вибір запису</string>
<string name="keyboard_entry_category">Запис</string>
<string name="keyboard_setting_label">Параметри Magikeyboard</string>
<string name="keyboard_label">Magikeyboard (KeePassDX)</string>
<string name="keyboard_name">Magikeyboard</string>
<string name="magic_keyboard_explanation_summary">Активувати власну клавіатуру для заповнення ваших паролів та інших полів ідентифікації</string>
<string name="magic_keyboard_explanation_summary">Увімкнути власну клавіатуру для заповнення ваших паролів та інших полів ідентифікації</string>
<string name="magic_keyboard_title">Magikeyboard</string>
<string name="recycle_bin">Кошик</string>
<string name="compression_none">Не стискати</string>
@@ -395,7 +394,7 @@
<string name="recycle_bin_title">Використання кошика</string>
<string name="database_data_compression_summary">Стиснення даних зменшує розмір бази даних.</string>
<string name="database_data_compression_title">Стиснення даних</string>
<string name="full_file_path_enable_summary">Переглянути повний шлях до файлу</string>
<string name="full_file_path_enable_summary">Показувати повний шлях до файлу</string>
<string name="full_file_path_enable_title">Шлях до файлу</string>
<string name="assign_master_key">Призначити головний ключ</string>
<string name="path">Шлях</string>
@@ -476,4 +475,15 @@
<string name="encryption_explanation">Алгоритм шифрування бази даних, застосований для всіх даних.</string>
<string name="keyboard_search_share_summary">Автоматичний пошук загальнодоступної інформації для заповнення клавіатури</string>
<string name="keyboard_search_share_title">Пошук доступної інформації</string>
<string name="autofill_block_restart">Перезапустіть застосунок, який містить форму, для застосування блокування.</string>
<string name="autofill_block">Блокування автозаповнення</string>
<string name="autofill_web_domain_blocklist_summary">Вебдомени для яких вимкнено автозаповнення</string>
<string name="autofill_web_domain_blocklist_title">Перелік блокування вебдоменів</string>
<string name="autofill_application_id_blocklist_summary">Застосунки для яких вимкнено автозаповнення</string>
<string name="autofill_application_id_blocklist_title">Перелік заблокованих застосунків</string>
<string name="subdomain_search_summary">Пошук у вебдоменах обмежений піддоменами</string>
<string name="subdomain_search_title">Пошук у піддоменах</string>
<string name="error_string_type">Текст не відповідає запитуваному елементу.</string>
<string name="filter">Фільтр</string>
<string name="content_description_add_item">Додати елемент</string>
</resources>

View File

@@ -143,7 +143,6 @@
<string name="clipboard_error_title">剪切板错误</string>
<string name="clipboard_error">一些设备不允许程序使用剪切板。</string>
<string name="clipboard_error_clear">无法清空剪切板</string>
<string name="clipboard_swipe_clean">滑动以清空剪切板</string>
<string name="encryption_chacha20">ChaCha20</string>
<string name="kdf_AES">AES</string>
<string name="kdf_Argon2">Argon2</string>
@@ -476,4 +475,15 @@
<string name="error_label_exists">该标签已经存在。</string>
<string name="keyboard_search_share_summary">自动搜索共享信息以填充键盘</string>
<string name="keyboard_search_share_title">搜索分享的信息</string>
<string name="autofill_block_restart">重新启动包含该表单的应用程序以激活拦截。</string>
<string name="autofill_block">阻止自动填充</string>
<string name="autofill_web_domain_blocklist_summary">禁止在下列域名中自动填充凭证</string>
<string name="autofill_web_domain_blocklist_title">Web域名黑名单</string>
<string name="autofill_application_id_blocklist_summary">禁止应用程序自动填充的黑名单</string>
<string name="autofill_application_id_blocklist_title">应用拦截列表</string>
<string name="filter">过滤器</string>
<string name="subdomain_search_summary">搜索带有子域约束的web域</string>
<string name="subdomain_search_title">子域搜索</string>
<string name="error_string_type">文本和请求的条目不匹配.</string>
<string name="content_description_add_item">添加条目</string>
</resources>

View File

@@ -140,7 +140,6 @@
<string name="clipboard_error_title">剪貼簿錯誤</string>
<string name="clipboard_error">部份設備不容許其他程式使用剪貼簿。</string>
<string name="clipboard_error_clear">無法清除剪貼簿</string>
<string name="clipboard_swipe_clean">滑动即可清除剪贴板</string>
<string name="error_autofill_enable_service">無法啟用自動填入服務。</string>
<string name="error_move_folder_in_itself">無法移動一個群組至自己本身。</string>
<string name="invalid_algorithm">無效的演算法。</string>

View File

@@ -132,6 +132,10 @@
<bool name="keyboard_key_vibrate_default" translatable="false">true</bool>
<string name="keyboard_key_sound_key" translatable="false">keyboard_key_sound_key</string>
<bool name="keyboard_key_sound_default" translatable="false">false</bool>
<string name="keyboard_previous_database_credentials_key" translatable="false">keyboard_previous_database_credentials_key</string>
<bool name="keyboard_previous_database_credentials_default" translatable="false">false</bool>
<string name="keyboard_previous_fill_in_key" translatable="false">keyboard_previous_fill_in_key</string>
<bool name="keyboard_previous_fill_in_default" translatable="false">false</bool>
<string name="autofill_auto_search_key" translatable="false">autofill_auto_search_key</string>
<bool name="autofill_auto_search_default" translatable="false">true</bool>
<string name="autofill_application_id_blocklist_key" translatable="false">autofill_application_id_blocklist_key</string>

View File

@@ -44,8 +44,7 @@
<string name="clipboard_error">Some devices won\'t let apps use the clipboard.</string>
<string name="clipboard_error_clear">Could not clear clipboard</string>
<string name="clipboard_timeout">Clipboard timeout</string>
<string name="clipboard_timeout_summary">Duration of storage in the clipboard</string>
<string name="clipboard_swipe_clean">Swipe to clear clipboard now</string>
<string name="clipboard_timeout_summary">Duration of storage in the clipboard (if supported by your device)</string>
<string name="content_description_background">Background</string>
<string name="content_description_open_file">Open file</string>
<string name="content_description_node_children">Node children</string>
@@ -341,7 +340,7 @@
<string name="enable">Enable</string>
<string name="disable">Disable</string>
<string name="clear_clipboard_notification_title">Clear at closing</string>
<string name="clear_clipboard_notification_summary">Lock the database when closing the notification</string>
<string name="clear_clipboard_notification_summary">Lock the database when the clipboard duration expires or the notification is closed after you start using it</string>
<string name="database_name_title">Database name</string>
<string name="database_description_title">Database description</string>
<string name="database_default_username_title">Default username</string>
@@ -382,6 +381,11 @@
<string name="keyboard_auto_go_action_summary">\"Go\" key action after pressing a \"Field\" key</string>
<string name="keyboard_key_vibrate_title">Vibratory keypresses</string>
<string name="keyboard_key_sound_title">Audible keypresses</string>
<string name="keyboard_change">Keyboard change</string>
<string name="keyboard_previous_database_credentials_title">Previous keyboard during database credentials</string>
<string name="keyboard_previous_database_credentials_summary">Automatically back to the previous keyboard if the database credentials screen is shown</string>
<string name="keyboard_previous_fill_in_title">Previous keyboard after form filling</string>
<string name="keyboard_previous_fill_in_summary">Automatically back to the previous keyboard if the form is filling and "Go" key action is auto activated</string>
<string name="autofill_auto_search_title">Auto search</string>
<string name="autofill_auto_search_summary">Automatically suggest search results from the web domain or application ID</string>
<string name="autofill_application_id_blocklist_title">Application blocklist</string>

View File

@@ -308,7 +308,7 @@
<!-- Special Toolbar text titlé -->
<style name="KeepassDXStyle.TextAppearance.Toolbar.Special.Title" parent="KeepassDXStyle.TextAppearance.Small">
<item name="android:textColor">?attr/colorAccent</item>
<item name="android:textColor">?android:attr/textColorHintInverse</item>
</style>
<style name="KeepassDXStyle.TextAppearance.Toolbar.Special.SubTitle" parent="KeepassDXStyle.TextAppearance.Tiny">
<item name="android:textColor">@color/colorTextInverse</item>

View File

@@ -67,4 +67,18 @@
android:defaultValue="@bool/keyboard_key_sound_default"
android:title="@string/keyboard_key_sound_title" />
</PreferenceCategory>
<PreferenceCategory
android:title="@string/keyboard_change">
<SwitchPreference
android:key="@string/keyboard_previous_database_credentials_key"
android:title="@string/keyboard_previous_database_credentials_title"
android:summary="@string/keyboard_previous_database_credentials_summary"
android:defaultValue="@bool/keyboard_previous_database_credentials_default"/>
<SwitchPreference
android:key="@string/keyboard_previous_fill_in_key"
android:title="@string/keyboard_previous_fill_in_title"
android:summary="@string/keyboard_previous_fill_in_summary"
android:defaultValue="@bool/keyboard_previous_fill_in_default"
android:dependency="@string/keyboard_auto_go_action_key"/>
</PreferenceCategory>
</PreferenceScreen>

96
art/ic_back_to.svg Normal file
View File

@@ -0,0 +1,96 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="24"
height="24"
id="svg4830"
version="1.1"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
inkscape:export-filename="/home/joker/Project/Scratcheck/TestExport.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
sodipodi:docname="ic_back_to.svg">
<defs
id="defs4832" />
<sodipodi:namedview
id="base"
pagecolor="#acacac"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="15.999999"
inkscape:cx="0.25001431"
inkscape:cy="2.6167943"
inkscape:current-layer="g4770"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1920"
inkscape:window-height="1016"
inkscape:window-x="1920"
inkscape:window-y="74"
inkscape:window-maximized="1">
<sodipodi:guide
position="0.99999471,22.999999"
orientation="22,0"
id="guide2987"
inkscape:locked="false" />
<sodipodi:guide
position="0.99999471,0.99999888"
orientation="0,22"
id="guide2989"
inkscape:locked="false" />
<sodipodi:guide
position="22.999995,0.99999888"
orientation="-22,0"
id="guide2991"
inkscape:locked="false" />
<sodipodi:guide
position="39,23"
orientation="0,-22"
id="guide2993"
inkscape:locked="false" />
<inkscape:grid
type="xygrid"
id="grid2989" />
</sodipodi:namedview>
<metadata
id="metadata4835">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(0,-8)">
<g
id="g4770"
transform="matrix(1.7777778,0,0,1.7777778,-205.48441,-31.997877)">
<g
id="Layer_1"
transform="matrix(-0.00397893,0,0,0.00397893,125.58386,23.674135)" />
<path
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.78885484;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 9.6582031 2.3417969 C 9.4025809 2.3417969 9.1470385 2.4408503 8.9511719 2.6367188 L 3.2929688 8.2929688 C 2.9012354 8.6847056 2.9012354 9.3152944 3.2929688 9.7070312 L 8.9511719 15.363281 C 9.3429052 15.755018 9.973501 15.755018 10.365234 15.363281 C 10.756968 14.971544 10.756968 14.340956 10.365234 13.949219 L 6.4160156 10 L 16 10 L 16 10.03125 A 4.5000001 4.5000001 0 0 1 20 14.5 A 4.5000001 4.5000001 0 0 1 16 18.966797 L 16 19 L 7 19 C 6.4460006 19 6 19.446001 6 20 C 6 20.553999 6.4460006 21 7 21 L 16 21 C 16.123984 21 16.240233 20.970575 16.349609 20.929688 A 6.5000001 6.5000001 0 0 0 22 14.5 A 6.5000001 6.5000001 0 0 0 16 8.0214844 L 16 8 L 6.4160156 8 L 10.365234 4.0507812 C 10.756968 3.6590444 10.756968 3.0284556 10.365234 2.6367188 C 10.169368 2.4408503 9.9138254 2.3417969 9.6582031 2.3417969 z "
transform="matrix(0.56249999,0,0,0.56249999,115.58498,22.498806)"
id="rect820" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -0,0 +1,7 @@
* Fix TOTP period (> 60s)
* Fix searching in recycle bin
* Settings to back to the previous keyboard during database credentials and after form filling
* Improving action tasks
* Improve recognition to reset app timeout
* Fix minor issues

View File

@@ -0,0 +1,6 @@
* Correction de la période pour le TOTP (> 60s)
* Correction de la recherche dans la corbeille
* Paramètres pour revenir automatiquement au clavier précédent durant l'identification de la base et après le remplissage de formulaire
* Amélioration des tâches d'action
* Amélioration de la reconnaissance pour le temps écoulé
* Correction de problèmes mineurs