mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
Compare commits
24 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d476574d05 | ||
|
|
fe08d034bb | ||
|
|
18f4714410 | ||
|
|
1b6c416893 | ||
|
|
6153a28b4b | ||
|
|
9574cf16fb | ||
|
|
d309a67416 | ||
|
|
fb865af088 | ||
|
|
c1e7039357 | ||
|
|
0fd3b37641 | ||
|
|
cea91f7b2f | ||
|
|
3959896832 | ||
|
|
d55dccdeb1 | ||
|
|
c46c286b51 | ||
|
|
aa15d261f3 | ||
|
|
00a32463c7 | ||
|
|
dd60ff8b74 | ||
|
|
4588611cbf | ||
|
|
1460c1364a | ||
|
|
37f38fe988 | ||
|
|
cf025b9135 | ||
|
|
283ff7a280 | ||
|
|
e668f016b4 | ||
|
|
256c2c955a |
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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++
|
||||
|
||||
@@ -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))))
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
</resources>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -1 +1 @@
|
||||
*
|
||||
* Fix parcelable with custom data #986
|
||||
2
fastlane/metadata/android/en-US/changelogs/80.txt
Normal file
2
fastlane/metadata/android/en-US/changelogs/80.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
* Fix search fields references #987
|
||||
* Fix Auto-Types with same key #997
|
||||
@@ -1 +1 @@
|
||||
*
|
||||
* Correction des parcelable avec données customisées #986
|
||||
2
fastlane/metadata/android/fr-FR/changelogs/80.txt
Normal file
2
fastlane/metadata/android/fr-FR/changelogs/80.txt
Normal 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
|
||||
Reference in New Issue
Block a user