Compare commits

...

24 Commits

Author SHA1 Message Date
J-Jamet
d476574d05 Merge branch 'release/2.10.2' 2021-06-02 10:37:21 +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
26 changed files with 242 additions and 158 deletions

View File

@@ -1,3 +1,7 @@
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 = 80
versionName = "2.10.2"
multiDexEnabled true
testApplicationId = "com.kunzisoft.keepass.tests"

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

@@ -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

@@ -280,8 +280,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) {}
}
}
}

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>
@@ -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

@@ -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>

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

@@ -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,7 +96,7 @@
<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>
@@ -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>
@@ -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>
@@ -444,7 +444,7 @@
<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">Web 域名黑名单</string>
<string name="autofill_application_id_blocklist_summary">禁止应用程序自动填充的黑名单</string>
<string name="autofill_application_id_blocklist_title">应用拦截列表</string>
<string name="filter">过滤器</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

@@ -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

@@ -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