Merge branch 'feature/Permissions' into develop #34

This commit is contained in:
J-Jamet
2018-03-01 22:54:36 +01:00
32 changed files with 181 additions and 115 deletions

View File

@@ -62,6 +62,7 @@ android {
def supportVersion = "25.4.0"
def spongycastleVersion = "1.58.0.0"
def permissionDispatcherVersion = "3.1.0"
dependencies {
androidTestCompile "junit:junit:4.12"
@@ -72,7 +73,14 @@ dependencies {
compile "com.android.support:cardview-v7:$supportVersion"
compile "com.madgag.spongycastle:core:$spongycastleVersion"
compile "com.madgag.spongycastle:prov:$spongycastleVersion"
// Time
compile "joda-time:joda-time:2.9.9"
compile "org.sufficientlysecure:html-textview:3.5"
compile "com.nononsenseapps:filepicker:4.1.0"
// Permissions
compile ("com.github.hotchemi:permissionsdispatcher:$permissionDispatcherVersion") {
// if you don't use android.app.Fragment you can exclude support for them
exclude module: "support-v13"
}
annotationProcessor "com.github.hotchemi:permissionsdispatcher-processor:$permissionDispatcherVersion"
}

View File

@@ -22,15 +22,15 @@ package com.keepassdroid.fileselect;
import android.Manifest;
import android.content.ActivityNotFoundException;
import android.content.ContentResolver;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
@@ -41,24 +41,23 @@ import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.keepassdroid.fragments.AssignMasterKeyDialogFragment;
import com.keepassdroid.fragments.CreateFileDialogFragment;
import com.keepassdroid.activities.GroupActivity;
import com.keepassdroid.password.PasswordActivity;
import com.keepassdroid.tasks.ProgressTask;
import com.keepassdroid.app.App;
import com.keepassdroid.compat.ContentResolverCompat;
import com.keepassdroid.compat.StorageAF;
import com.keepassdroid.database.edit.CreateDB;
import com.keepassdroid.database.edit.FileOnFinish;
import com.keepassdroid.database.exception.ContentFileNotFoundException;
import com.keepassdroid.fragments.AssignMasterKeyDialogFragment;
import com.keepassdroid.fragments.CreateFileDialogFragment;
import com.keepassdroid.intents.Intents;
import com.keepassdroid.password.PasswordActivity;
import com.keepassdroid.stylish.StylishActivity;
import com.keepassdroid.tasks.ProgressTask;
import com.keepassdroid.utils.EmptyUtils;
import com.keepassdroid.utils.Interaction;
import com.keepassdroid.utils.MenuUtil;
import com.keepassdroid.utils.UriUtil;
import com.keepassdroid.utils.Util;
import com.keepassdroid.view.AssignPasswordHelper;
import com.keepassdroid.view.FileNameView;
import com.kunzisoft.keepass.R;
@@ -68,6 +67,14 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URLDecoder;
import permissions.dispatcher.NeedsPermission;
import permissions.dispatcher.OnNeverAskAgain;
import permissions.dispatcher.OnPermissionDenied;
import permissions.dispatcher.OnShowRationale;
import permissions.dispatcher.PermissionRequest;
import permissions.dispatcher.RuntimePermissions;
@RuntimePermissions
public class FileSelectActivity extends StylishActivity implements
CreateFileDialogFragment.DefinePathDialogListener ,
AssignMasterKeyDialogFragment.AssignPasswordDialogListener,
@@ -77,7 +84,6 @@ public class FileSelectActivity extends StylishActivity implements
private static final String TAG = "FileSelectActivity";
private static final int MY_PERMISSIONS_REQUEST_EXTERNAL_STORAGE = 111;
private RecyclerView mListFiles;
private FileSelectAdapter mAdapter;
private View fileListTitle;
@@ -111,6 +117,15 @@ public class FileSelectActivity extends StylishActivity implements
toolbar.setTitle(getString(R.string.app_name));
setSupportActionBar(toolbar);
openFileNameView = (EditText) findViewById(R.id.file_filename);
// Set the initial value of the filename
String defaultPath = Environment.getExternalStorageDirectory().getAbsolutePath()
+ getString(R.string.database_file_path_default)
+ getString(R.string.database_file_name_default)
+ getString(R.string.database_file_extension_default);
openFileNameView.setText(defaultPath);
mListFiles = (RecyclerView) findViewById(R.id.file_list);
mListFiles.setLayoutManager(new LinearLayoutManager(this));
@@ -119,8 +134,7 @@ public class FileSelectActivity extends StylishActivity implements
openButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String fileName = Util.getEditText(FileSelectActivity.this,
R.id.file_filename);
String fileName = openFileNameView.getText().toString();
try {
PasswordActivity.Launch(FileSelectActivity.this, fileName);
}
@@ -139,8 +153,8 @@ public class FileSelectActivity extends StylishActivity implements
View createButton = findViewById(R.id.create_database);
createButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
CreateFileDialogFragment createFileDialogFragment = new CreateFileDialogFragment();
createFileDialogFragment.show(getSupportFragmentManager(), "createFileDialogFragment");
FileSelectActivityPermissionsDispatcher
.openCreateFileDialogFragmentWithPermissionCheck(FileSelectActivity.this);
}
});
@@ -176,7 +190,7 @@ public class FileSelectActivity extends StylishActivity implements
private void lookForOpenIntentsFilePicker() {
if (Interaction.isIntentAvailable(FileSelectActivity.this, Intents.OPEN_INTENTS_FILE_BROWSE)) {
Intent i = new Intent(Intents.OPEN_INTENTS_FILE_BROWSE);
i.setData(Uri.parse("file://" + Util.getEditText(FileSelectActivity.this, R.id.file_filename)));
i.setData(Uri.parse("file://" + openFileNameView.getText().toString()));
try {
startActivityForResult(i, FILE_BROWSE);
} catch (ActivityNotFoundException e) {
@@ -193,14 +207,6 @@ public class FileSelectActivity extends StylishActivity implements
}
});
// Set the initial value of the filename
openFileNameView = (EditText) findViewById(R.id.file_filename);
String defaultPath = Environment.getExternalStorageDirectory().getAbsolutePath()
+ getString(R.string.database_file_path_default)
+ getString(R.string.database_file_name_default)
+ getString(R.string.database_file_extension_default);
openFileNameView.setText(defaultPath);
// Construct adapter with listeners
mAdapter = new FileSelectAdapter(FileSelectActivity.this, fileHistory.getDbList());
mAdapter.setOnItemClickListener(this);
@@ -240,6 +246,19 @@ public class FileSelectActivity extends StylishActivity implements
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// NOTE: delegate the permission handling to generated method
FileSelectActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
@NeedsPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
public void openCreateFileDialogFragment() {
CreateFileDialogFragment createFileDialogFragment = new CreateFileDialogFragment();
createFileDialogFragment.show(getSupportFragmentManager(), "createFileDialogFragment");
}
private void updateTitleFileListView() {
if(mAdapter.getItemCount() == 0)
fileListTitle.setVisibility(View.INVISIBLE);
@@ -481,9 +500,6 @@ public class FileSelectActivity extends StylishActivity implements
@Override
protected void onResume() {
super.onResume();
// check for storage permission
checkStoragePermission();
// Check to see if we need to change modes
if ( fileHistory.hasRecentFiles() != recentMode ) {
@@ -501,59 +517,34 @@ public class FileSelectActivity extends StylishActivity implements
mAdapter.notifyDataSetChanged();
}
private void checkStoragePermission() {
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(FileSelectActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
@OnShowRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)
void showRationaleForExternalStorage(final PermissionRequest request) {
new AlertDialog.Builder(this)
.setMessage(R.string.permission_external_storage_rationale_write_database)
.setPositiveButton(R.string.allow, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.proceed();
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.cancel();
}
})
.show();
}
// Should we show an explanation?
//if (ActivityCompat.shouldShowRequestPermissionRationale(FileSelectActivity.this,
// Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
@OnPermissionDenied(Manifest.permission.WRITE_EXTERNAL_STORAGE)
void showDeniedForExternalStorage() {
Toast.makeText(this, R.string.permission_external_storage_denied, Toast.LENGTH_SHORT).show();
}
// Show an explanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
//} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(FileSelectActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
MY_PERMISSIONS_REQUEST_EXTERNAL_STORAGE);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
//}
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_EXTERNAL_STORAGE: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
@OnNeverAskAgain(Manifest.permission.WRITE_EXTERNAL_STORAGE)
void showNeverAskForExternalStorage() {
Toast.makeText(this, R.string.permission_external_storage_never_ask, Toast.LENGTH_SHORT).show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {

View File

@@ -19,6 +19,7 @@
*/
package com.keepassdroid.password;
import android.Manifest;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
@@ -30,8 +31,10 @@ import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.v4.hardware.fingerprint.FingerprintManagerCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextWatcher;
@@ -72,10 +75,18 @@ import com.kunzisoft.keepass.R;
import java.io.File;
import java.io.FileNotFoundException;
import permissions.dispatcher.NeedsPermission;
import permissions.dispatcher.OnNeverAskAgain;
import permissions.dispatcher.OnPermissionDenied;
import permissions.dispatcher.OnShowRationale;
import permissions.dispatcher.PermissionRequest;
import permissions.dispatcher.RuntimePermissions;
import static com.keepassdroid.fingerprint.FingerPrintHelper.Mode.NOT_CONFIGURED_MODE;
import static com.keepassdroid.fingerprint.FingerPrintHelper.Mode.OPEN_MODE;
import static com.keepassdroid.fingerprint.FingerPrintHelper.Mode.STORE_MODE;
@RuntimePermissions
public class PasswordActivity extends LockingActivity
implements FingerPrintHelper.FingerPrintCallback, UriIntentInitTaskCallback {
@@ -267,7 +278,6 @@ public class PasswordActivity extends LockingActivity
@Override
public void onPostInitTask(Uri dbUri, Uri keyFileUri, Integer errorStringId) {
mDbUri = dbUri;
if (errorStringId != null) {
@@ -276,6 +286,12 @@ public class PasswordActivity extends LockingActivity
return;
}
// Verify permission to read file
if (mDbUri != null
&& !dbUri.getScheme().contains("content"))
PasswordActivityPermissionsDispatcher
.doNothingWithPermissionCheck(this);
// Define title
String dbUriString = (mDbUri == null) ? "" : mDbUri.toString();
if (!dbUriString.isEmpty()) {
@@ -720,6 +736,13 @@ public class PasswordActivity extends LockingActivity
return super.onOptionsItemSelected(item);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// NOTE: delegate the permission handling to generated method
PasswordActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
/**
* Called after verify and try to opening the database
*/
@@ -819,7 +842,6 @@ public class PasswordActivity extends LockingActivity
return R.string.error_can_not_handle_uri;
}
} else {
databaseUri = UriUtil.parseDefaultFile(intent.getStringExtra(KEY_FILENAME));
keyFileUri = UriUtil.parseDefaultFile(intent.getStringExtra(KEY_KEYFILE));
@@ -843,4 +865,38 @@ public class PasswordActivity extends LockingActivity
}
}
}
@NeedsPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
public void doNothing() {}
@OnShowRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)
void showRationaleForExternalStorage(final PermissionRequest request) {
new AlertDialog.Builder(this)
.setMessage(R.string.permission_external_storage_rationale_read_database)
.setPositiveButton(R.string.allow, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.proceed();
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.cancel();
}
})
.show();
}
@OnPermissionDenied(Manifest.permission.WRITE_EXTERNAL_STORAGE)
void showDeniedForExternalStorage() {
Toast.makeText(this, R.string.permission_external_storage_denied, Toast.LENGTH_SHORT).show();
finish();
}
@OnNeverAskAgain(Manifest.permission.WRITE_EXTERNAL_STORAGE)
void showNeverAskForExternalStorage() {
Toast.makeText(this, R.string.permission_external_storage_never_ask, Toast.LENGTH_SHORT).show();
finish();
}
}

View File

@@ -66,8 +66,6 @@
android:layout_marginLeft="24dp"
android:layout_marginEnd="24dp"
android:layout_marginRight="24dp"
android:layout_marginBottom="48dp"
android:paddingTop="-20dp"
app:fabSize="mini"
app:layout_anchor="@id/app_bar"
app:layout_anchorGravity="bottom|end"

View File

@@ -48,17 +48,16 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/KeepassDXStyle.TextAppearance.Inverse"
android:text="@string/enter_filename"/>
android:text="@string/select_database_file"/>
<android.support.v7.widget.AppCompatImageView
android:id="@+id/browse_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/file_filename"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@id/label_open_by_filename"
android:padding="6dp"
android:src="@drawable/ic_folder_white_24dp"
android:tint="?attr/colorAccentCompat" />
@@ -69,8 +68,12 @@
android:layout_below="@id/label_open_by_filename"
android:inputType="textUri"
android:textColor="?attr/textColorInverse"
android:layout_toLeftOf="@+id/browse_button"
android:layout_toStartOf="@+id/browse_button"
android:layout_marginStart="2dp"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
android:layout_marginEnd="2dp"
android:layout_toRightOf="@+id/browse_button"
android:layout_toEndOf="@+id/browse_button"
android:maxLines="1" />
</RelativeLayout>

View File

@@ -53,7 +53,7 @@
<string name="digits">Dígits</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft ve SENSE CAP MENA DE GARANTIA; Això és programari lliure, i pots redistribuïr-lo sota els termes de la llicència GPL versió 2 o posterior.</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">Introdueix el nom de la base de dades:</string>
<string name="select_database_file">Introdueix el nom de la base de dades:</string>
<string name="entry_accessed">Accedida: </string>
<string name="entry_and_or">Introdueix una contrasenya i/o un arxiu clau per desbloquejar la base de dades:</string>
<string name="entry_cancel">Cancel·la</string>

View File

@@ -58,7 +58,7 @@
<string name="digits">Čísla</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft dodáván BEZ JAKÉKOLIV ZÁRUKY; Toto je free software zdarma, a je možná jeho redistribuce pod podmínkou licence GPL verze 2 nebo novější.</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">Zadejte názvev souboru databáze:</string>
<string name="select_database_file">Zadejte názvev souboru databáze:</string>
<string name="entry_accessed">Poslední přístup: </string>
<string name="entry_and_or">Zadejte heslo a/nebo soubor s klíčem pro odemknutí databáze:</string>
<string name="entry_cancel">Storno</string>

View File

@@ -57,7 +57,7 @@
<string name="digits">Cifre</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under the conditions of the GPL version 2 or later.</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">Angiv navn på databasefil:</string>
<string name="select_database_file">Angiv navn på databasefil:</string>
<string name="entry_accessed">Senest åbnet: </string>
<string name="entry_and_or">Angiv en adgangskode og/eller en nøglefil for at få adgang til din database:</string>
<string name="entry_cancel">Annuller</string>

View File

@@ -61,7 +61,7 @@
<string name="digits">Zahlen</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft. Alle Rechte vorbehalten. Die Nutzung der Software erfolgt auf eigene Verantwortung und ohne jegliche Garantie. Die Applikation ist kostenlos und wird unter den Bedingungen der GNU GPL Version 2 (oder später) verbreitet und lizenziert.</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">Dateinamen der Datenbank eingeben:</string>
<string name="select_database_file">Dateinamen der Datenbank eingeben:</string>
<string name="entry_accessed">Letzter Zugriff:</string>
<string name="entry_and_or">Passwort und/oder Schlüsseldatei zum Entschlüsseln Ihrer Datenbank eingeben:</string>
<string name="entry_cancel">Abbrechen</string>

View File

@@ -55,7 +55,7 @@
<string name="digits">Ψηφία</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft χωρίς ΚΑΜΙΑ ΑΠΟΛΥΤΩΣ ΕΓΓΥΗΣΗ. Το παρόν είναι δωρεάν λογισμικό και είστε ευπρόσδεκτοι να το διαμοιράσετε υπό τις συνθήκες της ΙΕΛ έκδοσης 2 ή μεταγενέστερης.</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">Εισαγωγή ονόματος βάσης δεδομένων:</string>
<string name="select_database_file">Εισαγωγή ονόματος βάσης δεδομένων:</string>
<string name="entry_accessed">Προσπελάσθηκε: </string>
<string name="entry_and_or">Εισάγετε έναν κωδικό πρόσβασης και/ή αρχείο κλειδιού για να ξεκλειδώσετε τη βάση δεδομένων σας:</string>
<string name="entry_cancel">Ακύρωση</string>

View File

@@ -52,7 +52,7 @@ Spanish translation by José I. Paños. Updated by David García-Abad (23-09-201
<string name="digits">Dígitos</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft NO TIENE TOTAL GARANTÍA; Este es software libre, y puedes redristribuirlo bajo las condiciones de la licencia GPL version 2 o posterior.</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">Introduzca el nombre del archivo de base de datos:</string>
<string name="select_database_file">Introduzca el nombre del archivo de base de datos:</string>
<string name="entry_accessed">Acceso: </string>
<string name="entry_and_or">Introduzca una contraseña y/o un archivo de clave para desbloquear su base de datos:</string>
<string name="entry_cancel">Cancelar</string>

View File

@@ -57,7 +57,7 @@
<string name="digits">Zenbakiak</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft ez dakar inolako bermerik; Lan hau software librea da; banatu edo/eta aldatu egin dezakezu GNU General Public License bigarren bertsioaren baldintzapean.</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">Datubasearen fitxategiaren izena sartu:</string>
<string name="select_database_file">Datubasearen fitxategiaren izena sartu:</string>
<string name="entry_accessed">Akzesoa: </string>
<string name="entry_and_or">Sartu pasahitz eta / edo gako fitxategi bat zure datubasea desblokeatzeko:</string>
<string name="entry_cancel">Utzi</string>

View File

@@ -55,7 +55,7 @@
<string name="digits">Numerot</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under the conditions of the GPL version 2 or later.</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">Anna tietokannan tiedostonimi:</string>
<string name="select_database_file">Anna tietokannan tiedostonimi:</string>
<string name="entry_accessed">Käytetty: </string>
<string name="entry_and_or">Syötä salasana ja/tai avaintiedosto avataksesi tietokantasi:</string>
<string name="entry_cancel">Peruuta</string>

View File

@@ -40,6 +40,7 @@
<string name="browser_intall_text">File browsing requires the Open Intents File Manager, click below to install it. Due to some quirks in the file manager, browsing may not work correctly, the first time you browse.</string>
<string name="building_search_idx">Reconstruction de l\'index de recherche…</string>
<string name="cancel">Annuler</string>
<string name="allow">Permettre</string>
<string name="ClearClipboard">Presse-papier vidé</string>
<string name="clipboard_error_title">Erreur de presse-papier</string>
<string name="clipboard_error">Certains appareils Android Samsung ont un bug dans l\'implémentation du presse-papier qui empêche la copie depuis des applications. Pour plus de détails, visitez :</string>
@@ -58,7 +59,6 @@
<string name="digits">Nombres</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft n\'offre ABSOLUMENT AUCUNE GARANTIE; il s\'agit d\'un logiciel libre, vous pouvez le redistribuer sous les conditions de la licence GPL v2 ou ultérieure.</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">Sélectionnez la base de données :</string>
<string name="entry_accessed">Dernier accès</string>
<string name="entry_and_or">Entrez un mot de passe et/ou un fichier de clé pour ouvrir la base de données :</string>
<string name="entry_cancel">Annuler</string>
@@ -153,7 +153,8 @@
<string name="no_keys">Aucun élément.</string>
<string name="no_results">Aucun résultat pour cette recherche.</string>
<string name="no_url_handler">Impossible d\'ouvrir cette URL.</string>
<string name="open_recent">Bases de données utilisées récemment :</string>
<string name="select_database_file">Sélectionner une base de données existante :</string>
<string name="open_recent">Ouvrir une base de données récente :</string>
<string name="omitbackup_title">Ignorer les sauvegardes</string>
<string name="omitbackup_summary">Ignorer le groupe Sauvegardes des résultats de recherche (uniquement pour .kdb)</string>
<string name="pass_filename">Fichier de base de données KeePass</string>
@@ -252,6 +253,10 @@
<string name="full_file_path_enable_summary">Afficher le chemin complet des fichiers</string>
<string name="recycle_bin_title">Utiliser la corbeille</string>
<string name="recycle_bin_summary">Déplace un groupe ou une entrée dans la Corbeille avant la suppression</string>
<string name="permission_external_storage_rationale_write_database">KeePass DX a besoin d\'une permission de stockage externe pour écrire une base de données</string>
<string name="permission_external_storage_rationale_read_database">KeePass DX a besoin d\'une permission de stockage externe pour lire une URI non fournie par un Content Provider</string>
<string name="permission_external_storage_denied">Permission de stockage externe refusée</string>
<string name="permission_external_storage_never_ask">Impossible d\'effectuer l\'action sans autorisation de stockage externe</string>
<string-array name="clipboard_timeout_options">
<item>5 secondes</item>

View File

@@ -52,7 +52,7 @@
<string name="digits">Számok</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft. Ehhez a programhoz SEMMILYEN GARANCIA NEM JÁR; Ez egy szabad szoftver, GNU General Public License v2 vagy későbbi verziójának feltételei mellett terjeszthető, illetve módosítható. Fordította: Eversmann</string>
<string name="ellipsis"></string>
<string name="enter_filename">Adja meg az adatbázis fájlnevét:</string>
<string name="select_database_file">Adja meg az adatbázis fájlnevét:</string>
<string name="entry_accessed">Utolsó hozzáférés:</string>
<string name="entry_and_or">Adja meg a jelszót és/vagy a kulcsfájlt, hogy kinyithassa az adatbázist:</string>
<string name="entry_cancel">Mégsem</string>

View File

@@ -53,7 +53,7 @@
<string name="digits">Cifre</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft viene distribuito ASSOLUTAMENTE con NESSUNA GARANZIA; Si tratta di software libero, e sei invitato a distribuirlo sotto le condizioni della licenza GPL versione 2 o superiore.</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">Inserisci il nome file del database:</string>
<string name="select_database_file">Inserisci il nome file del database:</string>
<string name="entry_accessed">Ultimo accesso: </string>
<string name="entry_and_or">Inserisci una password e/o file chiave per sbloccare il database:</string>
<string name="entry_cancel">Annulla</string>

View File

@@ -54,7 +54,7 @@
<string name="decrypting_entry">מפענח חוליה</string>
<string name="default_checkbox">השתמש בזה כמסד הנתונים הברירת מחדל</string>
<string name="digits">ספרות</string>
<string name="enter_filename">הזן שם קובץ למסד נתונים:</string>
<string name="select_database_file">הזן שם קובץ למסד נתונים:</string>
<string name="entry_accessed">ניגש לאחרונה: </string>
<string name="entry_and_or">הזן סיסמה ו/או קובץ מפתח כדי לפתוח את מסד הנתונים:</string>
<string name="entry_cancel">בטל</string>

View File

@@ -50,7 +50,7 @@
<string name="digits">数字</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft によって作られたフリーソフトウェアであり、無保証です。GPLバージョン2以上の条件下でこれを再頒布することができます。</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">データベースファイル:</string>
<string name="select_database_file">データベースファイル:</string>
<string name="entry_accessed">最終アクセス日: </string>
<string name="entry_and_or">データベースに設定したパスワードを入力するかキーファイルを選択してください。</string>
<string name="entry_cancel">キャンセル</string>

View File

@@ -71,7 +71,7 @@
<string name="sort_name">Rūšiuoti pagal pavadinimą</string>
<string name="version_label">Versija:</string>
<string name="warning">Įspėjimas</string>
<string name="enter_filename">Įveskite duomenų bazės failą</string>
<string name="select_database_file">Įveskite duomenų bazės failą</string>
<string name="error_wrong_length">Įveskite teigiamą skaičių ilgio lauke</string>
<string name="recentfile_title">Naujausių failų istorija</string>
<string name="recentfile_summary">Atsiminti paskutinius naudotus failų pavadinimus</string>

View File

@@ -36,7 +36,7 @@
<string name="default_checkbox">Izmantot šo kā manu noklusējuma datu bāzi</string>
<string name="digits">Cipari</string>
<string name="ellipsis"></string>
<string name="enter_filename">Ievadiet datu bāzes nosaukumu:</string>
<string name="select_database_file">Ievadiet datu bāzes nosaukumu:</string>
<string name="entry_accessed">Piekļuve:</string>
<string name="entry_and_or">Ievadiet paroli/atslēgas failu, lai atbloķētu savu datu bāzi:</string>
<string name="entry_cancel">Atcelt</string>

View File

@@ -52,7 +52,7 @@
<string name="digits">Cijfers</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft biedt GEEN ENKELE GARANTIE; Dit is vrije software, u mag deze software verspreiden onder de voorwaarden van de GPL versie 2 of recenter.</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">Geef de databasebestandsnaam:</string>
<string name="select_database_file">Geef de databasebestandsnaam:</string>
<string name="entry_accessed">Laatst benaderd: </string>
<string name="entry_and_or">Geef het wachtwoord en/of het sleutelbestand om uw database te ontgrendelen:</string>
<string name="entry_cancel">Annuleren</string>

View File

@@ -50,7 +50,7 @@
<string name="digits">Tal</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft kjem med INGEN SOM HELST GARANTI. Dette er eit fritt program. Du er velkomen til å redistribuera det i samsvar med vilkåra til GPL utgåve 2 eller nyare.</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">Skriv filnamnet til databasen:</string>
<string name="select_database_file">Skriv filnamnet til databasen:</string>
<string name="entry_accessed">Brukt: </string>
<string name="entry_and_or">Skriv inn passordet og/eller nøkkelfil for å låsa opp databasen:</string>
<string name="entry_cancel">Avbryt</string>

View File

@@ -48,7 +48,7 @@ along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
<string name="default_checkbox">Używaj tej bazy danych jako domyślnej</string>
<string name="digits">Cyfry</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">Wprowadź nazwę pliku bazy danych:</string>
<string name="select_database_file">Wprowadź nazwę pliku bazy danych:</string>
<string name="entry_accessed">Dostęp do pliku: </string>
<string name="entry_and_or">Wprowadź hasło i/lub plik klucza by uzyskać dostęp do bazy danych:</string>
<string name="entry_cancel">Anuluj</string>

View File

@@ -53,7 +53,7 @@
<string name="digits">Digitos</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft vem com ABSOLUTAMENTE NENHUMA GARANTIA; Este é um software livre, e você está convidado a redistribui-lo sob as condições da GPL versão 2 ou posterior.</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">Digite o nome do arquivo de banco de dados:</string>
<string name="select_database_file">Digite o nome do arquivo de banco de dados:</string>
<string name="entry_accessed">Acessado: </string>
<string name="entry_and_or">Digite uma senha e/ ou entre com o caminho para o arquivo de chaves do banco de dados:</string>
<string name="entry_cancel">Cancelar</string>

View File

@@ -58,7 +58,7 @@
<string name="digits">Dígitos</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft vem com ABSOLUTAMENTE NENHUMA GARANTIA; Este software é livre, e pode redistribui-lo conforme as condições da licença GPL versão 2 ou superior.</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">Introduza o nome do ficheiro da base de dados:</string>
<string name="select_database_file">Introduza o nome do ficheiro da base de dados:</string>
<string name="entry_accessed">Acedido: </string>
<string name="entry_and_or">Introduza a palavra-passe e/ou o ficheiro chave para desbloquear a base de dados:</string>
<string name="entry_cancel">Cancelar</string>

View File

@@ -55,7 +55,7 @@
<string name="digits">Цифры 0…9</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft Программа предоставляется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. Распространяется свободно по лицензии GPL v2 или новее</string>
<string name="ellipsis"></string>
<string name="enter_filename">Путь к базе KeePass:</string>
<string name="select_database_file">Путь к базе KeePass:</string>
<string name="entry_accessed">Доступ:</string>
<string name="entry_and_or">Введите пароль или путь к файлу-ключу:</string>
<string name="entry_cancel">Отмена</string>

View File

@@ -50,7 +50,7 @@
<string name="digits">Číslice</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft použitie Absolútne bez Záruky; Toto je free software, a môžete ho používať pod GPL ver. 2 alebo vyššie.</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">Vložte názov Databázy:</string>
<string name="select_database_file">Vložte názov Databázy:</string>
<string name="entry_accessed">Pristupované: </string>
<string name="entry_and_or">Vložte heslo a / alebo keyfile pre odomknutie databázy:</string>
<string name="entry_cancel">Zrušiť</string>

View File

@@ -57,7 +57,7 @@
<string name="digits">Siffror</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft kommer HELT UTAN GARANTIER; Detta är fri programvara och du är välkommen att distribuera den utifrån villkoren i GPL version 2 eller senare.</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">Ange databasnamn:</string>
<string name="select_database_file">Ange databasnamn:</string>
<string name="entry_accessed">Senast använd: </string>
<string name="entry_and_or">Ange lösenord och/eller nyckelfil för att öppna databasen:</string>
<string name="entry_cancel">Avbryt</string>

View File

@@ -50,7 +50,7 @@
<string name="digits">Цифри</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under the conditions of the GPL version 2 or later.</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">Введіть ім’я бази даних:</string>
<string name="select_database_file">Введіть ім’я бази даних:</string>
<string name="entry_accessed">Доступ: </string>
<string name="entry_and_or">Введіть пароль і/або файл ключа для відкриття бази даних:</string>
<string name="entry_cancel">Відміна</string>

View File

@@ -50,7 +50,7 @@
<string name="digits">数字</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft软件不带有绝对担保是自由软件您可在遵循GPL 2或者更高版本的情况下重新发布。中文简繁体翻译wangkf@gmail.com</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">输入数据库名:</string>
<string name="select_database_file">输入数据库名:</string>
<string name="entry_accessed">访问时间:</string>
<string name="entry_and_or">输入密码和/或一个密钥文件来解锁你的数据库:</string>
<string name="entry_cancel">取消</string>

View File

@@ -50,7 +50,7 @@
<string name="digits">數字</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft軟體不帶有絕對擔保是自由軟體您可在遵循GPL 2或者更高版本的情況下重新發佈。中文簡繁體翻譯wangkf@gmail.com</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">輸入資料庫名:</string>
<string name="select_database_file">輸入資料庫名:</string>
<string name="entry_accessed">訪問時間:</string>
<string name="entry_and_or">輸入密碼和/或一個密鑰檔來解鎖你的資料庫:</string>
<string name="entry_cancel">取消</string>

View File

@@ -39,6 +39,7 @@
<string name="browser_intall_text">File browsing requires the Open Intents File Manager, click below to install it. Due to some quirks in the file manager, browsing may not work correctly, the first time you browse.</string>
<string name="building_search_idx">Building search index&#8230;</string>
<string name="cancel">Cancel</string>
<string name="allow">Allow</string>
<string name="ClearClipboard">Clipboard cleared.</string>
<string name="clipboard_error_title">Clipboard error</string>
<string name="clipboard_error">Some Samsung Android phones have a bug in the clipboard implementation that causes copying from applications to fail. For more details go to:</string>
@@ -57,7 +58,6 @@
<string name="digits">Digits</string>
<string name="disclaimer_formal">KeePass DX \u00A9 %1$d Kunzisoft comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under the conditions of the GPL version 2 or later.</string>
<string name="ellipsis">\u2026</string>
<string name="enter_filename">Enter database filename:</string>
<string name="entry_accessed">Accessed: </string>
<string name="entry_and_or">Enter a password and/or a key file to unlock your database:</string>
<string name="entry_cancel">Cancel</string>
@@ -153,7 +153,8 @@
<string name="no_keys">No entries in the database or group.</string>
<string name="no_results">No search results</string>
<string name="no_url_handler">No handler for this url.</string>
<string name="open_recent">Open recent database :</string>
<string name="select_database_file">Select an existing database :</string>
<string name="open_recent">Open a recent database :</string>
<string name="omitbackup_title">Don\'t search backup entries</string>
<string name="omitbackup_summary">Omit \'Backup\' group from search results (applies to .kdb only)</string>
<string name="pass_filename">KeePass database filename:</string>
@@ -253,6 +254,10 @@
<string name="full_file_path_enable_summary">View the full file path</string>
<string name="recycle_bin_title">Use Recycle Bin</string>
<string name="recycle_bin_summary">Move a group or entry to the Recycle Bin before deleting</string>
<string name="permission_external_storage_rationale_write_database">KeePass DX need external storage permission to write a database</string>
<string name="permission_external_storage_rationale_read_database">KeePass DX need external storage permission to read an URI not provided by a Content Provider</string>
<string name="permission_external_storage_denied">External storage permission denied</string>
<string name="permission_external_storage_never_ask">Can\'t perform the action without external storage permission</string>
<string-array name="clipboard_timeout_options">
<item>5 seconds</item>