Compare commits

...

45 Commits

Author SHA1 Message Date
J-Jamet
f49485e161 Merge branch 'release/2.10.4' 2021-06-15 12:57:28 +02:00
J-Jamet
f3f268742f Hot fix to increase the opening speed of database #1028 2021-06-15 12:52:16 +02:00
J-Jamet
8b867f78fe Merge tag '2.10.3' into develop
2.10.3
2021-06-14 10:14:05 +02:00
J-Jamet
d6a43fd8e5 Merge branch 'release/2.10.3' 2021-06-14 10:13:56 +02:00
J-Jamet
9887b8142d Fix service starting #1025 2021-06-13 17:57:30 +02:00
J-Jamet
4d92d6dc2b Update CHANGELOG 2021-06-13 17:15:14 +02:00
J-Jamet
d8cd84ed9e Remove special chars 2021-06-13 17:09:43 +02:00
J-Jamet
6bc740e881 Merge branch 'djibux-master' into develop 2021-06-13 16:53:46 +02:00
J-Jamet
db348cc368 Merge branch 'translations' into develop 2021-06-13 16:51:56 +02:00
J-Jamet
6ebf59d7ff Merge branch 'develop' of https://hosted.weblate.org/git/keepass-dx/strings into translations 2021-06-13 16:51:21 +02:00
J-Jamet
d35e31d128 Fix biometric prompt #1018 2021-06-12 12:25:04 +02:00
J-Jamet
b9b6d3d2cb Fix database opened without notification (Database is now closed when screen is killed in background #1025) 2021-06-12 11:39:41 +02:00
J-Jamet
728b111ac9 Upgrade to 2.10.3 2021-06-12 10:31:18 +02:00
Reza Almanda
9e5ce589ae Translated using Weblate (Indonesian)
Currently translated at 74.8% (395 of 528 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/id/
2021-06-11 03:36:00 +02:00
djib
f486150a0f Fix a typo 2021-06-09 20:58:08 +02:00
djib
075ee815f0 Improve French translation mostly for Magikeyboard 2021-06-09 20:54:19 +02:00
djib
d321283b13 Improve Magikeyboard options descriptions 2021-06-09 20:42:16 +02:00
solokot
8be382fa7e Translated using Weblate (Russian)
Currently translated at 100.0% (528 of 528 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ru/
2021-06-09 12:33:30 +02:00
VfBFan
13002f96f1 Translated using Weblate (German)
Currently translated at 100.0% (528 of 528 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2021-06-06 17:34:13 +02:00
J-Jamet
008ded4a5c Merge tag '2.10.2' into develop
2.10.2
2021-06-02 10:37:27 +02:00
J-Jamet
d476574d05 Merge branch 'release/2.10.2' 2021-06-02 10:37:21 +02:00
Yudong
371b3813d4 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (528 of 528 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/zh_Hans/
2021-06-02 10:34:27 +02:00
J-Jamet
fe08d034bb Merge branch 'iArchitSharma-patch-1' into develop 2021-05-31 16:16:10 +02:00
J-Jamet
18f4714410 Merge branch 'develop' of https://hosted.weblate.org/git/keepass-dx/strings into translations 2021-05-31 16:14:24 +02:00
J-Jamet
1b6c416893 Fix autotype #997 2021-05-31 16:10:31 +02:00
Archit Sharma
6153a28b4b fixed and added some hindi translation 2021-05-31 20:47:20 +07:00
J-Jamet
9574cf16fb Fix custom fields iteration 2021-05-31 15:32:35 +02:00
J-Jamet
d309a67416 Capture exception when restart service 2021-05-31 14:48:59 +02:00
J-Jamet
fb865af088 Capture placeholder exception 2021-05-31 14:45:19 +02:00
Yudong
c1e7039357 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (528 of 528 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/zh_Hans/
2021-05-29 17:34:07 +02:00
C. Rüdinger
0fd3b37641 Translated using Weblate (German)
Currently translated at 100.0% (528 of 528 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2021-05-28 12:34:14 +02:00
VfBFan
cea91f7b2f Translated using Weblate (German)
Currently translated at 100.0% (528 of 528 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2021-05-26 10:34:21 +02:00
Yngvar Skjaldulfsson
3959896832 Translated using Weblate (Spanish)
Currently translated at 100.0% (528 of 528 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/es/
2021-05-21 15:41:22 +02:00
Joan Jaume Oliver
d55dccdeb1 Translated using Weblate (Spanish)
Currently translated at 100.0% (528 of 528 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/es/
2021-05-21 07:19:58 +02:00
Yngvar Skjaldulfsson
c46c286b51 Translated using Weblate (Spanish)
Currently translated at 100.0% (528 of 528 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/es/
2021-05-21 07:19:57 +02:00
zer0-x
aa15d261f3 Translated using Weblate (Arabic)
Currently translated at 65.3% (345 of 528 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ar/
2021-05-17 12:32:27 +02:00
Paco Chan
00a32463c7 Translated using Weblate (Spanish)
Currently translated at 100.0% (528 of 528 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/es/
2021-05-17 12:32:26 +02:00
Sebastian
dd60ff8b74 Translated using Weblate (Danish)
Currently translated at 100.0% (528 of 528 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/da/
2021-05-17 12:32:26 +02:00
Paco Chan
4588611cbf Translated using Weblate (Catalan)
Currently translated at 47.5% (251 of 528 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ca/
2021-05-17 12:32:25 +02:00
J-Jamet
1460c1364a Fix search fields references #987 2021-05-11 12:05:09 +02:00
J-Jamet
37f38fe988 Fix fields references #987 2021-05-11 11:49:25 +02:00
J-Jamet
cf025b9135 Update version and CHANGELOG 2021-05-11 11:47:20 +02:00
ssantos
283ff7a280 Translated using Weblate (Portuguese)
Currently translated at 85.9% (454 of 528 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pt/
2021-05-11 11:34:49 +02:00
Reza Almanda
e668f016b4 Translated using Weblate (Indonesian)
Currently translated at 72.1% (381 of 528 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/id/
2021-05-11 11:34:49 +02:00
J-Jamet
256c2c955a Merge tag '2.10.1' into develop
2.10.1
2021-05-10 07:24:57 +02:00
41 changed files with 342 additions and 214 deletions

View File

@@ -1,3 +1,15 @@
KeePassDX(2.10.4)
* Hot fix to increase the opening speed of database #1028
KeePassDX(2.10.3)
* Improve Magikeyboard options description #1022 #1023 (Thx @djibux)
* Fix database opened without notification (database is now closed when screen is killed in background #1025)
* Fix biometric prompt #1018
KeePassDX(2.10.2)
* Fix search fields references #987
* Fix Auto-Types with same key #997
KeePassDX(2.10.1)
* Fix parcelable with custom data #986

View File

@@ -11,8 +11,8 @@ android {
applicationId "com.kunzisoft.keepass"
minSdkVersion 15
targetSdkVersion 30
versionCode = 78
versionName = "2.10.1"
versionCode = 82
versionName = "2.10.4"
multiDexEnabled true
testApplicationId = "com.kunzisoft.keepass.tests"

View File

@@ -462,6 +462,11 @@ open class PasswordActivity : SpecialModeActivity(), AdvancedUnlockFragment.Buil
override fun onPause() {
mProgressDatabaseTaskProvider?.unregisterProgressTask()
// To prevent biometric prompt to appearing outside of the app
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
advancedUnlockFragment?.disconnect(hideViews = false, closePrompt = true)
}
// Reinit locking activity UI variable
LockingActivity.LOCKING_ACTIVITY_UI_VISIBLE_DURING_LOCK = null
mAllowAutoOpenBiometricPrompt = true
@@ -708,7 +713,7 @@ open class PasswordActivity : SpecialModeActivity(), AdvancedUnlockFragment.Buil
when (resultCode) {
LockingActivity.RESULT_EXIT_LOCK -> {
clearCredentialsViews()
Database.getInstance().clearAndClose(UriUtil.getBinaryDir(this))
Database.getInstance().clearAndClose(this)
}
Activity.RESULT_CANCELED -> {
clearCredentialsViews()

View File

@@ -22,7 +22,6 @@ package com.kunzisoft.keepass.app
import androidx.multidex.MultiDexApplication
import com.kunzisoft.keepass.activities.stylish.Stylish
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.utils.UriUtil
class App : MultiDexApplication() {
@@ -34,7 +33,7 @@ class App : MultiDexApplication() {
}
override fun onTerminate() {
Database.getInstance().clearAndClose(UriUtil.getBinaryDir(this))
Database.getInstance().clearAndClose(this)
super.onTerminate()
}
}

View File

@@ -26,7 +26,6 @@ import com.kunzisoft.keepass.app.database.FileDatabaseHistoryAction
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.model.MainCredential
import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.utils.UriUtil
class CreateDatabaseRunnable(context: Context,
private val mDatabase: Database,
@@ -44,7 +43,7 @@ class CreateDatabaseRunnable(context: Context,
createData(mDatabaseUri, databaseName, rootName)
}
} catch (e: Exception) {
mDatabase.clearAndClose(UriUtil.getBinaryDir(context))
mDatabase.clearAndClose(context)
setError(e)
}

View File

@@ -25,8 +25,8 @@ import com.kunzisoft.keepass.app.database.CipherDatabaseAction
import com.kunzisoft.keepass.app.database.CipherDatabaseEntity
import com.kunzisoft.keepass.app.database.FileDatabaseHistoryAction
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.database.element.binary.LoadedKey
import com.kunzisoft.keepass.database.element.binary.BinaryData
import com.kunzisoft.keepass.database.element.binary.LoadedKey
import com.kunzisoft.keepass.database.exception.LoadDatabaseException
import com.kunzisoft.keepass.model.MainCredential
import com.kunzisoft.keepass.settings.PreferencesUtil
@@ -47,7 +47,7 @@ class LoadDatabaseRunnable(private val context: Context,
override fun onStartRun() {
// Clear before we load
mDatabase.clearAndClose(UriUtil.getBinaryDir(context))
mDatabase.clearAndClose(context)
}
override fun onActionRun() {
@@ -85,7 +85,7 @@ class LoadDatabaseRunnable(private val context: Context,
// Register the current time to init the lock timer
PreferencesUtil.saveCurrentTime(context)
} else {
mDatabase.clearAndClose(UriUtil.getBinaryDir(context))
mDatabase.clearAndClose(context)
}
}

View File

@@ -23,6 +23,7 @@ import android.content.*
import android.content.Context.BIND_ABOVE_CLIENT
import android.content.Context.BIND_NOT_FOREGROUND
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.IBinder
import android.util.Log
@@ -255,7 +256,6 @@ class ProgressDatabaseTaskProvider(private val activity: FragmentActivity) {
private fun start(bundle: Bundle? = null, actionTask: String) {
try {
activity.stopService(intentDatabaseTask)
if (bundle != null)
intentDatabaseTask.putExtras(bundle)
intentDatabaseTask.action = actionTask
@@ -286,6 +286,11 @@ class ProgressDatabaseTaskProvider(private val activity: FragmentActivity) {
readOnly: Boolean,
cipherEntity: CipherDatabaseEntity?,
fixDuplicateUuid: Boolean) {
try {
activity.stopService(intentDatabaseTask)
} catch (e: Exception) {
Log.e(TAG, "Unable to stop the service", e)
}
start(Bundle().apply {
putParcelable(DatabaseTaskNotificationService.DATABASE_URI_KEY, databaseUri)
putParcelable(DatabaseTaskNotificationService.MAIN_CREDENTIAL_KEY, mainCredential)

View File

@@ -21,8 +21,8 @@ package com.kunzisoft.keepass.database.action
import android.content.Context
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.database.element.binary.LoadedKey
import com.kunzisoft.keepass.database.element.binary.BinaryData
import com.kunzisoft.keepass.database.element.binary.LoadedKey
import com.kunzisoft.keepass.database.exception.LoadDatabaseException
import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.tasks.ActionRunnable
@@ -62,7 +62,7 @@ class ReloadDatabaseRunnable(private val context: Context,
PreferencesUtil.saveCurrentTime(context)
} else {
tempCipherKey = null
mDatabase.clearAndClose(UriUtil.getBinaryDir(context))
mDatabase.clearAndClose(context)
}
}

View File

@@ -45,8 +45,8 @@ class EntryCursorKDBX : EntryCursorUUID<EntryKDBX>() {
entry.expires
))
for (element in entry.customFields.entries) {
extraFieldCursor.addExtraField(entryId, element.key, element.value)
entry.doForEachDecodedCustomField { key, value ->
extraFieldCursor.addExtraField(entryId, key, value)
}
entryId++

View File

@@ -42,7 +42,7 @@ class ExtraFieldCursor : MatrixCursor(arrayOf(
}
fun populateExtraFieldInEntry(pwEntry: EntryKDBX) {
pwEntry.putExtraField(getString(getColumnIndex(COLUMN_LABEL)),
pwEntry.putField(getString(getColumnIndex(COLUMN_LABEL)),
ProtectedString(getInt(getColumnIndex(COLUMN_PROTECTION)) > 0,
getString(getColumnIndex(COLUMN_VALUE))))
}

View File

@@ -20,6 +20,7 @@
package com.kunzisoft.keepass.database.element
import android.content.ContentResolver
import android.content.Context
import android.content.res.Resources
import android.net.Uri
import android.util.Log
@@ -668,8 +669,8 @@ class Database {
}
}
fun clearAndClose(filesDirectory: File? = null) {
clear(filesDirectory)
fun clearAndClose(context: Context? = null) {
clear(context?.let { UriUtil.getBinaryDir(context) })
this.mDatabaseKDB = null
this.mDatabaseKDBX = null
this.fileUri = null

View File

@@ -283,8 +283,8 @@ class Entry : Node, EntryVersionedInterface<Group> {
fun getExtraFields(): List<Field> {
val extraFields = ArrayList<Field>()
entryKDBX?.let {
for (field in it.customFields) {
extraFields.add(Field(field.key, field.value))
it.doForEachDecodedCustomField { key, value ->
extraFields.add(Field(key, value))
}
}
return extraFields
@@ -294,7 +294,7 @@ class Entry : Node, EntryVersionedInterface<Group> {
* Update or add an extra field to the list (standard or custom)
*/
fun putExtraField(field: Field) {
entryKDBX?.putExtraField(field.name, field.protectedValue)
entryKDBX?.putField(field.name, field.protectedValue)
}
private fun addExtraFields(fields: List<Field>) {
@@ -310,7 +310,7 @@ class Entry : Node, EntryVersionedInterface<Group> {
fun getOtpElement(): OtpElement? {
entryKDBX?.let {
return OtpEntryFields.parseFields { key ->
it.customFields[key]?.toString()
it.getField(key)?.toString()
}
}
return null

View File

@@ -332,9 +332,40 @@ class DatabaseKDBX : DatabaseVersioned<UUID, UUID, GroupKDBX, EntryKDBX> {
return this.iconsManager.getIcon(iconUuid)
}
/**
* To perform a search in entry custom data
/*
* Search methods
*/
fun getEntryByTitle(title: String, recursionLevel: Int): EntryKDBX? {
return this.entryIndexes.values.find { entry ->
entry.decodeTitleKey(recursionLevel).equals(title, true)
}
}
fun getEntryByUsername(username: String, recursionLevel: Int): EntryKDBX? {
return this.entryIndexes.values.find { entry ->
entry.decodeUsernameKey(recursionLevel).equals(username, true)
}
}
fun getEntryByURL(url: String, recursionLevel: Int): EntryKDBX? {
return this.entryIndexes.values.find { entry ->
entry.decodeUrlKey(recursionLevel).equals(url, true)
}
}
fun getEntryByPassword(password: String, recursionLevel: Int): EntryKDBX? {
return this.entryIndexes.values.find { entry ->
entry.decodePasswordKey(recursionLevel).equals(password, true)
}
}
fun getEntryByNotes(notes: String, recursionLevel: Int): EntryKDBX? {
return this.entryIndexes.values.find { entry ->
entry.decodeNotesKey(recursionLevel).equals(notes, true)
}
}
fun getEntryByCustomData(customDataValue: String): EntryKDBX? {
return entryIndexes.values.find { entry ->
entry.customData.containsItemWithValue(customDataValue)

View File

@@ -271,26 +271,6 @@ abstract class DatabaseVersioned<
return this.entryIndexes[id]
}
fun getEntryByTitle(title: String): Entry? {
return this.entryIndexes.values.find { entry -> entry.title.equals(title, true) }
}
fun getEntryByUsername(username: String): Entry? {
return this.entryIndexes.values.find { entry -> entry.username.equals(username, true) }
}
fun getEntryByURL(url: String): Entry? {
return this.entryIndexes.values.find { entry -> entry.url.equals(url, true) }
}
fun getEntryByPassword(password: String): Entry? {
return this.entryIndexes.values.find { entry -> entry.password.equals(password, true) }
}
fun getEntryByNotes(notes: String): Entry? {
return this.entryIndexes.values.find { entry -> entry.notes.equals(notes, true) }
}
fun addEntryIndex(entry: Entry) {
val entryId = entry.nodeId
if (entryIndexes.containsKey(entryId)) {

View File

@@ -21,8 +21,6 @@ package com.kunzisoft.keepass.database.element.entry
import android.os.Parcel
import android.os.Parcelable
import com.kunzisoft.keepass.utils.ParcelableUtil
import com.kunzisoft.keepass.utils.UnsignedInt
class AutoType : Parcelable {
@@ -30,7 +28,7 @@ class AutoType : Parcelable {
var enabled = true
var obfuscationOptions = OBF_OPT_NONE
var defaultSequence = ""
private var windowSeqPairs = LinkedHashMap<String, String>()
private var windowSeqPairs = ArrayList<AutoTypeItem>()
constructor()
@@ -38,16 +36,15 @@ class AutoType : Parcelable {
this.enabled = autoType.enabled
this.obfuscationOptions = autoType.obfuscationOptions
this.defaultSequence = autoType.defaultSequence
for ((key, value) in autoType.windowSeqPairs) {
this.windowSeqPairs[key] = value
}
this.windowSeqPairs.clear()
this.windowSeqPairs.addAll(autoType.windowSeqPairs)
}
constructor(parcel: Parcel) {
this.enabled = parcel.readByte().toInt() != 0
this.obfuscationOptions = UnsignedInt(parcel.readInt())
this.defaultSequence = parcel.readString() ?: defaultSequence
this.windowSeqPairs = ParcelableUtil.readStringParcelableMap(parcel)
parcel.readTypedList(this.windowSeqPairs, AutoTypeItem.CREATOR)
}
override fun describeContents(): Int {
@@ -58,15 +55,43 @@ class AutoType : Parcelable {
dest.writeByte((if (enabled) 1 else 0).toByte())
dest.writeInt(obfuscationOptions.toKotlinInt())
dest.writeString(defaultSequence)
ParcelableUtil.writeStringParcelableMap(dest, windowSeqPairs)
dest.writeTypedList(windowSeqPairs)
}
fun put(key: String, value: String) {
windowSeqPairs[key] = value
fun add(key: String, value: String) {
windowSeqPairs.add(AutoTypeItem(key, value))
}
fun entrySet(): Set<MutableMap.MutableEntry<String, String>> {
return windowSeqPairs.entries
fun doForEachAutoTypeItem(action: (key: String, value: String) -> Unit) {
windowSeqPairs.forEach {
action.invoke(it.key, it.value)
}
}
private data class AutoTypeItem(var key: String, var value: String): Parcelable {
constructor(parcel: Parcel) : this(
parcel.readString() ?: "",
parcel.readString() ?: "") {
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(key)
parcel.writeString(value)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<AutoTypeItem> {
override fun createFromParcel(parcel: Parcel): AutoTypeItem {
return AutoTypeItem(parcel)
}
override fun newArray(size: Int): Array<AutoTypeItem?> {
return arrayOfNulls(size)
}
}
}
companion object {

View File

@@ -238,7 +238,7 @@ class EntryKDBX : EntryVersioned<UUID, UUID, GroupKDBX, EntryKDBX>, NodeKDBXInte
size += getAttachmentsSize(attachmentPool)
size += autoType.defaultSequence.length.toLong()
for ((key, value) in autoType.entrySet()) {
autoType.doForEachAutoTypeItem { key, value ->
size += key.length.toLong()
size += value.length.toLong()
}
@@ -265,25 +265,32 @@ class EntryKDBX : EntryVersioned<UUID, UUID, GroupKDBX, EntryKDBX>, NodeKDBXInte
|| key == STR_NOTES)
}
var customFields = LinkedHashMap<String, ProtectedString>()
get() {
field.clear()
for ((key, value) in fields) {
if (!isStandardField(key)) {
field[key] = ProtectedString(value.isProtected, decodeRefKey(mDecodeRef, key, 0))
}
fun doForEachDecodedCustomField(action: (key: String, value: ProtectedString) -> Unit) {
val iterator = fields.entries.iterator()
while (iterator.hasNext()) {
val mapEntry = iterator.next()
if (!isStandardField(mapEntry.key)) {
action.invoke(mapEntry.key,
ProtectedString(mapEntry.value.isProtected,
decodeRefKey(mDecodeRef, mapEntry.key, 0)
)
)
}
return field
}
}
fun getField(key: String): ProtectedString? {
return fields[key]
}
fun putField(label: String, value: ProtectedString) {
fields[label] = value
}
fun removeAllFields() {
fields.clear()
}
fun putExtraField(label: String, value: ProtectedString) {
fields[label] = value
}
/**
* It's a list because history labels can be defined multiple times
*/

View File

@@ -19,16 +19,17 @@
*/
package com.kunzisoft.keepass.database.element.entry
import android.util.Log
import com.kunzisoft.keepass.database.element.database.DatabaseKDBX
import com.kunzisoft.keepass.database.element.node.NodeIdUUID
import com.kunzisoft.keepass.utils.UuidUtil
import java.util.*
import java.util.concurrent.ConcurrentHashMap
class FieldReferencesEngine(private val mDatabase: DatabaseKDBX) {
// Key : <WantedField>@<SearchIn>:<Text>
// Value : content
private var refsCache: MutableMap<String, String?> = HashMap()
private var refsCache = ConcurrentHashMap<String, String?>()
fun clear() {
refsCache.clear()
@@ -53,52 +54,56 @@ class FieldReferencesEngine(private val mDatabase: DatabaseKDBX) {
&& numberInlineRef <= MAX_INLINE_REF) {
numberInlineRef++
textValue = fillReferencesUsingCache(textValue)
val start = textValue.indexOf(STR_REF_START, offset, true)
if (start < 0) {
break
}
val end = textValue.indexOf(STR_REF_END, offset, true)
if (end <= start) {
break
}
val reference = textValue.substring(start + STR_REF_START.length, end)
val fullReference = "$STR_REF_START$reference$STR_REF_END"
if (!refsCache.containsKey(fullReference)) {
val result = findReferenceTarget(reference)
val entryFound = result.entry
val newRecursionLevel = recursionLevel + 1
val data: String? = when (result.wanted) {
'T' -> entryFound?.decodeTitleKey(newRecursionLevel)
'U' -> entryFound?.decodeUsernameKey(newRecursionLevel)
'A' -> entryFound?.decodeUrlKey(newRecursionLevel)
'P' -> entryFound?.decodePasswordKey(newRecursionLevel)
'N' -> entryFound?.decodeNotesKey(newRecursionLevel)
'I' -> UuidUtil.toHexString(entryFound?.nodeId?.id)
else -> null
}
refsCache[fullReference] = data
try {
textValue = fillReferencesUsingCache(textValue)
}
offset = end
val start = textValue.indexOf(STR_REF_START, offset, true)
if (start < 0) {
break
}
val end = textValue.indexOf(STR_REF_END, offset, true)
if (end <= start) {
break
}
val reference = textValue.substring(start + STR_REF_START.length, end)
val fullReference = "$STR_REF_START$reference$STR_REF_END"
if (!refsCache.containsKey(fullReference)) {
val newRecursionLevel = recursionLevel + 1
val result = findReferenceTarget(reference, newRecursionLevel)
val entryFound = result.entry
val data: String? = when (result.wanted) {
'T' -> entryFound?.decodeTitleKey(newRecursionLevel)
'U' -> entryFound?.decodeUsernameKey(newRecursionLevel)
'A' -> entryFound?.decodeUrlKey(newRecursionLevel)
'P' -> entryFound?.decodePasswordKey(newRecursionLevel)
'N' -> entryFound?.decodeNotesKey(newRecursionLevel)
'I' -> UuidUtil.toHexString(entryFound?.nodeId?.id)
else -> null
}
refsCache[fullReference] = data
textValue = fillReferencesUsingCache(textValue)
}
offset = end
} catch (e: Exception) {
Log.e(TAG, "Error when fill placeholders by reference", e)
}
}
return textValue
}
private fun fillReferencesUsingCache(text: String): String {
var newText = text
for ((key, value) in refsCache) {
refsCache.keys.forEach { key ->
// Replace by key if value not found
newText = newText.replace(key, value ?: key, true)
newText = newText.replace(key, refsCache[key] ?: key, true)
}
return newText
}
private fun findReferenceTarget(reference: String): TargetResult {
private fun findReferenceTarget(reference: String, recursionLevel: Int): TargetResult {
val targetResult = TargetResult(null, 'J')
@@ -116,11 +121,11 @@ class FieldReferencesEngine(private val mDatabase: DatabaseKDBX) {
val searchIn = Character.toUpperCase(reference[2])
val searchQuery = reference.substring(4)
targetResult.entry = when (searchIn) {
'T' -> mDatabase.getEntryByTitle(searchQuery)
'U' -> mDatabase.getEntryByUsername(searchQuery)
'A' -> mDatabase.getEntryByURL(searchQuery)
'P' -> mDatabase.getEntryByPassword(searchQuery)
'N' -> mDatabase.getEntryByNotes(searchQuery)
'T' -> mDatabase.getEntryByTitle(searchQuery, recursionLevel)
'U' -> mDatabase.getEntryByUsername(searchQuery, recursionLevel)
'A' -> mDatabase.getEntryByURL(searchQuery, recursionLevel)
'P' -> mDatabase.getEntryByPassword(searchQuery, recursionLevel)
'N' -> mDatabase.getEntryByNotes(searchQuery, recursionLevel)
'I' -> {
UuidUtil.fromHexString(searchQuery)?.let { uuid ->
mDatabase.getEntryById(NodeIdUUID(uuid))
@@ -139,5 +144,7 @@ class FieldReferencesEngine(private val mDatabase: DatabaseKDBX) {
private const val MAX_INLINE_REF = 10
private const val STR_REF_START = "{REF:"
private const val STR_REF_END = "}"
private val TAG = FieldReferencesEngine::class.java.name
}
}

View File

@@ -807,7 +807,7 @@ class DatabaseInputKDBX(cacheDirectory: File,
return KdbContext.Entry
} else if (ctx == KdbContext.EntryString && name.equals(DatabaseKDBXXML.ElemString, ignoreCase = true)) {
if (ctxStringName != null && ctxStringValue != null)
ctxEntry?.putExtraField(ctxStringName!!, ctxStringValue!!)
ctxEntry?.putField(ctxStringName!!, ctxStringValue!!)
ctxStringName = null
ctxStringValue = null
@@ -824,7 +824,7 @@ class DatabaseInputKDBX(cacheDirectory: File,
return KdbContext.Entry
} else if (ctx == KdbContext.EntryAutoTypeItem && name.equals(DatabaseKDBXXML.ElemAutoTypeItem, ignoreCase = true)) {
if (ctxATName != null && ctxATSeq != null)
ctxEntry?.autoType?.put(ctxATName!!, ctxATSeq!!)
ctxEntry?.autoType?.add(ctxATName!!, ctxATSeq!!)
ctxATName = null
ctxATSeq = null

View File

@@ -530,7 +530,7 @@ class DatabaseOutputKDBX(private val mDatabaseKDBX: DatabaseKDBX,
writeString(DatabaseKDBXXML.ElemAutoTypeDefaultSeq, autoType.defaultSequence, true)
}
for ((key, value) in autoType.entrySet()) {
autoType.doForEachAutoTypeItem { key, value ->
xml.startTag(null, DatabaseKDBXXML.ElemAutoTypeItem)
xml.startTag(null, DatabaseKDBXXML.ElemWindow)

View File

@@ -19,7 +19,9 @@
*/
package com.kunzisoft.keepass.services
import android.app.ActivityManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.*
@@ -44,10 +46,7 @@ import com.kunzisoft.keepass.model.SnapFileDatabaseInfo
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 com.kunzisoft.keepass.utils.LOCK_ACTION
import com.kunzisoft.keepass.utils.closeDatabase
import com.kunzisoft.keepass.utils.*
import com.kunzisoft.keepass.viewmodels.FileDatabaseInfo
import kotlinx.coroutines.*
import java.util.*
@@ -280,8 +279,10 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
stopSelf()
} else {
// Restart the service to open lock notification
startService(Intent(applicationContext,
DatabaseTaskNotificationService::class.java))
try {
startService(Intent(applicationContext,
DatabaseTaskNotificationService::class.java))
} catch (e: IllegalStateException) {}
}
}
}
@@ -838,6 +839,12 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
}
}
override fun onDestroy() {
super.onDestroy()
if (mDatabase.loaded)
actionOnLock()
}
companion object {
private val TAG = DatabaseTaskNotificationService::class.java.name

View File

@@ -138,5 +138,5 @@ fun Context.closeDatabase() {
cancelAll()
}
// Clear data
Database.getInstance().clearAndClose(UriUtil.getBinaryDir(this))
Database.getInstance().clearAndClose(this)
}

View File

@@ -17,7 +17,7 @@
You should have received a copy of the GNU General Public License
along with KeePassDX. If not, see <http://www.gnu.org/licenses/>.
--><resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<string name="homepage">الصفحة الرئيسية</string>
<string name="homepage">الصفحة الرئيسة</string>
<string name="accept">قبول</string>
<string name="add_group">إضافة مجموعة</string>
<string name="encryption">التعمية</string>
@@ -106,8 +106,8 @@
<string name="education_entry_new_field_title">إضافة حقول مخصصة</string>
<string name="education_field_copy_title">نسخ حقل</string>
<string name="education_lock_title">تأمين قاعدة البيانات</string>
<string name="feedback">الأصداء</string>
<string name="about_description">تنفيذ أندرويد لمدير كلمات السر «كي‌باس»</string>
<string name="feedback">التغذية الراجعة</string>
<string name="about_description">التنفيذ لمُدير كلمات المرور «كي‌ باس» على نظام أندرويد</string>
<string name="add_entry">إضافة مدخلة</string>
<string name="edit_entry">تحرير مدخلة</string>
<string name="key_derivation_function">وظيفة اشتقاق المفتاح</string>

View File

@@ -25,7 +25,7 @@
<string name="add_entry">Afegeix entrada</string>
<string name="add_group">Afegeix grup</string>
<string name="encryption_algorithm">Algoritme de xifrat</string>
<string name="app_timeout">Temps d\'espera de l\'aplicació</string>
<string name="app_timeout">Temps d\'espera esgotat</string>
<string name="app_timeout_summary">Temps d\'inactivitat abans de blocar la base de dades</string>
<string name="application">Aplicació</string>
<string name="menu_app_settings">Configuració de l\'aplicació</string>
@@ -289,4 +289,6 @@
<string name="error_otp_type">L\'OTP existent no està reconegut per aquest formulari, la seva validació ja no pot generar correctament el token.</string>
<string name="error_create_database_file">No s\'ha pogut crear una base de dades amb aquesta contrasenya i arxiu de clau.</string>
<string name="error_autofill_enable_service">No s\'ha pogut habilitar el servei d\'autocompletat.</string>
<string name="content_description_node_children">Nodes fill</string>
<string name="key_derivation_function">Funció de derivació de clau</string>
</resources>

View File

@@ -223,7 +223,7 @@
<string name="application_appearance">Brugerflade</string>
<string name="other">Øvrige</string>
<string name="keyboard">Tastatur</string>
<string name="magic_keyboard_title">Magikeyboard</string>
<string name="magic_keyboard_title">Magi keyboard</string>
<string name="magic_keyboard_explanation_summary">Aktiver et brugerdefineret tastatur, der udfylder adgangskoder og alle identitetsfelter</string>
<string name="allow_no_password_title">Tillad ingen hovednøgle</string>
<string name="allow_no_password_summary">Tillader at trykke på knappen \"Åbn\", hvis der ikke er valgt nogen legitimationsoplysninger</string>
@@ -283,8 +283,8 @@
<string name="style_choose_summary">Tema, der bruges i programmet</string>
<string name="icon_pack_choose_title">Ikonpakke</string>
<string name="icon_pack_choose_summary">Ikonpakke, der anvendes</string>
<string name="keyboard_name">Magikeyboard</string>
<string name="keyboard_label">Magikeyboard (KeePassDX)</string>
<string name="keyboard_name">Magi keyboard</string>
<string name="keyboard_label">Magi keyboard (KeePassDX)</string>
<string name="keyboard_setting_label">Magikeyboard indstillinger</string>
<string name="keyboard_entry_category">Post</string>
<string name="keyboard_entry_timeout_title">Udløbstid</string>
@@ -300,7 +300,7 @@
<string name="keyboard_keys_category">Taster</string>
<string name="keyboard_key_vibrate_title">Vibrerende tastetryk</string>
<string name="keyboard_key_sound_title">Hørbare tastetryk</string>
<string name="build_label">Build %1$s</string>
<string name="build_label">Byg %1$s</string>
<string name="keyboard_entry_timeout_summary">Tidsudløb for at rydde indtastning</string>
<string name="entry_notes">Noter</string>
<string name="selection_mode">Valgstilstand</string>
@@ -426,7 +426,7 @@
<string name="hide_broken_locations_title">Skjule brudte databaselinks</string>
<string name="hide_broken_locations_summary">Skjul brudte links på listen over seneste databaser</string>
<string name="warning_database_read_only">Giv fil skriveadgang for at gemme databasændringer</string>
<string name="education_setup_OTP_summary">Opsætning af engangs-adgangskode-styring (HOTP / TOTP) for at generere et token anmodet af tofaktor-autentisering (2FA).</string>
<string name="education_setup_OTP_summary">Sæt op engangs-adgangskode-styring (HOTP / TOTP) for at generere et token anmodet af tofaktor-autentisering (2FA).</string>
<string name="education_setup_OTP_title">Opsætning af OTP</string>
<string name="error_create_database">Databasefilen kunne ikke oprettes.</string>
<string name="entry_add_attachment">Tilføj vedhæng</string>
@@ -537,7 +537,7 @@
<string name="error_start_database_action">Der opstod en fejl under udførelsen af en handling på databasen.</string>
<string name="error_remove_file">Der opstod en fejl med at fjerne fildata.</string>
<string name="error_otp_type">Den existerende OTP type kunne ikke genkendes, den kan være tiden er udløbet for at lave dette token.</string>
<string name="education_advanced_unlock_summary">Sammenkæd din adgangskode, med din scannede biometriske oplysninger eller enheds legitimationsoplysninger for, hurtigt at låse din database op.</string>
<string name="education_advanced_unlock_summary">Sammenkæd din adgangskode, med din scannede biometriske oplysninger eller enheds legitimationsoplysninger for hurtigt oplåsning af din database.</string>
<string name="enter">Enter</string>
<string name="temp_advanced_unlock_timeout_summary">Varigheden af avanceret oplåsning, før indholdet slettes</string>
<string name="device_credential_unlock_enable_summary">Giver dig mulighed for at bruge dine enhedsoplysninger for at åbne databasen</string>
@@ -561,4 +561,6 @@
<string name="export_app_properties_title">Eksporter app-egenskaber</string>
<string name="import_app_properties_summary">Vælg en fil for at importere app-egenskaber</string>
<string name="import_app_properties_title">Importer appegenskaber</string>
<string name="error_move_group_here">Du kan flytte en gruppe her.</string>
<string name="error_word_reserved">Dette ord er reseveret og kan ikke bruges.</string>
</resources>

View File

@@ -71,7 +71,7 @@
<string name="error_invalid_db">Datenbank nicht lesbar.</string>
<string name="error_invalid_path">Sicherstellen, dass der Pfad korrekt ist.</string>
<string name="error_no_name">Namen eingeben.</string>
<string name="error_nokeyfile">Schlüsseldatei wählen.</string>
<string name="error_nokeyfile">Schlüsseldatei auswählen.</string>
<string name="error_out_of_memory">Zu wenig Speicherplatz, um die ganze Datenbank zu laden.</string>
<string name="error_pass_gen_type">Mindestens eine Art der Passwortgenerierung muss ausgewählt sein.</string>
<string name="error_pass_match">Die Passwörter stimmen nicht überein.</string>
@@ -283,7 +283,7 @@
<string name="enable_read_only_title">Schreibgeschützt</string>
<string name="education_read_only_title">Schreibschutz der Datenbank aktivieren</string>
<string name="enable_read_only_summary">Datenbank standardmäßig schreibgeschützt öffnen</string>
<string name="education_read_only_summary">Den Öffnungsmodus für die Sitzung ändern.
<string name="education_read_only_summary">Den Modus bei Eröffnung der Sitzung ändern.
\n
\n„Schreibgeschützt“ verhindert unbeabsichtigte Änderungen an der Datenbank.
\nMit „Änderbar“ können Sie alle Elemente nach Belieben hinzufügen, löschen oder ändern.</string>
@@ -454,7 +454,7 @@
<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 Ausfüllen sperren</string>
<string name="autofill_web_domain_blocklist_summary">Liste der Domains, auf denen ein automatisches Ausfüllen unterlassen wird</string>
<string name="autofill_web_domain_blocklist_summary">Liste der Domains, auf denen ein automatisches Ausfüllen verhindert wird</string>
<string name="autofill_web_domain_blocklist_title">Liste gesperrter Web-Domains</string>
<string name="autofill_application_id_blocklist_summary">Liste der Apps, in denen ein automatisches Ausfüllen verhindert wird</string>
<string name="autofill_application_id_blocklist_title">Liste gesperrter Anwendungen</string>

View File

@@ -26,7 +26,7 @@
<string name="add_entry">Añadir entrada</string>
<string name="add_group">Añadir grupo</string>
<string name="encryption_algorithm">Algoritmo de cifrado</string>
<string name="app_timeout">Tiempo de espera de la aplicación excedido</string>
<string name="app_timeout">Tiempo de espera excedido</string>
<string name="app_timeout_summary">Inactividad antes del bloqueo de aplicación</string>
<string name="application">Aplicación</string>
<string name="menu_app_settings">Configuración de la aplicación</string>
@@ -436,7 +436,7 @@
<string name="database_opened">Base de datos abierta</string>
<string name="education_add_attachment_title">Adjuntar</string>
<string name="education_add_attachment_summary">Cargue un archivo adjunto a la entrada para guardar datos externos importantes.</string>
<string name="hide_expired_entries_summary">Las entradas caducadas no se muestran</string>
<string name="hide_expired_entries_summary">Las entradas caducadas no se están mostrando</string>
<string name="warning_remove_unlinked_attachment">La eliminación de datos no vinculados puede disminuir el tamaño de su base de datos, pero también puede eliminar los datos usados por los complementos de KeePass.</string>
<string name="warning_file_too_big">Se supone que una base de datos KeePass contiene solo pequeños archivos de utilidad (como archivos de clave PGP).
\n
@@ -492,7 +492,7 @@
<string name="hide_expired_entries_title">Ocultar las entradas expiradas</string>
<string name="keyboard_search_share_title">Buscar información compartida</string>
<string name="upload_attachment">Subir %1$s</string>
<string name="education_setup_OTP_summary">Configurar la gestión de contraseñas de una sola vez (HOTP / TOTP) para generar un token solicitado para la autenticación de dos factores (2FA).</string>
<string name="education_setup_OTP_summary">Configurar la gestión de contraseñas de un solo uso (HOTP / TOTP) para generar un token solicitado para la autenticación de dos factores (2FA).</string>
<string name="education_setup_OTP_title">Establecer la contaseña de un solo uso</string>
<string name="education_advanced_unlock_summary">Vincule su contraseña con su credencial biométrica o del dispositivo escaneada para desbloquear rápidamente su base de datos.</string>
<string name="education_advanced_unlock_title">Desbloqueo avanzado de la base de datos</string>
@@ -542,6 +542,26 @@
<string name="menu_reload_database">Recargar la base de datos</string>
<string name="error_otp_type">El tipo de OTP existente no es reconocido por este formulario, su validación ya no puede generar correctamente el token.</string>
<string name="download_canceled">¡Cancelado!</string>
<string name="error_duplicate_file">Los datos de archivo ya existen.</string>
<string name="error_upload_file">Ha habido un error al subir el archivo de datos.</string>
<string name="error_duplicate_file">Los datos del archivo ya existen.</string>
<string name="error_upload_file">Error al subir datos del archivo.</string>
<string name="description_app_properties">Propiedades de KeePassDX para gestionar la configuración de la aplicación</string>
<string name="content_description_otp_information">Información de contraseña de un solo uso</string>
<string name="icon_section_custom">Personalizado</string>
<string name="icon_section_standard">Estándar</string>
<string name="style_brightness_summary">Seleccionar temas oscuros o claros</string>
<string name="style_brightness_title">Brillo del tema</string>
<string name="properties">Propiedades</string>
<string name="error_import_app_properties">Error al importar las propiedades de la aplicación</string>
<string name="error_export_app_properties">Error al exportar las propiedades de la aplicación</string>
<string name="success_export_app_properties">Propiedades de la aplicación exportadas</string>
<string name="success_import_app_properties">Propiedades de la aplicación importadas</string>
<string name="export_app_properties_summary">Cree un archivo para exportar las propiedades de la aplicación</string>
<string name="export_app_properties_title">Exportar propiedades de la aplicación</string>
<string name="import_app_properties_summary">Seleccione un archivo para importar las propiedades de la aplicación</string>
<string name="import_app_properties_title">Importar propiedades de la aplicación</string>
<string name="error_start_database_action">Ocurrió un error al realizar una acción en la base de datos.</string>
<string name="error_remove_file">Ocurrió un error al eliminar los datos del archivo.</string>
<string name="error_file_to_big">El archivo que está tratando de cargar es demasiado grande.</string>
<string name="error_move_group_here">No puede mover un grupo aquí.</string>
<string name="error_word_reserved">Esta palabra está reservada y no se puede usar.</string>
</resources>

View File

@@ -73,9 +73,9 @@
<string name="error_out_of_memory">Mémoire insuffisante pour charger lintégralité de votre base de données.</string>
<string name="error_pass_gen_type">Au moins un type de génération de mots de passe doit être sélectionné.</string>
<string name="error_pass_match">Les mots de passe ne correspondent pas.</string>
<string name="error_rounds_too_large">« Tours de transformation » trop grand. Définition à 2147483648.</string>
<string name="error_rounds_too_large">\"Tours de transformation\" trop grand. Définition à 2147483648.</string>
<string name="error_string_key">Chaque chaîne doit avoir un nom de champ.</string>
<string name="error_wrong_length">Veuillez saisir un entier positif dans le champ « Longueur ».</string>
<string name="error_wrong_length">Veuillez saisir un entier positif dans le champ \"Longueur\".</string>
<string name="error_autofill_enable_service">Impossible dactiver le service de remplissage automatique.</string>
<string name="field_name">Nom du champ</string>
<string name="field_value">Valeur du champ</string>
@@ -120,7 +120,7 @@
<string name="no_url_handler">Installer un navigateur Web pour ouvrir cette URL.</string>
<string name="select_database_file">Ouvrir une base de données existante</string>
<string name="omit_backup_search_title">Ne pas rechercher dans les entrées sauvegardées</string>
<string name="omit_backup_search_summary">Omet les groupes « Sauvegarde » et « Corbeille » des résultats de recherche</string>
<string name="omit_backup_search_summary">Omet les groupes \"Sauvegarde\" et \"Corbeille\" des résultats de recherche</string>
<string name="progress_create">Création dune nouvelle base de données…</string>
<string name="progress_title">Traitement en cours…</string>
<string name="protection">Protection</string>
@@ -157,8 +157,8 @@
<string name="uppercase">Majuscules</string>
<string name="warning">Alerte</string>
<string name="warning_password_encoding">Éviter les caractères en dehors du format de codage de caractères du fichier de base de données (les caractères non reconnus sont convertis en une même lettre).</string>
<string name="warning_empty_password">Continuer sans protection de déverrouillage par mot de passe\?</string>
<string name="warning_no_encryption_key">Continuer sans clé de chiffrement\?</string>
<string name="warning_empty_password">Continuer sans protection de déverrouillage par mot de passe \?</string>
<string name="warning_no_encryption_key">Continuer sans clé de chiffrement \?</string>
<string name="version_label">Version %1$s</string>
<string name="configure_biometric">Aucune information didentification biométrique ou de périphérique nest enregistrée.</string>
<string name="encrypted_value_stored">Mot de passe chiffré stocké</string>
@@ -195,7 +195,7 @@
<string name="assign_master_key">Affecter une clé principale</string>
<string name="create_keepass_file">Créer une nouvelle base de données</string>
<string name="recycle_bin_title">Utilisation de la corbeille</string>
<string name="recycle_bin_summary">Déplace les groupes et les entrées dans le groupe « Corbeille » avant leur suppression</string>
<string name="recycle_bin_summary">Déplace les groupes et les entrées dans le groupe \"Corbeille\" avant leur suppression</string>
<string name="monospace_font_fields_enable_title">Fonte de caractères des champs</string>
<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>
@@ -280,7 +280,7 @@
<string name="menu_paste">Coller</string>
<string name="menu_cancel">Annuler</string>
<string name="allow_no_password_title">Autoriser labsence de clé principale</string>
<string name="allow_no_password_summary">Autorise lappui du bouton « Ouvrir » si aucun identifiant nest sélectionné</string>
<string name="allow_no_password_summary">Autorise lappui du bouton \"Ouvrir\" si aucun identifiant nest sélectionné</string>
<string name="menu_file_selection_read_only">Protéger en écriture</string>
<string name="menu_open_file_read_and_write">Modifiable</string>
<string name="enable_read_only_title">Protégé en écriture</string>
@@ -288,8 +288,8 @@
<string name="education_read_only_title">Protégez en écriture votre base de données</string>
<string name="education_read_only_summary">Changez le mode douverture pour la session.
\n
\n« Protégé en écriture » empêche les modifications involontaires de la base de données.
\n« Modifiable » vous permet dajouter, de supprimer ou de modifier tous les éléments comme vous le souhaitez.</string>
\n\"Protégé en écriture\" empêche les modifications involontaires de la base de données.
\n\"Modifiable\" vous permet dajouter, de supprimer ou de modifier tous les éléments comme vous le souhaitez.</string>
<string name="edit_entry">Modifier lentrée</string>
<string name="error_load_database">Impossible de charger votre base de données.</string>
<string name="error_load_database_KDF_memory">Impossible de charger la clé. Veuillez essayer de diminuer lutilisation mémoire de la fonction de dérivation de clé.</string>
@@ -301,7 +301,7 @@
<string name="keyboard_setting_label">Paramètres Magiclavier</string>
<string name="keyboard_entry_category">Entrée</string>
<string name="keyboard_entry_timeout_title">Délai dexpiration</string>
<string name="keyboard_entry_timeout_summary">Délai dexpiration pour effacer lentrée au clavier</string>
<string name="keyboard_entry_timeout_summary">Délai dexpiration pour effacer lentrée disponible dans le clavier</string>
<string name="keyboard_notification_entry_title">Informations de notification</string>
<string name="keyboard_notification_entry_summary">Affiche une notification lorsquune entrée est disponible</string>
<string name="keyboard_notification_entry_content_title_text">Entrée</string>
@@ -312,22 +312,22 @@
<string name="keyboard_appearance_category">Apparence</string>
<string name="keyboard_theme_title">Thème du clavier</string>
<string name="keyboard_keys_category">Touches</string>
<string name="keyboard_key_vibrate_title">Touches vibrantes</string>
<string name="keyboard_key_sound_title">Appui clavier audible</string>
<string name="keyboard_key_vibrate_title">Vibration des touches</string>
<string name="keyboard_key_sound_title">Son de pression des touches</string>
<string name="keyboard_change">Changement de clavier</string>
<string name="keyboard_previous_database_credentials_title">Écran des identifications de la base de données</string>
<string name="keyboard_previous_database_credentials_summary">Revenir automatiquement au clavier précédent sur lécran des identifications de la base de données</string>
<string name="keyboard_previous_database_credentials_title">Écran d\'authentification de la base de données</string>
<string name="keyboard_previous_database_credentials_summary">Revenir automatiquement au clavier précédent sur lécran d\'authentification de la base de données</string>
<string name="keyboard_previous_fill_in_title">Action de touche automatique</string>
<string name="keyboard_previous_fill_in_summary">Revenir automatiquement au clavier précédent après avoir exécuté « Action de touche automatique »</string>
<string name="keyboard_previous_fill_in_summary">Revenir automatiquement au clavier précédent après avoir exécuté \"Action de touche automatique\"</string>
<string name="selection_mode">Mode sélection</string>
<string name="do_not_kill_app">Veuillez ne pas tuer lapplication…</string>
<string name="lock_database_back_root_title">Appuyer sur « Retour » pour verrouiller</string>
<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 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="keyboard_selection_entry_summary">Lors de la sélection d\'une entrée dans KeePassDX, rendre cette entrée disponible dans le Magiclavier</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 à une base de données</string>
<string name="content_description_open_file">Ouvrir le fichier</string>
@@ -382,7 +382,7 @@
<string name="menu_security_settings">Paramètres de sécurité</string>
<string name="menu_master_key_settings">Paramètres de la clé maîtresse</string>
<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="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">Copier les champs dune entrée à laide du presse-papier de votre appareil</string>
<string name="advanced_unlock_explanation_summary">Utiliser le déverrouillage avancé pour ouvrir plus facilement une base de données</string>
@@ -408,21 +408,21 @@
<string name="menu_save_database">Enregistrer la base de données</string>
<string name="menu_empty_recycle_bin">Vider la corbeille</string>
<string name="command_execution">Exécution de la commande…</string>
<string name="warning_permanently_delete_nodes">Supprimer définitivement les nœuds sélectionnés\?</string>
<string name="warning_permanently_delete_nodes">Supprimer définitivement les nœuds sélectionnés \?</string>
<string name="keystore_not_accessible">Le magasin de clés nest pas correctement initialisé.</string>
<string name="recycle_bin_group_title">Groupe de la corbeille</string>
<string name="enable_auto_save_database_title">Enregistrement automatique de la base de données</string>
<string name="enable_auto_save_database_summary">Enregistre la base de données après chaque action importante (en mode « Modifiable »)</string>
<string name="enable_auto_save_database_summary">Enregistre la base de données après chaque action importante (en mode \"Modifiable\")</string>
<string name="entry_attachments">Attachements</string>
<string name="menu_restore_entry_history">Restaurer lhistorique</string>
<string name="menu_delete_entry_history">Effacer lhistorique</string>
<string name="keyboard_auto_go_action_title">Action de touche automatique</string>
<string name="keyboard_auto_go_action_summary">Action de la touche « Go » après avoir appuyé sur une touche « Champ »</string>
<string name="keyboard_auto_go_action_summary">Effectuer l\'action de la touche \"Go\" automatiquement après avoir appuyé sur une touche \"Champ\" du clavier</string>
<string name="download_attachment">Téléchargement %1$s</string>
<string name="download_initialization">Initialisation…</string>
<string name="download_progression">En cours : %1$d%%</string>
<string name="download_finalization">Finalisation…</string>
<string name="download_complete">Terminé!</string>
<string name="download_complete">Terminé !</string>
<string name="hide_expired_entries_title">Masquer les entrées expirées</string>
<string name="hide_expired_entries_summary">Les entrées expirées ne sont pas affichées</string>
<string name="contact">Contact</string>
@@ -444,7 +444,7 @@
<string name="error_create_database">Impossible de créer le fichier de base de données.</string>
<string name="entry_add_attachment">Ajouter une pièce jointe</string>
<string name="discard">Abandonner</string>
<string name="discard_changes">Abandonner les modifications\?</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 lidentifiant de lapplication</string>
<string name="autofill_auto_search_title">Recherche automatique</string>
@@ -459,7 +459,7 @@
<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 dapplication</string>
<string name="keyboard_search_share_summary">Recherche automatiquement les informations partagées pour remplir le clavier</string>
<string name="keyboard_search_share_summary">Lorsqu\'une adresse web est partagée avec KeePassDX, filtrer automatiquement les entrées contenant le domaine</string>
<string name="keyboard_search_share_title">Rechercher les informations partagées</string>
<string name="filter">Filtre</string>
<string name="subdomain_search_summary">Recherche des domaines Web avec des contraintes de sous-domaines</string>
@@ -469,7 +469,7 @@
<string name="upload_attachment">Téléverser %1$s</string>
<string name="education_add_attachment_summary">Téléverse une pièce-jointe à votre entrée pour enregistrer dimportantes données externes.</string>
<string name="education_add_attachment_title">Ajouter une pièce-jointe</string>
<string name="warning_sure_add_file">Ajouter quand même le fichier\?</string>
<string name="warning_sure_add_file">Ajouter quand même le fichier \?</string>
<string name="warning_replace_file">Téléverser ce fichier va remplacer celui en place.</string>
<string name="warning_file_too_big">Une base de données KeePass est seulement censée contenir de petits fichiers utilitaires (tels que les fichiers clé PGP).
\n
@@ -493,7 +493,7 @@
<string name="autofill_close_database_title">Fermer la base de données</string>
<string name="keyboard_previous_lock_summary">Revient automatiquement au clavier précédent après le verrouillage de la base de données</string>
<string name="keyboard_previous_lock_title">Verrouiller la base de données</string>
<string name="keyboard_save_search_info_summary">Essayer denregistrer les informations partagées lors de la sélection manuelle dune entrée</string>
<string name="keyboard_save_search_info_summary">Essayer denregistrer l\'association entre une adresse web partagée à KeePassDX et l\'entrée sélectionnée manuellement</string>
<string name="keyboard_save_search_info_title">Enregistrer les infos partagées</string>
<string name="notification">Notification</string>
<string name="biometric_security_update_required">Mise à jour de sécurité biométrique requise.</string>
@@ -536,7 +536,7 @@
<string name="error_rebuild_list">Impossible de reconstruire correctement la liste.</string>
<string name="error_database_uri_null">L\'URI de la base de données ne peut pas être récupéré.</string>
<string name="autofill_inline_suggestions_keyboard">Suggestions de remplissage automatique ajoutées.</string>
<string name="autofill_inline_suggestions_summary">Tente d\'afficher des suggestions de remplissage automatique directement à partir d\'un clavier compatible</string>
<string name="autofill_inline_suggestions_summary">Tente d\'afficher des suggestions de remplissage automatique dans la barre de suggestions des claviers compatibles</string>
<string name="autofill_inline_suggestions_title">Suggestions en ligne</string>
<string name="warning_database_info_changed_options">Écraser les modifications externes en sauvegardant la base de données ou recharger-la avec les dernières modifications.</string>
<string name="warning_database_revoked">Accès au dossier révoqué par le gestionnaire de fichiers, fermer la base de données et la rouvrir à partir de son emplacement.</string>
@@ -547,7 +547,7 @@
<string name="unit_kibibyte">Kibioctets</string>
<string name="unit_byte">Octets</string>
<string name="error_otp_type">Le type OTP existant n\'est pas reconnu par ce formulaire, sa validation peut ne plus générer correctement le jeton.</string>
<string name="download_canceled">Annulé!</string>
<string name="download_canceled">Annulé !</string>
<string name="icon_section_custom">Customisé</string>
<string name="icon_section_standard">Standard</string>
<string name="style_brightness_summary">Sélectionnez des thèmes clairs ou foncés</string>

View File

@@ -18,7 +18,7 @@
along with KeePassDX. If not, see <http://www.gnu.org/licenses/>.
-->
<resources>
<string name="feedback">प्रतिक्रिय</string>
<string name="feedback">प्प्रतिपुष्टि</string>
<string name="homepage">होमपेज</string>
<string name="about_description">एंड्रॉयड पर आधारित KeePass पासवर्ड मैनेजर</string>
<string name="accept">स्वीकार</string>
@@ -35,7 +35,7 @@
<string name="extended_ASCII">विस्तारित ASCII</string>
<string name="allow">अनुमति दें</string>
<string name="clipboard_cleared">क्लिपबोर्ड साफ कर दिया</string>
<string name="clipboard_error_title">क्लिपबोर्ड त्रुटि</string>
<string name="clipboard_error_title">क्लिपबोर्ड एरर</string>
<string name="clipboard_error">सैमसंग के कुछ एंड्रॉइड फोन क्लिपबोर्ड का उपयोग नहीं करने देंगे।</string>
<string name="clipboard_error_clear">क्लिपबोर्ड को साफ़ नहीं किया जा सका</string>
<string name="clipboard_timeout">क्लिपबोर्ड टाइमआउट</string>
@@ -104,7 +104,7 @@
<string name="otp_counter">काउंटर</string>
<string name="otp_digits">अंक</string>
<string name="otp_algorithm">एल्गोरिथ्म</string>
<string name="entry_otp">OTP</string>
<string name="entry_otp">ओटीप</string>
<string name="error_invalid_OTP">अमान्य ओटीपी गुप्त।</string>
<string name="error_disallow_no_credentials">कम से कम एक क्रेडेंशियल सेट किया जाना चाहिए।</string>
</resources>

View File

@@ -160,7 +160,7 @@
<string name="extended_ASCII">ASCII Diperluas</string>
<string name="brackets">Tanda Kurung</string>
<string name="application">Aplikasi</string>
<string name="app_timeout">Batas Waktu Aplikasi</string>
<string name="app_timeout">Waktu habis</string>
<string name="key_derivation_function">Fungsi Derivasi Kunci</string>
<string name="encryption_algorithm">Algoritma Enkripsi</string>
<string name="encryption">Enkripsi</string>
@@ -384,4 +384,18 @@
<string name="error_upload_file">Timbul galat saat mengunggah data berkas.</string>
<string name="error_file_to_big">File yang Anda unggah terlalu besar.</string>
<string name="content_description_otp_information">Info sandi satu kali</string>
<string name="education_select_database_title">Buka basisdata yang sudah ada</string>
<string name="enable_auto_save_database_title">Simpan otomatis basisdata</string>
<string name="education_new_node_title">Tambah item ke basisdata anda</string>
<string name="education_entry_edit_title">Sunting entri</string>
<string name="education_create_database_title">Buat berkas basisdata anda</string>
<string name="delete_entered_password_title">Hapus kata sandi</string>
<string name="education_sort_title">Pengurutan item</string>
<string name="html_text_dev_feature_thanks">Terima kasih banyak atas kontribusinya.</string>
<string name="html_text_dev_feature_contibute">Dengan <strong>berkontribusi</strong>,</string>
<string name="education_lock_title">Kunci basisdata</string>
<string name="education_unlock_title">Buka basisdata anda</string>
<string name="education_field_copy_title">Salin bidang</string>
<string name="education_setup_OTP_title">Atur OTP</string>
<string name="education_donation_title">Partisipasi</string>
</resources>

View File

@@ -177,7 +177,7 @@
<string name="field_name">Nome do campo</string>
<string name="error_autofill_enable_service">Não pôde ser ativado o serviço de preenchimento automático.</string>
<string name="error_wrong_length">Digite um número inteiro positivo no campo \"Tamanho\".</string>
<string name="error_string_key">Um nome do campo é necessário para cada string.</string>
<string name="error_string_key">Um nome do campo é necessário para cada cadeia.</string>
<string name="error_rounds_too_large">\"Número de rodadas\" é muito grande. Modificado para 2147483648.</string>
<string name="error_pass_match">As palavras-passe não coincidem.</string>
<string name="error_pass_gen_type">Pelo menos um tipo de geração de palavra-chave deve ser selecionado.</string>
@@ -255,7 +255,7 @@
<string name="auto_focus_search_summary">Solicitar uma pesquisa quando abrir a base de dados</string>
<string name="auto_focus_search_title">Pesquisa rápida</string>
<string name="omit_backup_search_summary">Omite os grupos \"Backup\" e \"Cesto da reciclagem\" dos resultados da busca</string>
<string name="omit_backup_search_title">Não procurar por entradas no backup ou na lixeira</string>
<string name="omit_backup_search_title">Não procurar por entradas no backup ou no lixo</string>
<string name="about">Sobre</string>
<string name="hide_password_summary">Mascarar palavras-passe (***) por predefinição</string>
<string name="hide_password_title">Esconder palavras-passe</string>
@@ -452,7 +452,7 @@
<string name="add_group">Adicionar grupo</string>
<string name="add_entry">Adicionar entrada</string>
<string name="accept">Aceitar</string>
<string name="device_credential">Credencial do dispositivo</string>
<string name="device_credential">Credencial do aparelho</string>
<string name="advanced_unlock_prompt_not_initialized">Incapaz de inicializar o desbloqueio antecipado.</string>
<string name="advanced_unlock_scanning_error">Erro de desbloqueio avançado: %1$s</string>
<string name="advanced_unlock_not_recognized">Não conseguia reconhecer impressão de desbloqueio avançado</string>

View File

@@ -36,7 +36,7 @@
<string name="clipboard_error_clear">Не удалось очистить буфер обмена</string>
<string name="clipboard_timeout">Задержка очистки буфера обмена</string>
<string name="clipboard_timeout_summary">Продолжительность хранения в буфере обмена (если поддерживается устройством)</string>
<string name="select_to_copy">Выберите %1$s для копирования в буфер обмена</string>
<string name="select_to_copy">Нажатие скопирует «%1$s» в буфер</string>
<string name="retrieving_db_key">Получение ключа базы…</string>
<string name="database">База</string>
<string name="decrypting_db">Расшифровка базы…</string>
@@ -58,7 +58,7 @@
<string name="save">Сохранить</string>
<string name="entry_title">Название</string>
<string name="entry_url">Ссылка</string>
<string name="entry_user_name">Имя пользователя</string>
<string name="entry_user_name">Пользователь</string>
<string name="error_arc4">Потоковый шифр Arcfour не поддерживается.</string>
<string name="error_can_not_handle_uri">Невозможно обработать указанный URI в KeePassDX.</string>
<string name="error_file_not_create">Невозможно создать файл</string>

View File

@@ -27,7 +27,7 @@
<string name="app_timeout">延时</string>
<string name="app_timeout_summary">在锁定数据库前处于非活动状态的时长</string>
<string name="application">应用</string>
<string name="menu_app_settings">程序设置</string>
<string name="menu_app_settings">应用设置</string>
<string name="brackets">括号</string>
<string name="file_manager_install_description">需要一款接受意图操作 ACTION_CREATE_DOCUMENT 和 ACTION_OPEN_DOCUMENT 的文件管理器来创建、打开和保存数据库文件。</string>
<string name="clipboard_cleared">剪贴板已清空</string>
@@ -46,14 +46,14 @@
<string name="entry_cancel">取消</string>
<string name="entry_notes">备注</string>
<string name="entry_confpassword">确认密码</string>
<string name="entry_created">建时间</string>
<string name="entry_created">建时间</string>
<string name="entry_expires">过期时间</string>
<string name="entry_keyfile">密钥文件</string>
<string name="entry_modified">修改时间</string>
<string name="entry_password">密码</string>
<string name="save">保存</string>
<string name="entry_title">名称</string>
<string name="entry_url">链接</string>
<string name="entry_url">网址</string>
<string name="entry_user_name">用户名</string>
<string name="error_arc4">不支持Arcfour流式加密。</string>
<string name="error_can_not_handle_uri">无法在KeePassDX中处理此URI。</string>
@@ -96,11 +96,11 @@
<string name="menu_lock">锁定数据库</string>
<string name="menu_open">打开</string>
<string name="menu_search">搜索</string>
<string name="menu_url">打开链接</string>
<string name="menu_url">打开网址</string>
<string name="minus">减号</string>
<string name="never">从不</string>
<string name="no_results">没有搜索结果</string>
<string name="no_url_handler">需要安装网络浏览器才能打开这个URL</string>
<string name="no_url_handler">需要安装网络浏览器才能打开这个网址</string>
<string name="progress_create">正在新建数据库…</string>
<string name="progress_title">正在处理…</string>
<string name="content_description_remove_from_list">移除</string>
@@ -128,14 +128,14 @@
<string name="extended_ASCII">ASCII拓展区字符</string>
<string name="allow">允许</string>
<string name="clipboard_error_title">剪切板错误</string>
<string name="clipboard_error">些设备不允许程序使用剪板。</string>
<string name="clipboard_error">些设备不允许应用程序使用剪板。</string>
<string name="clipboard_error_clear">无法清空剪切板</string>
<string name="style_choose_title">主题</string>
<string name="icon_pack_choose_title">图标包</string>
<string name="icon_pack_choose_summary">程序中使用的图标包</string>
<string name="edit_entry">编辑条目</string>
<string name="key_derivation_function">密钥推导函数</string>
<string name="entry_not_found">找不到条目。</string>
<string name="entry_not_found">找不到条目数据</string>
<string name="error_load_database">无法加载数据库。</string>
<string name="error_load_database_KDF_memory">无法加载密钥。尝试降低KDF的“内存使用”值。</string>
<string name="error_autofill_enable_service">无法启用自动填充服务。</string>
@@ -153,10 +153,10 @@
<string name="menu_file_selection_read_only">只读</string>
<string name="menu_open_file_read_and_write">可修改</string>
<string name="omit_backup_search_title">搜索时忽略备份条目</string>
<string name="omit_backup_search_summary">搜索忽略“备份”“回收站”群组</string>
<string name="omit_backup_search_summary">搜索结果中忽略“备份”“回收站”群组</string>
<string name="protection">保护</string>
<string name="read_only">只读</string>
<string name="read_only_warning">KeePassDX需要写入权限以修改数据</string>
<string name="read_only_warning">根据您的文件管理器KeePassDX 可能不允许在您的存储中写入数据。</string>
<string name="show_recent_files_title">最近文件历史</string>
<string name="show_recent_files_summary">记住最近使用的文件名</string>
<string name="encryption_explanation">加密所有数据时采用的算法。</string>
@@ -178,8 +178,8 @@
<string name="menu_appearance_settings">外观</string>
<string name="general">常规</string>
<string name="autofill">自动填充</string>
<string name="autofill_service_name">使用KeePassDX自动填充</string>
<string name="autofill_sign_in_prompt">使用KeePassDX密码登录</string>
<string name="autofill_service_name">KeePassDX 自动填充</string>
<string name="autofill_sign_in_prompt">使用 KeePassDX 登录</string>
<string name="clipboard">剪贴板</string>
<string name="clipboard_notifications_title">剪贴板通知</string>
<string name="lock">锁定</string>
@@ -317,7 +317,7 @@
<string name="keyboard_selection_entry_title">条目选择</string>
<string name="keyboard_selection_entry_summary">在查看条目时,在专用键盘中显示输入字段</string>
<string name="delete_entered_password_title">删除密码</string>
<string name="delete_entered_password_summary">在连接数据库尝试后删除输入的密码</string>
<string name="delete_entered_password_summary">尝试连接数据库后删除输入的密码</string>
<string name="content_description_open_file">打开文件</string>
<string name="content_description_node_children">子节点</string>
<string name="content_description_add_node">增加节点</string>
@@ -334,7 +334,7 @@
<string name="content_description_remove_field">删除字段</string>
<string name="entry_UUID">UUID</string>
<string name="error_move_entry_here">无法移动条目到此处。</string>
<string name="error_copy_entry_here">无法复制条目到此处</string>
<string name="error_copy_entry_here">您不能在此处复制条目。</string>
<string name="list_groups_show_number_entries_title">显示条目数量</string>
<string name="list_groups_show_number_entries_summary">显示群组中的条目数</string>
<string name="content_description_background">背景</string>
@@ -350,17 +350,17 @@
<string name="master_key">主密钥</string>
<string name="security">安全</string>
<string name="entry_history">历史</string>
<string name="entry_setup_otp">设置一次性密码</string>
<string name="otp_type">一次性密码类型</string>
<string name="entry_setup_otp">设置 OTP</string>
<string name="otp_type">OTP 类型</string>
<string name="otp_secret">密钥</string>
<string name="otp_period">时长(秒)</string>
<string name="otp_counter">计数器</string>
<string name="otp_digits">数字位数</string>
<string name="otp_algorithm">算法</string>
<string name="entry_otp">一次性密码</string>
<string name="entry_otp">OTP</string>
<string name="error_invalid_OTP">错误的一次性密码密钥。</string>
<string name="error_disallow_no_credentials">至少需要设置一个凭据。</string>
<string name="error_copy_group_here">这里不能复制组。</string>
<string name="error_copy_group_here">您无法在此处复制组。</string>
<string name="error_otp_secret_key">密钥必须是BASE32格式。</string>
<string name="error_otp_counter">计数器必须在%1$d和%2$d之间。</string>
<string name="error_otp_period">时长必须在%1$d秒到%2$d秒之间。</string>
@@ -369,11 +369,11 @@
<string name="creating_database">新建数据库…</string>
<string name="menu_security_settings">安全设置</string>
<string name="menu_master_key_settings">主密钥设置</string>
<string name="contains_duplicate_uuid">数据库包含重复UUID。</string>
<string name="contains_duplicate_uuid_procedure">通过为重复项生成新的UUID以解决问题</string>
<string name="contains_duplicate_uuid">数据库包含重复UUID。</string>
<string name="contains_duplicate_uuid_procedure">通过为重复项生成新的 UUID 以解决问题?</string>
<string name="database_opened">数据库开启</string>
<string name="clipboard_explanation_summary">使用设备的剪贴板来复制输入字段</string>
<string name="advanced_unlock_explanation_summary">使用高级解锁轻松打开数据库</string>
<string name="advanced_unlock_explanation_summary">使用高级解锁以便快速解锁数据库</string>
<string name="database_data_compression_title">数据压缩</string>
<string name="database_data_compression_summary">数据压缩减少了数据库的大小</string>
<string name="max_history_items_title">最大数量</string>
@@ -432,7 +432,7 @@
<string name="entry_add_attachment">添加附件</string>
<string name="discard_changes">放弃更改?</string>
<string name="validate">验证</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="lock_database_show_button_summary">在用户界面中显示锁定数据库按钮</string>
<string name="lock_database_show_button_title">显示锁定数据库按钮</string>
@@ -444,11 +444,11 @@
<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_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="subdomain_search_summary">搜索带有子域约束的web域</string>
<string name="subdomain_search_summary">搜索带有子域约束的网址域名</string>
<string name="subdomain_search_title">子域搜索</string>
<string name="error_string_type">文本和请求的条目不匹配.</string>
<string name="content_description_add_item">添加条目</string>
@@ -508,8 +508,8 @@
<string name="advanced_unlock_prompt_extract_credential_title">用高级解锁识别打开数据库</string>
<string name="advanced_unlock_prompt_store_credential_message">警告:即使您使用高级解锁识别,您仍然需要记住您的主密码。</string>
<string name="advanced_unlock_prompt_store_credential_title">高级解锁识别</string>
<string name="open_advanced_unlock_prompt_store_credential">打开高级解锁提示来存储凭证</string>
<string name="open_advanced_unlock_prompt_unlock_database">打开高级解锁提示来解锁数据库</string>
<string name="open_advanced_unlock_prompt_store_credential">点击以打开高级解锁提示来存储凭证</string>
<string name="open_advanced_unlock_prompt_unlock_database">点击以使用高级识别解锁</string>
<string name="menu_keystore_remove_key">删除高级解锁密钥</string>
<string name="enter">输入</string>
<string name="backspace">退格键</string>
@@ -550,15 +550,15 @@
<string name="error_remove_file">删除文件数据时发生了一个错误。</string>
<string name="error_duplicate_file">文件数据已存在。</string>
<string name="properties">属性</string>
<string name="error_export_app_properties">应用属性导出期间出错</string>
<string name="success_export_app_properties">已导出应用属性</string>
<string name="error_import_app_properties">导入应用属性期间出错</string>
<string name="success_import_app_properties">已导入应用属性</string>
<string name="description_app_properties">管理应用设置的 KeePassDX 属性</string>
<string name="export_app_properties_summary">创建一个文件导出应用属性</string>
<string name="export_app_properties_title">导出应用属性</string>
<string name="import_app_properties_summary">选择一个文件导入应用属性</string>
<string name="import_app_properties_title">导入应用属性</string>
<string name="error_export_app_properties">导出应用配置时出错</string>
<string name="success_export_app_properties">已导出应用配置</string>
<string name="error_import_app_properties">导入应用配置时出错</string>
<string name="success_import_app_properties">已导入应用配置</string>
<string name="description_app_properties">管理应用设置的 KeePassDX 配置</string>
<string name="export_app_properties_summary">创建一个文件导出应用配置</string>
<string name="export_app_properties_title">导出配置</string>
<string name="import_app_properties_summary">选择一个文件导入应用配置</string>
<string name="import_app_properties_title">导入配置</string>
<string name="error_start_database_action">对数据库执行操作时发生了一个错误。</string>
<string name="error_move_group_here">你不能把一个组移动到此处。</string>
<string name="error_word_reserved">这个单词是保留的,不能使用。</string>

View File

@@ -413,13 +413,13 @@
<string name="keyboard_setting_label">Magikeyboard settings</string>
<string name="keyboard_entry_category">Entry</string>
<string name="keyboard_selection_entry_title">Entry selection</string>
<string name="keyboard_selection_entry_summary">Show input fields in Magikeyboard when viewing an entry</string>
<string name="keyboard_selection_entry_summary">When viewing an entry in KeePassDX, populate Magikeyboard with that entry</string>
<string name="keyboard_notification_entry_title">Notification info</string>
<string name="keyboard_notification_entry_summary">Show a notification when an entry is available</string>
<string name="keyboard_search_share_title">Search shared info</string>
<string name="keyboard_search_share_summary">Automatically search for shared information to populate the keyboard</string>
<string name="keyboard_search_share_summary">When sharing a URL to KeePassDX, filter the entries using that URL domain</string>
<string name="keyboard_save_search_info_title">Save shared info</string>
<string name="keyboard_save_search_info_summary">Try to save shared information when making a manual entry selection</string>
<string name="keyboard_save_search_info_summary">After sharing a URL to KeePassDX, when an entry is selected, try to remember that entry for further uses</string>
<string name="keyboard_notification_entry_clear_close_title">Clear at closing</string>
<string name="keyboard_notification_entry_clear_close_summary">Close the database when closing the notification</string>
<string name="keyboard_entry_timeout_title">Timeout</string>

View File

@@ -1 +1 @@
*
* Fix parcelable with custom data #986

View File

@@ -0,0 +1,2 @@
* Fix search fields references #987
* Fix Auto-Types with same key #997

View File

@@ -0,0 +1,3 @@
* Improve Magikeyboard options description #1022 #1023 (Thx @djibux)
* Fix database opened without notification (database is now closed when screen is killed in background #1025)
* Fix biometric prompt #1018

View File

@@ -0,0 +1 @@
* Hot fix to increase the opening speed of database #1028

View File

@@ -1 +1 @@
*
* Correction des parcelable avec données customisées #986

View File

@@ -0,0 +1,2 @@
* Correction de la recherche des références de champs #987
* Correction des Auto-Types avec la même clé #997

View File

@@ -0,0 +1,3 @@
* Amélioration de la description des options de Magikeyboard #1022 #1023 (Thx @djibux)
* Correction de l'ouverture de la base de données sans notification (la base est maintenant fermée lorsque l'écran est tuée en arrière-plan #1025)
* Correction de l'invite biométrique #1018

View File

@@ -0,0 +1 @@
* Correction pour augmenter la vitesse d'ouverture de la base de données #1028